Как ускорить медленную запись движений в регистр бухгалтерии 1С

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

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

Основные причины медленной записи в регистр бухгалтерии

Выясним, какие факторы сильнее всего влияют на скорость формирования движений:

  1. Пересчет таблицы итогов за прошлые периоды. В платформе 1С итоги регистра хранятся с определенной периодичностью (обычно срез на конец каждого месяца). Если документ проводится текущей датой, обновляется только текущий срез. Но если запись выполняется в давний период (например, за прошлый год), платформа обязана рассчитать и применить изменения ко всем промежуточным ежемесячным итогам вплоть до границы рассчитанных итогов. Для тысячи записей это порождает десятки тысяч дополнительных операций обновления таблиц СУБД.
  2. Использование субконто с составным типом данных. Если вид субконто имеет составной тип, в базе данных для него создаются два поля: тип значения (TRef) и ссылка (RRef). Поиск, индексация и обновление таблиц остатков и оборотов по составным колонкам требуют значительно больше ресурсов СУБД, чем работа с жестко типизированной ссылкой на конкретный справочник.
  3. Количество субконто и учет только оборотов. Наличие трех уровней субконто на счете заставляет платформу поддерживать сложные индексы и сразу несколько вспомогательных агрегатных таблиц.
  4. Ограничения файлового режима базы (.1CD). Встроенная файловая СУБД блокирует таблицы целиком и крайне чувствительна к вставке строк в середину хронологического списка, что вызывает множественное разделение страниц данных и индексов.

Оптимизация кода проведения документа

Разберем программные ошибки в коде записи движений. Создавать отдельный объект СоздатьНаборЗаписей() и вызывать метод Записать() внутри цикла или вручную в процедуре ОбработкаПроведения не рекомендуется. Правильнее использовать стандартную коллекцию движений документа и отдавать управление транзакции проведения платформе.

Посмотрим на пример правильного формирования движений в модуле документа:


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

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

Управление границей рассчитанных итогов

Если требуется выполнить массовую загрузку или проведение документов за старые периоды, эффективным приемом является временное смещение границы итогов назад. Разберем этот алгоритм:

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

Архитектурная оптимизация структуры данных

Рассмотрим, какие изменения в структуре метаданных помогают снизить накладные расходы при проведении:

  1. Устранение составных типов у видов субконто. Если аналитика всегда представлена элементами одного справочника, укажите конкретный тип данных вместо составного в плане видов характеристик.
  2. Настройка признаков «Только обороты» и «Учет по подразделениям». Если по счету затрат не требуется контролировать остатки в разрезе направлений деятельности или номенклатурных групп, включите признак Только обороты в настройке субконто на счете. Это избавит платформу от ведения таблицы остатков по данному разрезу.
  3. Разделение детального и синтетического учета. Если документ генерирует тысячи строк детализации (например, амортизация множества малоценных объектов), не следует перегружать регистр бухгалтерии. Детальный учет пообъектно ведут в оборотном Регистре накопления, а в регистр бухгалтерии передают агрегированные сводные проводки по счетам и подразделениям.
← На главную