Почему документы прошлых периодов проводятся очень долго в 1С:Бухгалтерия 3.0 и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Архитектурная причина: каскадный пересчет таблиц итогов

Главная причина замедления при проведении «задним числом» кроется в механизме хранения итогов регистров накопления и бухгалтерии платформы 1С. Разберем этот механизм детально:

  1. Помесячные срезы итогов. Платформа 1С хранит итоги в виде периодических срезов (как правило, на начало каждого месяца) в специальных таблицах итогов СУБД.
  2. Обновление итогов вперед по временной шкале. Когда документ проводится текущей датой, СУБД делает запись в таблицу движений и обновляет итоги только за текущий период. Но если мы проводим документ, например, за октябрь 2013 года при установленной границе рассчитанных итогов на 2018 год, СУБД вынуждена каскадно пересчитывать и перезаписывать итоги для каждой комбинации аналитики за каждый месяц вперед до конечной точки (более 50–60 месяцев).
  3. Множественные блокировки и дисковые операции. При проведении сотен документов прошлых лет каскадный пересчет всех последующих месяцев вызывает колоссальную нагрузку на дисковую подсистему и процессор сервера СУБД, приводя к длительным блокировкам таблиц итогов.

Способ 1. Сдвиг периода рассчитанных итогов к дате проведения

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

Для этого воспользуемся встроенными средствами встроенного языка 1С. Разберем по шагам, как программно сдвинуть дату рассчитанных итогов перед проведением документов и последовательно продвигать ее вперед:


// Пример смещения границы итогов для регистров бухгалтерии и накопления
ГраницаИтогов = НачалоМесяца(Дата("20131001"));

// Устанавливаем границу итогов для регистра бухгалтерии
РегистрыБухгалтерии.Хозрасчетный.УстановитьПериодРассчитанныхИтогов(ГраницаИтогов);

// Устанавливаем границу для регистров накопления (при необходимости)
Для Каждого МенеджерРегистра Из РегистрыНакопления Цикл
    МенеджерРегистра.УстановитьПериодРассчитанныхИтогов(ГраницаИтогов);
КонецЦикла;

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

Способ 2. Временное отключение итогов на период пакетной загрузки

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

Посмотрим на пример кода для отключения и последующего пересчета итогов:


// Шаг 1. Отключаем использование итогов перед массовым проведением
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);
Для Каждого МенеджерРегистра Из РегистрыНакопления Цикл
    МенеджерРегистра.УстановитьИспользованиеИтогов(Ложь);
КонецЦикла;

// Шаг 2. Выполняем проведение массива документов
// ... Код пакетного проведения документов ...

// Шаг 3. Включаем использование итогов обратно
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Истина);
Для Каждого МенеджерРегистра Из РегистрыНакопления Цикл
    МенеджерРегистра.УстановитьИспользованиеИтогов(Истина);
КонецЦикла;

// Шаг 4. Пересчитываем итоги за весь период единой операцией
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтогиЗаПериод(Дата("20130101"), КонецДня(ТекущаяДата()));

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

Способ 3. Обслуживание индексов и статистики в СУБД

После масштабного переноса документов и конвертации конфигурации структура таблиц изменяется, а статистика оптимизатора СУБД (например, MS SQL Server) оказывается неактуальной. В результате запросы к таблицам движений и итогов выполняются по неоптимальным планам выполнения.

Разберем регламентные действия на стороне СУБД, которые необходимо выполнить:

  1. Обновление статистики. Выполним команду sp_updatestats в среде SQL Server Management Studio для перестроения статистики распределения данных.
  2. Реиндексация таблиц. Проведем операцию ALTER INDEX ALL ON ... REBUILD для основных таблиц движений и итогов регистров конфигурации (служебные таблицы _AccRg*, _AccumRegTotals* и другие).
  3. Тестирование и исправление в Конфигураторе. Запустим стандартную процедуру «Тестирование и исправление информационной базы» с выбранными опциями «Реиндексация таблиц информационной базы» и «Пересчет итогов».

Способ 4. Оптимизация параметров типовых документов в 1С:Бухгалтерия

В конфигурации 1С:Бухгалтерия предприятия 3.0 при проведении документов реализации и поступления выполняются тяжелые алгоритмы зачета авансов и контроля взаиморасчетов. Проанализируем дополнительные настройки, способные существенно ускорить процесс проведения:

  1. Режим зачета авансов. Если взаиморасчеты были полностью сформированы в исходной базе (например, 1С 7.7), в документах целесообразно установить реквизит зачета авансов в значение «Не зачитывать» либо передавать готовые проводки напрямую, чтобы избежать повторного анализа всей цепочки расчетов по счетам 60 и 62.
  2. Отключение фоновых заданий. На время пакетного проведения рекомендуется временно отключить регламентные задания (фоновая актуализация расчетов, слияние индексов полнотекстового поиска, автоматическое закрытие месяца).

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

← На главную