При переносе данных или пакетном перепроведении документов за старые периоды (например, за прошлые годы) разработчики и администраторы баз данных часто сталкиваются с резким падением производительности: проведение одного документа реализации или поступления может занимать десятки секунд, в то время как проведение того же документа текущей датой происходит практически мгновенно. Проанализируем, почему возникает такая ситуация на уровне архитектуры платформы 1С:Предприятие, и рассмотрим практические способы решения этой проблемы.
Главная причина замедления при проведении «задним числом» кроется в механизме хранения итогов регистров накопления и бухгалтерии платформы 1С. Разберем этот механизм детально:
Рассмотрим наиболее корректный способ оптимизации при массовом проведении исторических документов. Вместо того чтобы обновлять итоги на пять лет вперед для каждого документа, сдвинем границу рассчитанных итогов назад, ближе к периоду проводимых документов.
Для этого воспользуемся встроенными средствами встроенного языка 1С. Разберем по шагам, как программно сдвинуть дату рассчитанных итогов перед проведением документов и последовательно продвигать ее вперед:
// Пример смещения границы итогов для регистров бухгалтерии и накопления
ГраницаИтогов = НачалоМесяца(Дата("20131001"));
// Устанавливаем границу итогов для регистра бухгалтерии
РегистрыБухгалтерии.Хозрасчетный.УстановитьПериодРассчитанныхИтогов(ГраницаИтогов);
// Устанавливаем границу для регистров накопления (при необходимости)
Для Каждого МенеджерРегистра Из РегистрыНакопления Цикл
МенеджерРегистра.УстановитьПериодРассчитанныхИтогов(ГраницаИтогов);
КонецЦикла;
Выполняя проведение помесячно и передвигая дату рассчитанных итогов шаг за шагом с помощью метода УстановитьПериодРассчитанныхИтогов(), мы сводим объем каскадных вычислений к минимуму.
Если документы переносятся пакетом и не требуют оперативного контроля остатков в момент проведения (или контроль осуществляется на стороне внешней обработки), эффективным решением является полное отключение использования итогов на время обработки данных.
Посмотрим на пример кода для отключения и последующего пересчета итогов:
// Шаг 1. Отключаем использование итогов перед массовым проведением
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);
Для Каждого МенеджерРегистра Из РегистрыНакопления Цикл
МенеджерРегистра.УстановитьИспользованиеИтогов(Ложь);
КонецЦикла;
// Шаг 2. Выполняем проведение массива документов
// ... Код пакетного проведения документов ...
// Шаг 3. Включаем использование итогов обратно
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Истина);
Для Каждого МенеджерРегистра Из РегистрыНакопления Цикл
МенеджерРегистра.УстановитьИспользованиеИтогов(Истина);
КонецЦикла;
// Шаг 4. Пересчитываем итоги за весь период единой операцией
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтогиЗаПериод(Дата("20130101"), КонецДня(ТекущаяДата()));
Важное ограничение: при отключенных итогах с помощью УстановитьИспользованиеИтогов(Ложь) виртуальные таблицы остатков рассчитываются путем прямого сканирования таблицы движений с начала времен. Если в коде документа выполняется проверка остатков, этот подход следует применять с осторожностью либо отдавать предпочтение способу со сдвигом периода рассчитанных итогов.
После масштабного переноса документов и конвертации конфигурации структура таблиц изменяется, а статистика оптимизатора СУБД (например, MS SQL Server) оказывается неактуальной. В результате запросы к таблицам движений и итогов выполняются по неоптимальным планам выполнения.
Разберем регламентные действия на стороне СУБД, которые необходимо выполнить:
sp_updatestats в среде SQL Server Management Studio для перестроения статистики распределения данных.ALTER INDEX ALL ON ... REBUILD для основных таблиц движений и итогов регистров конфигурации (служебные таблицы _AccRg*, _AccumRegTotals* и другие).В конфигурации 1С:Бухгалтерия предприятия 3.0 при проведении документов реализации и поступления выполняются тяжелые алгоритмы зачета авансов и контроля взаиморасчетов. Проанализируем дополнительные настройки, способные существенно ускорить процесс проведения:
Комплексное применение сдвига границы рассчитанных итогов вместе с регламентным обслуживанием СУБД позволяет сократить время проведения документов прошлых лет с десятков секунд до долей секунды на каждый документ.