Методика оптимизации программного кода 1С: проведение документов




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

82 Comments

  1. vandalsvq

    (0) правда и ДокументОбъект.Автор.Код тоже не самое оптимальное решение, в таком случае рекомендуется запросом получать значение конкретного поля. А то ведь обращение ДокументОбъект.Автор.(ЛюбойРеквизит) приведет к полному чтению данных ссылки «Автор» и помещению в память на какое-то время

    Reply
  2. capitan

    Очередная статья и очередной велосипед )

    Без обид, методика интересная и имеет право на жизнь.

    На мой взгляд, первопричина зависаний и плохой работы программы 1С — неправильное проектирование информационной системы, а потом уже некачественный программный код модулей этой самой 1С.

    Оптимизировать программный код можно до опупения, но как правило в 90% есть решение выноса части функционала например на нерабочее время и т.п. в том числе и железячные.

    Я конечно 15 лет не изучаю вопросы оптимизации, но загнав tempdb на RAM диск или на SSD если не помещается вы в разы ускорите вашу ситуацию

    Поэтому (пишется вместе) в отрыве от реальных событий сложно сказать про данную методику, тем более она на обычных формах.

    Reply
  3. user-z99999

    (2)

    Складывается впечатление, что вы стараетесь кого-то обидеть своими комментариями.

    Я конечно 15 лет не изучаю вопросы оптимизации, но загнав tempdb на RAM диск или на SSD если не помещается вы в разы ускорите вашу ситуацию

    Очень мощный сервер может спрятать недостаток опыта плохого программиста, иногда.

    Reply
  4. user-z99999

    Автор молодец, почти воспроизвел APDEX «Оценка производительности» из БСП.

    Reply
  5. dmitrydemenew

    (2)На моем текущем месте работы не только tempdb, но и все рабочие базы расположены на SSD. Напоминаю, что все мои рассуждения и выводы относятся исключительно к крупным и высоконагруженным информационным системам. Лично мне сейчас приходится работать с базами, средний размер которых более 500 ГБ и расположены они на топовом серверном оборудовании.

    «Поэтому» исправил, действительно глаза режет, спасибо. Представленная методика не зависит от режима запуска 1С. Во вложении демки для вариантов запуска как в режиме управляемых, так и обычных форм.

    Reply
  6. VmvLer

    практическая ценность тестов в каких-то демо-базах сомнительна.

    я не призываю светить тут учетные данные баз от 500 гб., но только выводов по результатам

    тестирования недостаточно. Необходимы визуальные результаты(статистика) тестов именно по таким базам.

    Reply
  7. dmitrydemenew

    (6)Практическая ценность этих тестов не сомнительна — она отсутствует. Эти демо-базы только для того, чтобы перед принятием решения, использовать или нет описанную методику в рабочем режиме, опробовать ее в тесте и предварительно оценить результат ее работы.

    Reply
  8. capitan

    (3)Я же написал — без обид.

    И обидеть никого не хочу.

    Просто мне например не хватает информации из публикации, а заявление что tempdb — зло я не принимаю.

    Если не слишком удачно скрестить виртуальные таблицы то у вас оптимизатор БД выберет сканирование таблиц, что на базе 500 Гб будет фиаско.

    Отсюда tempdb и вырос в 1С и во всех языках даже чистом SQL он есть

    Reply
  9. dmitrydemenew

    (8) Основные факторы, определяющие мое отношение к этой проблеме таковы:

    1. Реально наблюдаемое огромное количество трудоемких физических операций с жестким диском, в разы превышающих число операций с БД хранения и вызванных обработкой временных данных (обоснование во вложении).

    2. В результате выполнения этих трудоемких операций, что вполне логично при их критическом увеличении, «зависает» 1С и пользователи программы ощущают существенное неудобство.

    3. Я, как специалист, отвечающий за отсутствие этого неудобства, недоволен источником этих неудобств, и был бы рад, если бы использование этого инструмента (ВТ) было всегда технически обоснованным.

    Это исключительно мое личное мнение и я его никому не навязываю.

    Прошу всех не обсуждать и не поднимать тему использования ВТ в рамках этой публикации.

    Reply
  10. user-z99999

    (7)

    Может следующая статья будет про ошибки (время выполнения) в запросах 1с, оптимизация ?

    Т.е. как было и как исправили. Например, самые частые ошибки.

    Reply
  11. dmitrydemenew

    (10)Возможно. 🙂

    Reply
  12. capitan

    (10)А вы бы не хотели то же самое почитать на ИТС ?

    Так сказать из первоисточника

    Reply
  13. user-z99999

    (12)

    Первоисточник -это хорошо.

    Просто любопытно, какие ошибки самые частые у программистов 1с.

    Например, ИТС рекомендует делать индексы на временные таблицы, а по факту — это замедляет работу запроса.

    На ИТС не показано во что превращается запрос 1с на MS SQL сервере, когда поля составные.

    Вот и хочется в жанре ужасы почитать ))

    Ещё,

    фирма 1с придумала объектную модель обращения к данным, чтобы программисты 1с использовали её, а не запросы.

    Т.е. чтобы 1с работала не слишком быстро ))

    Reply
  14. capitan

    (9)дело в том, что скорость работы 1С при правильном написании кода не зависит от размера базы, до тех пор пока не начинается сканирование таблиц разумеется.

    В идеале 2 Гб и 2 Тб базы должны вам информацию с регистра остатков например поднять с одинаковой скоростью тем более с SSD

    И если этого не происходит, то ни фига это не во … таблицах дело

    В принципе в … таблице откуда взяться такому большому объему ? если вы предварительно фильтры накладываете разумеется

    Т.е. надо брать профайлер и долго курить ваши запросы

    Тогда может и не надо будет так скрупулезно замерять результат оптимизации — вы его услышите по крикам ура и брызгам шампанского из бухгалтерии )

    Reply
  15. capitan

    (13)И тут Остапа понесло…

    Ещё, фирма 1с придумала язык 1С чтобы программисты 1с использовали его, а не ассемблер )

    Reply
  16. dmitrydemenew

    (1)Согласен, с точки зрения правильного кода — да, запрос более оптимальное решение. Еще более оптимальное решение — получение этого параметра, к примеру, функцией модуля с повторным использованием возвращаемых значений. Но в рамках демо-примера ни то ни другое не окажет существенного влияния на производительность, т.к. параметр находится за рамками проблемной зоны кода, за границей цикла. Код в примере — всего лишь тестовая нагрузка, не более.

    Reply
  17. dmitrydemenew

    (16) Я считаю платформу 1С — лучшей средой разработки. А язык 1С — лучшим для решения задач по автоматизации любых процессов, и пока что не встречал ни одной задачи, которую бы нельзя было решить быстро, удобно и качественно доступными в 1С средствами .

    Reply
  18. VmvLer

    1. возьмите свою базу в 500 гиг

    2. напишите отчет где есть интенсивное обращение к многим оборотным регистрам, регистрам сведений и пр. с количеством записей в таблицах 100-500КК.

    3. Напишите вариант отчета из пункта 2 с грамотным использованием ВТ в фильтрах виртуальных таблиц

    3.1. Предложите, чтобы 100 пользователей единовременно в течение часа формировали отчет из п.3 с одним и тем же набором «жирных» фильтров

    3.2. Соберите статистику по «загрузке» дисков, памяти, процессора, замеры времени сколько работал SQL и сколько сервер приложений 1С «жевал» то, что отдал SQL и пр.

    4. Напишите вариант отчета из пункта 2 БЕЗ использования ВТ

    4.1. Предложите, чтобы 100 пользователей единовременно в течение другого часа формировали отчет из п.4 с одним и тем же набором «жирных» фильтров как в. 3.

    4.2. Соберите статистику по «загрузке» дисков, памяти, процессора замеры времени сколько работал SQL и сколько сервер приложений 1С «жевал» то, что отдал SQL и пр.

    5. Сделайте сравнительный анализ п.3.2 — 4.2.

    Только после сверки можно делать выводы и пенять на код.

    Reply
  19. user1180228

    (19) Тема интересная но так «просто» не решаемая. Для оценки производительности нужно собирать стенд и там проводить исследование производительности. Я так понял, что никто этого еще не делал.

    Согласен с автором статьи, что неоптимизированный код влияет на производительность.

    Reply
  20. dmitrydemenew

    (19)предложенная методика как раз содержит инструменты, позволяющие выполнить Ваш алгоритм без издевательств над нашими пользователями — достаточно запустить необходимое количество нагрузочных сессий с выполнением необходимых алгоритмов. Предлагаю Вам воспользоваться предложенными инструментами и поделиться результатами исследований — это будет лучшим доказательством Вашей правоты.

    Reply
  21. starik-2005
    Результат = СтрШаблон(«%1%2%3%4%5», Результат, СокрЛП(КодАвтора), Лев(КодАвтора,1), Сред(КодАвтора, 2, 1), Прав(КодАвтора,1));
    Reply
  22. 3vs

    «К публикации приложены демонстрационные базы для режимов обычного и управляемого приложения на платформе 1С:Предприятие 8.3 (8.3.9.2033).»

    А БП3 уже требует платформы

    «Внимание! Текущая версия конфигурации «Бухгалтерия предприятия» предназначена для использования с версией технологической платформы 1С:Предприятие 8 не ниже 8.3.12.1685.»

    Не подустарела информация?

    И, не пора ли уже предложить 1С добавить поддержку в сервере СУБД в оперативной памяти, таких как СУБД для данных в оперативной памяти, обеспечивающие их сохранность: Redis, Aerospike, Tarantool?

    А то, с каждым обновлением платформы, базы работают всё медленней…

    Reply
  23. dmitrydemenew

    (24) В публикации описана методика, которую можно применить в любой конфигурации на любой платформе 1С V8.x.

    Reply
  24. PerlAmutor

    (23) Тогда уж:

    КодАвтора = СокрЛП(ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(ДокументОбъект.Автор, «Код»));
    Шаблон = «%1%2%3%4%5»;
    ЛевКодАвтора = Лев(КодАвтора);
    СредКодАвтора = Сред(КодАвтора, 2, 1);
    ПравКодАвтора = Прав(КодАвтора, 1);
    Для а = 1 По 1000 Цикл
    Результат = СтрШаблон(Шаблон, Результат, КодАвтора, ЛевКодАвтора, СредКодАвтора, ПравКодАвтора);
    КонецЦикла;
    

    Показать

    Reply
  25. 3vs

    (25)Понятно.

    Reply
  26. GreenDragon

    (16) И на что только люди не пойдут, чтобы не набирать машинный код сразу…

    Reply
  27. starik-2005

    (26) сам код как я понял у автора демонстрационный. Правильнокодавтора (или что иное) брать из результата запроса, а не из ссылки. Здесь автор не учел, что платформа ссылки кеширует. То, что он называет здесь оптимизацией — это просто придуманная проблема, которая красиво отобразилась в топе длительных операций. Статья о том, как искать проблему, а не о том, как ее решать. Ценность данного произведения отсюда ИМХО мала предельно

    Reply
  28. A_Max

    (20) Всё как обычно 80/20 (А в нашем случае я думаю выйдет даже 90/10). Т.е. для реализации подавляющего большинства задач мощь ООП с наследованием и полиморфизмами не нужны. И, мало этого, при их наличии провоцировало бы неокрепшии умы на творческие экзерцисы которые было бы нетривиально сопровождать.

    Частенько задумываюсь, что хотелось бы иметь полноценные свойства объектов с обработчиками get/set. Но опять таки это плюшки и «синтаксический сахар».

    Reply
  29. A_Max

    (23) Да вообще когда уже полноценную форматную строку сделают printf 🙁

    Reply
  30. capitan

    (28)Это еще что. На что люди пошли чтобы безгранично коннектиться посредством блюпуп и вифи.

    А как хорошо было раньше.

    Один пpогpаммеp пpишел в гости к дpугому. Сидят, пиво попивают. Тут на кухню заваливает огpомный сеpый котяpа.

    — Это мой кот. Зовут Модем.

    — Почему Модем?

    — Смотpи. — беpет веник, тычет в кота. — Модем! Коннект!

    (Кот): — Шшшшшшшшш…

    Reply
  31. GreenDragon

    (9) Судя по вашему скрину, время ответа по вашим выделенным строкам 12 и 14 мс. Вы где-то увидели проблему? То, что длина очереди 5, практически ни о чём не говорит.

    Процитирую статью с sqlcom.ru

    Правило, по которому глубина очереди не должна для одного диска превышать 2 (и другие сопутствующие признаки) не соотносятся напрямую с глубиной очереди, определённой по счётчикам производительности операционной системы. Таким образом, получило распространение несколько иное правило, гласящие, что задержки при обращении к диску не должны превышать примерно 10 – 20 ms, что было вычислено из прежнего правила глубины очереди 2 на диск (вероятно, для дисков с 7200/10000 об/мин), причём, без учёта описанных выше дополнительных признаков.
    Reply
  32. dmitrydemenew

    (33)Вот только длина очереди не 5, а 50…

    Reply
  33. Serg O.

    во многих конфигурациях — есть обработка «Групповая обработка справочников и документов»

    простейшее «нагрузочное» тестирование можно аналогично сделать…

    однако, это «чистое» движение (проведение) — не открывая формы документа !? и не возвращаясь в список документов… в котором может быть куча подзапросов и «авторасчетов», расцветки и т.п.

    стандартный замер — прекрасная вещь

    и в дополнение к нему можно использовать УниверсальныеПодборИОбработкаОбъектов.epf

    с диска ИТС — в ней кроме отборов можно делать «произвольный алгоритм»… в том числе открывать и закрывать формы… и что угодно делать кроме этого

    ******* автору для его разработки (увидел в листинге) *****

    1) Таймер() — скорее всего какая-то «своя» функция… лучше заменить на 1С-кую ТекущаяУниверсальнаяДатаВМиллисекундах() — даже в 8.2 есть (с 8.2.19.83 версии точно)

    2) вывод…из просто сообщить()… лучше сделать запись в текстовую переменную

    а потом её можно и сообщить() и в Текстовый / HTML-Файл (для красоты)… сохранять

    3) хорошо оформлена статья, спасибо, удобно читать было

    +

    Reply
  34. itmind

    Очередная статья, в которой говорится, что временные таблицы — зло. Но у меня другой пример.

    Штатный отчет Валовая прибыль из УПП 1.3 (УТ 10.3). Простой запрос, где левым соединением выборка из таблицы себестоимости.

    Вставляем этот запрос в СКД один в один, запускаем на базе > 600Гб и получаем зависания на 2-3 часа (при этом иногда выполняется быстро, за несколько секунд). При этом сам запрос, не в СКД, выполняется очень быстро.

    Переписываем запрос в СКД на временные таблицы и все работает быстро, никаких зависаний. Предполагаю, что оптимизатор SQL лучше работает на временных таблицах.

    Исходя из данной проблемы можно сказать, что вложенные запросы в соединениях еще большее зло, чем временные таблицы.

    Reply
  35. dmitrydemenew

    (36)В этой статье нет ни слова о том, что ВТ — зло. Единственное назначение публикации — описание одного из множества способов анализа и оценки оптимизации программного кода модулей проведения документов. С помощью предложенной методики вы можете сами объективно оценить ту роль (позитивную или негативную), которую играет использование ВТ в проблемных местах Вашей информационной системы.

    Reply
  36. asved.ru

    (9)

    Прошу всех не обсуждать и не поднимать тему использования ВТ в рамках этой публикации.

    В таком случае не следовало рекомендовать отказ от использования временных таблиц. Сейчас же получается, что Вы даете откровенно вредную рекомендацию и просите ее не обсуждать. В джентльменском обществе за такое канделябром бьют 🙂

    Reply
  37. dmitrydemenew

    (38)В публикации нет рекомендаций отказа от временных таблиц, есть лишь рекомендация использовать этот инструмент обдумано и технически обосновано.

    Reply
  38. ELInfinito

    (36) Запрос в СКД может работать иначе, чем исполнение в консоли запросов или просто кодом.

    Причина проста — СКД трансформирует запрос по неким своим принципам и на сервер улетает совсем не то, что написали вы в наборе/наборах данных .

    Далеко не факт, что применение временных таблиц поможет…но я не говорю, что это зло ) В контексте 1С их здравое применение решает. Если временные таблицы применяет неофит, натыкивая их везде где надо и не надо. да еще и индексируя все подряд…это конечно зло )

    Reply
  39. TODD22

    (39)

    есть лишь рекомендация использовать этот инструмент обдумано и технически обосновано.

    Но про техническое обоснование ни слова… про обдуманность то же…

    Reply
  40. starik-2005

    (26) тогда уж:

    КодАвтора = СокрЛП(ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(ДокументОбъект.Автор, «Код»));
    ЛевКодАвтора = Лев(КодАвтора);
    СредКодАвтора = Сред(КодАвтора, 2, 1);
    ПравКодАвтора = Прав(КодАвтора, 1);
    ИтогоКодАвтора = СтрШаблон(«%1%2%3%4», КодАвтора, ЛевКодАвтора, СредКодАвтора, ПравКодАвтора);
    Для а = 1 По 1000 Цикл
    Результат = СтрШаблон(«%1%2», Результат, ИтогоКодАвтора);
    КонецЦикла;
    Reply
  41. dmitrydemenew

    (41) Повторюсь: предложенная методика дет возможность измерить обоснованность (с точки зрения производительности) использования любых способов построения программного кода в цифрах. Все мои выводы основаны исключительно на результатах этих измерений в информационных системах, которые мне приходилось оптимизировать.

    Reply
  42. starik-2005

    (41) так статья не ставит цель рассказать, что такое обоснованность и обдуманность — она для этого по формату не пройдет на сайт, ибо модератор не сможет дочитать произведение, в полной мере раскрывающее вышеописанное, до конца. Есть совершенный код Макконнелла, есть труды Дейкстры, Вирта, Кнута — не нужно тут про обоснованность и обдуманность, ибо читающие должны быть с приведенными литературными произведениями как минимум ознакомлены.

    Другое дело, что автор статьи не привел список литературы, которая могла бы помочь обосновать и обдумать. В те времена, когда пионеры были большими, пруфы даже в школьных докладах были. Но в российской действительности указать ссылки на дополнительные или используемые материалы редко кто способен (видимо, кризис высшего образования), поэтому я современную русскую литературу по бизнесу и прочему стараюсь не читать.

    Reply
  43. TODD22

    (29)

    Статья о том, как искать проблему, а не о том, как ее решать.

    Как пользоваться замером производительности.

    Reply
  44. w.r.

    (17)

    (1)Согласен, с точки зрения правильного кода — да, запрос более оптимальное решение. Еще более оптимальное решение — получение этого параметра, к примеру, функцией модуля с повторным использованием возвращаемых значений. Но в рамках демо-примера ни то ни другое не окажет существенного влияния на производительность, т.к. параметр находится за рамками проблемной зоны кода, за границей цикла. Код в примере — всего лишь тестовая нагрузка, не более.

    С модлями с повторным использованием лучше не играться. Если реквизит код или номер документа — еще можно использовать и то с опаской. Если это любой другой реквизит, который с высокой вероятностью может быть исправлен пользователем во время сеанса — то будут возвращаться устаревшие данные. Поэтому лучше всего — это запрос конкретных реквизитов

    Reply
  45. buganov

    (15)

    При написании запросов не следует использовать соединения с подзапросами. Следует соединять друг с другом только объекты метаданных или временные таблицы. Если запрос использует соединения с подзапросами, то его следует переписать с использованием временных таблиц.

    кэп, а Вы пробовали загнать несколько миллионов записей во временную таблицу? Или не так, а что будет, если сделать соединение с подзапросом, где на одном из уровней будет таблица данных? Что в таком случае покажет план запроса? Вот долго я ломал голову, а с чего это вендор, у которого есть экзамен Эксперт по технологическим вопросам такие советы дает. Оказалось просто. Постгре не умеет работать с подзапросами, потому и MS SQL досталось на орехи.

    Временные таблицы не зло, это умеренное зло, если в конкретно данном случае, в конкретно данной задаче они обоснованы и производительнее, чем подзапрос.

    Reply
  46. buganov

    (20) Вы тут лукавите, классы есть, достаточно взглянуть на дерево метаданных.

    Про наследование. А для чего оно здесь? Что Вы собираетесь наследовать и для чего?

    Плохо Вы изучаете 1С, если до сих пор не поняли, что этот «прошлый век» выполняет функции автоматизации бизнеса, и справляется в этом очень даже хорошо. И без наследования и смс.

    Вот банальный пример. Нужно написать небольшую автоматизацию, скажем, киоска.

    Даны два ЯП — 1С и любой тру на Ваш выбор. Как Вы думаете, кто быстрее автоматизирует киоск, тру или «парапрограммист» 1С? Ответ очевиден, и микроскопом можно гвоздь забить, но зачем?

    Reply
  47. buganov

    (36) а этот запрос Вы берете прямо из СКД, который она сама развернула или то, что пишете в конструкторе?

    СКД иногда пихает отборы так криво, что образуются дополнительные соединения с таблицами, отсюда и просадка.

    Reply
  48. acanta

    (48) итак мы вернулись к тому с чего начали. Конкуренция за автоматизацию киосков это хорошо.

    Вроде как раньше узким местом была стоимость компьютера с 256 мб памяти. Сегодня- наличие мобильной связи на телефоне с 5 Гб оперативки.

    Reply
  49. capitan

    (47)Честно скажу я с трудом могу представить задачу в которой нужно загнать несколько миллионов записей во временную таблицу.

    План запроса вероятно покажет фулл скан с таблицей из которой у вас во временную с отборами набралось несколько миллионов записей

    Не понял вопроса.

    Что касается рекомендации — она намного раньше дружбы с постгри появилась.

    Да и при таком масштабе задач опять же только по моему мнению уже не до экономии на лицензиях

    Reply
  50. buganov

    (51)Элементарно, Ватсон, продажи за месяц в нескольких разрезах дают огромный поток данных. И, если обороты загнать во временную, то пользовательский кеш сразу выталкивается наружу.

    Вопрос был в том, что Вы лично смотрели, как ведет высоконагруженная система с запросом с временной таблицей и подзапросом?

    По поводу рекомендации, да, раньше, но и MS SQL раньше не очень дружил с подзапросами

    Reply
  51. buganov

    (50) Я совсем не понял, что Вы хотели этим сказать

    Reply
  52. dmurk

    На текущем этапе развития (для меня) статья не актуальна. Пару замечаний

    — Получение в коде временных отметок имеет крайне высокую гранулярность, на моем тестовом сервере это 43 миллисекунды, что делает неэффективным подобный механизм на измерениях оптимизированных запросов

    — Погрешность отклонения в замерах производительности может составлять 200 миллисекунд

    — Параллельные способы выполнения кода в кластере 1С могут не только снижать скорость выполнения отдельных строк кода, но и повышать скорость обмена данными между модулями объектов и общими модулями

    Всем успехов!

    Reply
  53. dmurk

    (37) И вообще, индексация временных таблиц творит чудеса ))

    Reply
  54. capitan

    (53)Я что то начал терять нить вашего возмущения.

    Вы постом раньше были за подзапросы, а в этом посте вроде против.

    Миллиона записей о продажах за месяц у меня нет

    Reply
  55. user1180228

    (48) Быстрее всего я напишу на BSScript, похожая на 1С система, только в разы продвинутая. 1С — это что? — Готовые объекты, которые заточены на выполнение каких то стандартных операций. Как только отступление — танцы с бубнами и никакой оптимизации. Да много COM приложений. А без COM и ни туды и ни сюды… Хотите нормальный функционал — пишите COM, а это очень увеличивает время разработки. 1С есть куда развиваться.

    По поводу бизнеса также не согласен, бизнес стонет от «тормозов» 1C.

    Reply
  56. buganov

    (57)Ок, давайте представим, что Вы сделали свою шикарную систему автоматизации киоска. Все работает отлично и гораздо быстрее, чем 1С. И вот, в один прекрасный момент у Вашего заказчика наступил момент, когда бизнес вырос с этапа счетов до калькулятора. Вы будете пару месяцев дорабатывать свою систему и даже что то получится на выходе. Не ERP, конечно, но уже и не эксель. И тут Вы поняли, что жизнь проживается зря, а внутри рвется художник, и вообще, программирование для других, Ваше же дело жизни — руководить. Скажем, менеджером проектов где-нибудь в Италии, на берегу моря. И что делать Вашему заказчику? Правильно. Искать специалистов. Но, как Вы думаете, легко ему это будет сделать? Нет. Легко масштабировать свою систему? Тоже нет. Если из УТ можно довольно просто эволюционировать в комплексную, а там в ERP, то Вашими усилиями будет убита сама идея автоматизировать бизнес, который, к слову, далеко не глупый и выбирает 1С не просто, что где-то слышал, а как возможность сделать свою систему, при этом без слишком высоких трудозатрат на поиски программиста. Это так, лирика.

    По поводу отступлений. А бизнесу оно надо? Я успел поработать с огромным количеством компаний и, представьте себе, только пару раз требовалось изобрести что то этакое, но и тем же комом решалось. И то, потому что другие приложения чаще всего не дают апи для работы из вне.

    По поводу стонов бизнеса, то тут банально. Легкий вход в профессию плодит недоучек, которые не хотят разбираться, а как, собственно, все устроено и пишут крайне вредный для производительности код, который впоследствии и вызывает стоны.

    Да, 1С есть куда развиваться, ИЧСХ она и делает.

    Reply
  57. starik-2005

    (58)

    Правильно. Искать специалистов. Но, как Вы думаете, легко ему это будет сделать? Нет. Легко масштабировать свою систему? Тоже нет.

    Вот! Золотые слова. Поэтому берете астрального питонщика или PHP-шника и не мучаетесь всякими БССкриптами или чем-там-еще. И никакого 1С, никаких лицензий, дешевые разработчики, которых в западном индостане девать некуда, масштабируемость отличная — хоть киоск, хоть фэйсбук (на пентиуме 1-м даже), …

    Reply
  58. buganov

    (59)PHPшники ох как дорого стоят хорошие)

    Reply
  59. starik-2005

    (60)

    PHPшники ох как дорого стоят хорошие)

    Индусы? Да они за тарелку супа готовы душу продать! )))

    Reply
  60. dmurk

    (14) Не согласен с вами. Зависимость есть, хотя и нелинейная

    1. Каждое увеличение размера индекса в два раза добавляет 1 шаг к поиску строки в бинарном индексе, что частично нивелируется статистикой

    2. Увеличение размера индексов повышает скорость устаревания статистики после выполнения операции UPDATE STATISTICS

    3. Ваше утверждение упирается в невозможность размещения индексов в ОЗУ после определенного объема базы

    Reply
  61. dmurk

    (38) Это зависит от того, кто был на прикупе ))

    Reply
  62. dmurk

    (43) Дмитрий, дам совет.

    — Не рассматривайте время в миллисекундах, получаемое средствами 1С как реальный показатель. На самом деле, существует дискретный шаг, внутри которого время выполнения в миллисекундах 1С не измеряет. Например, 56 миллисекунд. От встроенного таймера 1С вы вряд ли получите значение 0.008 секунды, так как данный показатель будет округлен вниз, до нуля, а, соответственно, значения близкие к первой ступени дискретности округляются вверх, завышая время измерения. Соответственно, чтение цифр в вашем примере — «минимальное время», «максимальное время» весьма условно. Я пробовал добиться более высокой точности измерений, изменяя настройку в БИОС High Precision Timer, но на 1С она не влияет, только на операционку. Следовательно, как минимум, требуется внешняя компонента замера таймингов, чтобы на подобные цифры обращать внимание.

    — Кроме того, необходимо учитывать важность количества потоков в кластере 1С — достаточно просто проанализировать, крутится ваш тестовый стенд в изолированном потоке, или совместно с вашим тестом обрабатываются дополнительные. Серверный процесс в кластере поочередно исполняет команды из нескольких клиентских соединений, которые находятся на обслуживании у этого процесса, что вносит дополнительный разброс измерений

    Reply
  63. dmurk

    (13) Индексация временных таблиц замедляет работу запроса:

    — ровно настолько, насколько неправильно выбрана модель использования оборудования

    — ровно настолько, насколько вы зря решили использовать индексы

    Если, например, разместить tempdb на USB флэшке с интерфейсом USB 1.1, то безусловно индексирование ВТ не нужно никогда ))

    Reply
  64. capitan

    (62)А вы посчитайте эту нелинейность.

    Индекс — это бинарное дерево, насколько оно вырастет при увеличении данных в 2 раза — на 1 шаг

    Нормально построенный индекс — он небольшого размера, поэтому индексы и появились.

    Т.е. если у вас индекс растет такими же темпами как и данные — у вас неправильные индексы

    Reply
  65. dmurk

    (66) Безусловно условно одинаковая производительность СУБД сохраняется какое-то время, но это не значит что так бдет на любом объеме данных

    Reply
  66. vovan_victory

    (36)

    получаем зависания на 2-3 часа (при этом иногда выполняется быстро, за несколько секунд).

    предположу, что в запросе используются вложенные запросы. Отсюда и разное время выполнения. Вложенный запрос — это , по сути, динамический список. При использовании вложенных запросов оптимизатор запроса не сможет построить оптимальный план. Отсюда и разное время выполнения при каждом формировании отчета.

    (36)

    Переписываем запрос в СКД на временные таблицы и все работает быстро, никаких зависаний.

    ожидаемое поведение системы. Отказались от динамического списка в пользу конкретного набора данных, и , «результат, так сказать, на лице»

    Reply
  67. muskul

    (61)судя по типовым решениям они сейчас 1с и пилят

    Reply
  68. Артано

    (32) Зухелем кота звали.

    Reply
  69. strelec13

    (44)

    я современную русскую литературу по бизнесу и прочему стараюсь не читать.

    Надеюсь хотя бы русскую старую или советскую литературу по бизнесу читаете, если современную российскую избегаете. Есть большая перспектива не читать современную литературу по бизнесу из других стран, начиная со стран Африки, а не только российскую.

    Reply
  70. starik-2005

    (71)

    Надеюсь хотя бы русскую старую или советскую литературу по бизнесу читаете

    А с чем связана Ваша «надежда»? Советская литература по «бизнесу» — это какая? Ну и старая, собственно, тоже… Про Остапа Бендера что-ли? )))

    Я читаю западную литературу (если говорить о бизнесе и экономике). Она в данном вопросе куда качественнее. Из старой Адама Смита, Карла Маркса, Фридриха Энгельса, Эриха Фромма (не совсем о бизнесе, но тоже не зря написано) ну и многих других. Из современных тоже хватает талантливых авторов, если на вскидку, то, например, Джон Нэш, Теодор Шульц, — но это, конечно, нобелевские лауреаты. А из российского если только диссертации докторские по экономике читать, которые не являются плагиатом. Кто там у нас в РФ получил какую-нить престижную мировую премию по экономике за последнее время? Никто? Как жаль…

    Reply
  71. strelec13

    (72)

    Советская литература по «бизнесу» — это какая? Ну и старая, собственно, тоже… Про Остапа Бендера что-ли? )))

    Спасибо за идею. Надо будет почитать советскую или старую литературу про бизнес в лице Остапа Бендера. На западе поучится у наших Остапов …

    Reply
  72. starik-2005

    (73)

    На западе поучится у наших Остапов

    Мне, вот, в целом ответ не ясен. Кто «поучится» у наших Остапов на западе? Или имелось ввиду «поучиться у наших Остапов на Западе», т.е. поехать на Запад (в соответствующие страны, поэтому с большой буквы) и там взять Ильфа и Петрова, чтобы поучиться бизнесу? С какой целью?

    Reply
  73. strelec13

    (74)

    поучиться

    Подучу грамматику, чтобы потом Вам был ответ ясен.

    Reply
  74. starik-2005

    (75)

    чтобы потом Вам был ответ ясен

    Тогда зачем сейчас его писать? Ведь можно потом это сделать! Кстати, с такими мыслями можно и самому написать что-нибудь про бизнес, чтобы за державу не было так обидно.Как Вы считаете, сможете? 😉

    Reply
  75. strelec13

    (76)

    Как Вы считаете, сможете? 😉

    Без ваших западных знаний и без нобелевского опыта нет. Разве что подглядеть ваши статьи со сносками на приличную литературу, если есть. Как Вы считаете? Глядишь и обоим нам не будет обидно за державу.

    Reply
  76. starik-2005

    (77) предлагаете в соавторы? А тема какая? Есть уже план публикации?

    Reply
  77. dachnik

    (61)мне кажется, индусы уже давно подороже отечественных быдло-кодеров будут…

    Reply
  78. starik-2005

    (79) индусы бывают разные. Не стоит путать брахмана и биндера кнопки «ок»…

    Reply
  79. acanta

    Китайцы строят чайна-тауны в любом городе, а Остап раз убит подельником, два ограблен на границе. И вся история.

    Красные приходят — грабят, белые приходят — грабят.

    Может китайцы просто не жалуются, в отличие от индейцев ( они конечно в курсе что их проблемы шерифов не волнуют, но вот весь мир например, сочувствует…)

    Reply
  80. strelec13

    (78)это вопрос ко мне чайнику? А Вам слабо? Знающему и опытному любитедю читать западную литературу по бизнесу. Вы меня разочаровываете. Я уже было поверил, что и в заправду разбираетесь в литературной теме о бизнесе. А Вы надеетесь и спрашиваете у чайника. Видать я не по адресу написал. Надеюсь у Вас хватит профессиональной гордости. Не связываться больше с неграмотный неучем.

    Reply
  81. starik-2005

    (82) т.е. вот так сразу при первой сложности в кусты? Вам должно быть стыдно)))

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *