автор статьи: Виктор Болбат (Enot) Источник hare.ru
Итак, перед нами стоит задача оптимизации проведения документов при групповомпроведении (в более широком смысле – при автоматическом проведении нескольких документов сразу).
Действия, производимые при проведении документа, можно условно (как мне сейчас удобно) разбить на следующие части (которых может и не быть в реальных документах):
Для оптимизации любой записи данных (в том числе и движений документа) можно воспользоваться механизмом транзакций. Для этого перед стартом групповой обработки выполняется команда НачатьТранзакцию(), а в конце – ЗафиксироватьТранзакцию().Именно так сделано в обработке "ОбработкаДокументов", в случае НЕ монопольного подключения к базе. Приблизительный смысл в том, что в процессе проведения запись данных в базу не производиться, а накапливается в буфере. После окончания проведения, все изменения записываются пачкой.
Эффект такой оптимизации получается очень значительный, производительность можетвырасти в разы.
Есть и недостаток – если документов проводиться очень много (или данных много), то буфер, в котором накапливаются изменения, сам становиться узким местом (деталей внутренней организации транзакций я не знаю, но на практике это выглядит именно так). Оптимальной является следующая тактика: разбить всю массу документов на пакеты (количество документов в пакете подбирается экспериментально,исходя из обЪёма данных, хранимых в документе) и проведение каждого пакетаоформляется в виде транзакции.
Запись проводок (непосредственно запись в журнал проводок) оптимизироватьне получится (за исключением использования транзакций). А вот обновление итогов – запросто. Принцип очень простой. Попробуйте записать проводки в большую базу данных вначале с датой, на пару лет раньше текущей (при этом идет обновление итогов за пару лет), а потом с текущей датой. И посмотрите на производительность.
Возможно несколько вариантов оптимизации:
Запросы r БИ при проведении документов, как правило, выполняются на дату документа (вернее, на "начало" документа). Например, чтобы рассчитать цену, исходя из текущих остатков. Для оптимизации скорости выполнения именно таких запросов (если запрос выполняется на произвольную дату, то ничего сделать не получится) можно воспользоваться рассмотренными выше методами: использование встроенного механизма "Проведение документов" или метода Актуальность()обЪекта БухгалтерскиеИтоги. БИ будут браться из временных данных (текущих итогов), а не рассчитываться с начала периода итогов (квартала).
Кроме того, если используется метод БИ.Рассчитать(ТекущийДокумент()) и,соответственно, далее пользовать функции СКД(), то можно воспользоваться функцией ИтогиАктуальны(),если она возвращает единицу, то выполнять метод БИ.Рассчитать(ТекущийДокумент()) не надо, можно сразу обращаться к итогам. Выигрыш в скорости проведения получается очень большой.
Оптимизация запросов к итогам регистров похожа на оптимизацию запросов к БИ. Если документ двигает ТА, то можно сразу же обращаться к итогам. Это проверяется точно так же, функцией ИтогиАктуальны()
Подведем итог. Что нужно в модулях проведения: