Как максимально ускорить массовое перепроведение документов в 1С:УТП за длительный период?

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

При работе с крупными базами «1С:Управление торговым предприятием» (УТП) часто возникает необходимость перепровести документы за несколько лет (например, для исправления ошибок в партионном или бухгалтерском учете). Когда объем данных достигает сотен тысяч документов, стандартное последовательное перепроведение может затянуться на недели. Разберем комплексный подход к решению этой задачи, объединив программные методы, системные настройки SQL и аппаратные улучшения.

Анализ исходной ситуации и риски

Прежде чем приступать к ускорению, проанализируем риски. Как справедливо замечено в обсуждении, перепроведение документов «глубоким» задним числом — процедура опасная. В 1С:УТП многие алгоритмы зависят от остатков на момент времени, и изменение одного документа в начале цепочки может радикально изменить результат в конце. Кроме того, бухгалтеры часто выравнивают «кривульки» прошлых периодов ручными операциями в текущем. Массовое перепроведение может «поднять» эти проблемы.

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

Способ 1. Программная оптимизация через временную модификацию кода

Если задача стоит перепровести документы только ради определенных регистров (например, РегистрБухгалтерии), можно временно изменить логику проведения. Проанализируем, как это сделать наиболее эффективно:

  1. Отключение лишних движений: В модуле документа можно временно закомментировать формирование движений по тем регистрам, которые в данном случае не критичны. Однако это нужно делать крайне осторожно, так как бухгалтерские проводки часто строятся на данных, рассчитанных в процессе формирования управленческих движений (партий).
  2. Использование флага загрузки: Рассмотрим использование механизма ОбменДанными.Загрузка = Истина. Это отключает проверки в процедурах ПередЗаписью и ПриЗаписи, что дает существенный прирост. Но помните: в режиме загрузки типовые механизмы проведения могут не сработать, поэтому этот флаг нужно проверять внутри модуля проведения только для пропуска «тяжелых» нефинансовых проверок (например, проверки заполнения ГТД, если они не влияют на проводки).
  3. Сравнение движений: Разберем идею из систем класса ERP — записывать движения только в том случае, если они изменились. Это экономит время на операциях записи в SQL.

Пример реализации выборочного проведения через реквизит-флаг:


// В модуле документа в процедуре ОбработкаПроведения
Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ТолькоБухУчет") Тогда
    // Выполняем только расчет проводок
    СформироватьДвиженияБухгалтерии(Отказ);
    Возврат;
КонецЕсли;

Способ 2. Управление итогами регистров — ключ к скорости

Основная причина замедления проведения «задним числом» — это необходимость системы пересчитывать итоги всех последующих периодов при каждой записи набора записей регистра. Выясним, как это обойти:

  1. Отключение итогов: Перед началом перепроведения необходимо отключить использование итогов для всех регистров накопления и бухгалтерии. Система перестанет тратить ресурсы на обновление таблиц итогов при каждом документе.
  2. Помесячный расчет: Рассмотрим правильную стратегию:
    • Отключаем итоги.
    • Перепроводим месяц.
    • Рассчитываем итоги по этот месяц.
    • Переходим к следующему.

Для управления итогами программно используем методы:

РегистрыНакопления.ИмяРегистра.УстановитьИспользованиеИтогов(Ложь);

После завершения всех работ итоги нужно обязательно включить и пересчитать (УстановитьИспользованиеИтогов(Истина)).

Способ 3. Оптимизация на уровне MS SQL Server

Если база работает в клиент-серверном варианте, настройки SQL-сервера могут ускорить процесс в несколько раз. Проанализируем основные параметры:

  1. Модель восстановления (Recovery Model): Переключите базу в режим Simple. Это предотвратит бесконечный рост лога транзакций (LDF-файла) и снизит нагрузку на диск при массовой записи.
  2. TempDB на RAM-диске: Вынос временной базы SQL (TempDB) на RAM-диск или сверхскоростной NVMe SSD критически важен, так как 1С активно использует временные таблицы при расчетах.
  3. Флаги трассировки: Для 1С рекомендуется включить флаги 1118 и 4199, которые оптимизируют работу с экстентами и оптимизатором запросов.
  4. Snapshot Isolation: Включение READ_COMMITTED_SNAPSHOT позволит процессам чтения не блокироваться процессами записи, что полезно при многопоточном проведении.

Способ 4. Параллельное проведение (Многопоточность)

Посмотрим, как можно распараллелить процесс, учитывая, что 1С:УТП чувствительна к блокировкам. Просто запустить перепроведение всех документов в 10 потоков не получится из-за конфликтов по таблицам итогов.

Эффективная стратегия распараллеливания:

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


ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ДатаНачала", НачалоГода);
ПараметрыЗадания.Вставить("ДатаОкончания", КонецГода);
ФоновыеЗадания.Выполнить("МойМодуль.ПерепровестиДокументы", ПараметрыЗадания);

Способ 5. Метод «Снимка движений» (SQL-синхронизация)

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

  1. Создаем полную копию базы.
  2. На мощном отдельном сервере (желательно с файловой базой на SSD или оптимизированным SQL) перепроводим все документы без ограничений по времени.
  3. После завершения выгружаем измененные наборы записей регистров. Это можно сделать через план обмена или напрямую через SQL-запросы (вставка данных из таблицы движений копии в таблицу движений рабочей базы).

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

Аппаратные рекомендации

Выясним, какое железо обеспечит максимальную скорость:

Подводя итог, скажем: максимальный эффект дает сочетание отключения итогов, настройки SQL (Simple mode + TempDB на SSD) и помесячного проведения пакетами транзакций. Такой подход позволяет сократить время перепроведения трех лет с недель до нескольких суток.

← На главную