Как максимально быстро провести большой массив документов в 1С

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

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

Причины низкой скорости стандартного проведения

Когда система проводит документ типовым способом, на каждый документ выполняется полный цикл операций:

  1. Чтение объекта и его табличных частей из базы данных.
  2. Вызов подписок на события и проверок заполнения.
  3. Очистка существующих движений по всем регистрам.
  4. Чтение остатков и взаиморасчетов отдельными запросами.
  5. Формирование новых записей регистров.
  6. Запись документа и наборов записей с пересчетом текущих итогов.
  7. Фиксация изменений в журнале регистрации и таблицах планов обмена.

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

Способ 1. Формирование движений напрямую без перезаписи документа

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

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


НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);

// Заполняем проводки напрямую
Проводка = НаборЗаписей.Добавить();
Проводка.Период = ДатаДокумента;
Проводка.Регистратор = СсылкаНаДокумент;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Товары;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками;
Проводка.Сумма = 10000;

// Записываем только движения регистра
НаборЗаписей.Записать(Истина);

Этот подход убирает лишние блокировки таблиц документов и ускоряет процесс в несколько раз.

Способ 2. Пакетирование операций в транзакции

В файловом режиме (а также в клиент-серверном) проведение каждого отдельного документа порождает собственную транзакцию с физическим сбросом данных в лог транзакций. Оборачивание обработки в явные транзакции порциями по 100–500 документов кардинально снижает нагрузку на диск.

Разберем по шагам реализацию пакетной обработки:


КоличествоВПакете = 200;
Счетчик = 0;

НачатьТранзакцию();
Пока ВыборкаДокументов.Следующий() Цикл
    ДокументОбъект = ВыборкаДокументов.ПолучитьОбъект();
    
    // Отключаем лишние проверки при программной обработке
    ДокументОбъект.ОбменДанными.Загрузка = Истина;
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
    
    Счетчик = Счетчик + 1;
    Если Счетчик % КоличествоВПакете = 0 Тогда
        ЗафиксироватьТранзакцию();
        НачатьТранзакцию();
    КонецЕсли;
КонецЦикла;

Если ТранзакцияАктивна() Тогда
    ЗафиксироватьТранзакцию();
КонецЕсли;

Способ 3. Управление итогами регистров

При записи каждой проводки платформа обновляет таблицы итогов (например, по счетам 41 и 62). Если проводится непрерывный исторический массив данных, постоянный пересчет итогов создает основное замедление.

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

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

Важно: этот способ подходит, если алгоритм проведения не требует контроля остатков в реальном времени во время проведения следующего документа.

Способ 4. Временное отключение вспомогательных механизмов платформы

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

  1. Регистрация изменений для планов обмена: использование свойства ОбменДанными.Загрузка = Истина предотвращает запись изменений в таблицы узлов обмена.
  2. Журнал регистрации: временный перевод журнала регистрации в режим «Только ошибки» или «Не регистрировать» существенно разгружает дисковую подсистему.
  3. Полнотекстовый поиск: приостановка обновления индекса полнотекстового поиска через ПолнотекстовыйПоиск.УстановитьРежимУправленияРегистрацией(РежимУправленияРегистрациейПП.Запретить) исключает затраты на индексацию текстовых данных.
  4. Фоновые и регламентные задания: отключение регламентных заданий на время эксперимента освобождает вычислительные ресурсы.

Способ 5. Оптимизация аппаратной части и файлового режима

Если проведение выполняется в файловой базе данных (.1CD), файловая система становится узким горлышком из-за блокировок таблиц целиком:

  1. Перенос базы на RAM-диск или быстрый NVMe SSD: размещение файла базы данных и временных файлов операционной системы в оперативной памяти (RAM-диск) снижает задержки дискового ввода-вывода практически до нуля.
  2. Исключения антивируса: добавление каталога с базой данных и временных файлов платформы 1С в исключения антивирусного монитора защищает от блокировок файлов при многократной записи.
  3. Перевод в клиент-серверный вариант (SQL): при необходимости параллельного проведения документов в несколько потоков перевод базы на сервер СУБД (PostgreSQL / MS SQL) позволяет запускать обработку в несколько сеансов, распределив нагрузку по организациям или периодам. На сервере MS SQL для подобных экспериментов рекомендуется переводить базу в простую модель восстановления (Simple Recovery Model).
← На главную