При разработке учетных механизмов разработчики часто сталкиваются с существенным замедлением записи проводок в регистр бухгалтерии, особенно при массовом формировании движений или проведении документов задним числом. Проанализируем, почему возникает эта проблема, как устроена физическая запись в таблицы регистра и какие методы позволяют максимально ускорить данный процесс.
Выясним, какие факторы сильнее всего влияют на скорость формирования движений:
TRef) и ссылка (RRef). Поиск, индексация и обновление таблиц остатков и оборотов по составным колонкам требуют значительно больше ресурсов СУБД, чем работа с жестко типизированной ссылкой на конкретный справочник.Разберем программные ошибки в коде записи движений. Создавать отдельный объект СоздатьНаборЗаписей() и вызывать метод Записать() внутри цикла или вручную в процедуре ОбработкаПроведения не рекомендуется. Правильнее использовать стандартную коллекцию движений документа и отдавать управление транзакции проведения платформе.
Посмотрим на пример правильного формирования движений в модуле документа:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Включаем признак записи движений регистра
Движения.Хозрасчетный.Записывать = Истина;
// Очищаем старые движения при необходимости
Движения.Хозрасчетный.Очистить();
Для Каждого Стр Из ТаблицаНачисления Цикл
Движ = Движения.Хозрасчетный.Добавить();
Движ.Период = Дата;
Движ.Организация = Стр.Организация;
Движ.СчетДт = Стр.СчетЗатрат;
Движ.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделение] = Стр.СтруктурнаяЕдиница;
Движ.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ОсновныеСредства] = Стр.ВнеоборотныйАктив;
Движ.СчетКт = Стр.СчетУчета;
Движ.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделение] = Стр.СтруктурнаяЕдиница;
Движ.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ОсновныеСредства] = Стр.ВнеоборотныйАктив;
Движ.Сумма = Стр.Сумма;
КонецЦикла;
// Метод Движения.Хозрасчетный.Записать() вручную не вызываем —
// платформа оптимально запишет набор в конце транзакции проведения.
КонецПроцедуры
Также ускорить передачу данных можно с помощью метода набора Загрузить(), если предварительно сформировать таблицу значений с нужной структурой колонок, полностью совпадающей с составом полей регистра.
Если требуется выполнить массовую загрузку или проведение документов за старые периоды, эффективным приемом является временное смещение границы итогов назад. Разберем этот алгоритм:
УстановитьПериодРассчитанныхИтогов().Рассмотрим, какие изменения в структуре метаданных помогают снизить накладные расходы при проведении: