При работе с крупными базами «1С:Управление торговым предприятием» (УТП) часто возникает необходимость перепровести документы за несколько лет (например, для исправления ошибок в партионном или бухгалтерском учете). Когда объем данных достигает сотен тысяч документов, стандартное последовательное перепроведение может затянуться на недели. Разберем комплексный подход к решению этой задачи, объединив программные методы, системные настройки SQL и аппаратные улучшения.
Прежде чем приступать к ускорению, проанализируем риски. Как справедливо замечено в обсуждении, перепроведение документов «глубоким» задним числом — процедура опасная. В 1С:УТП многие алгоритмы зависят от остатков на момент времени, и изменение одного документа в начале цепочки может радикально изменить результат в конце. Кроме того, бухгалтеры часто выравнивают «кривульки» прошлых периодов ручными операциями в текущем. Массовое перепроведение может «поднять» эти проблемы.
Рекомендация: Всегда выполняйте полное перепроведение сначала на копии базы. Только после того, как бухгалтерия подтвердит корректность оборотно-сальдовой ведомости и других отчетов, переносите результат в рабочую базу.
Если задача стоит перепровести документы только ради определенных регистров (например, РегистрБухгалтерии), можно временно изменить логику проведения. Проанализируем, как это сделать наиболее эффективно:
ОбменДанными.Загрузка = Истина. Это отключает проверки в процедурах ПередЗаписью и ПриЗаписи, что дает существенный прирост. Но помните: в режиме загрузки типовые механизмы проведения могут не сработать, поэтому этот флаг нужно проверять внутри модуля проведения только для пропуска «тяжелых» нефинансовых проверок (например, проверки заполнения ГТД, если они не влияют на проводки).Пример реализации выборочного проведения через реквизит-флаг:
// В модуле документа в процедуре ОбработкаПроведения
Если ЭтотОбъект.ДополнительныеСвойства.Свойство("ТолькоБухУчет") Тогда
// Выполняем только расчет проводок
СформироватьДвиженияБухгалтерии(Отказ);
Возврат;
КонецЕсли;
Основная причина замедления проведения «задним числом» — это необходимость системы пересчитывать итоги всех последующих периодов при каждой записи набора записей регистра. Выясним, как это обойти:
Для управления итогами программно используем методы:
РегистрыНакопления.ИмяРегистра.УстановитьИспользованиеИтогов(Ложь);
После завершения всех работ итоги нужно обязательно включить и пересчитать (УстановитьИспользованиеИтогов(Истина)).
Если база работает в клиент-серверном варианте, настройки SQL-сервера могут ускорить процесс в несколько раз. Проанализируем основные параметры:
1118 и 4199, которые оптимизируют работу с экстентами и оптимизатором запросов.READ_COMMITTED_SNAPSHOT позволит процессам чтения не блокироваться процессами записи, что полезно при многопоточном проведении.Посмотрим, как можно распараллелить процесс, учитывая, что 1С:УТП чувствительна к блокировкам. Просто запустить перепроведение всех документов в 10 потоков не получится из-за конфликтов по таблицам итогов.
Эффективная стратегия распараллеливания:
Commit транзакции в SQL.Пример структуры кода для запуска фонового задания:
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ДатаНачала", НачалоГода);
ПараметрыЗадания.Вставить("ДатаОкончания", КонецГода);
ФоновыеЗадания.Выполнить("МойМодуль.ПерепровестиДокументы", ПараметрыЗадания);
Рассмотрим продвинутый метод для опытных администраторов. Если перепроведение в рабочей базе невозможно из-за регламентных заданий и работы пользователей:
Внимание: Прямая запись в таблицы SQL нарушает лицензионное соглашение «1С», поэтому этот метод стоит использовать только как крайнюю меру и через средства платформы (например, через выгрузку/загрузку XML или внешние источники данных).
Выясним, какое железо обеспечит максимальную скорость:
Подводя итог, скажем: максимальный эффект дает сочетание отключения итогов, настройки SQL (Simple mode + TempDB на SSD) и помесячного проведения пакетами транзакций. Такой подход позволяет сократить время перепроведения трех лет с недель до нескольких суток.