Ситуация, когда требуется перепровести огромный массив данных (за 3–4 года и более), часто возникает при исправлении методологических ошибок в учете, например, при неверном расчете себестоимости или ошибках в аналитике характеристик. Стандартные средства 1С в таких случаях могут работать крайне медленно. Разберем, как ускорить этот процесс, начиная от технических настроек сервера и заканчивая программными методами оптимизации кода.
Проанализируем сначала код, предложенный в начале обсуждения. Автор попытался обернуть цикл проведения документов в одну большую транзакцию, надеясь на ускорение:
НачатьТранзакцию();
Попытка
Для Каждого Док из ТаблицаДокументов цикл
объект = Док.ссылка.получитьОбъект();
объект.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
КонецЕсли;
КонецПопытки;
Важно понимать, что в платформе 1С:Предприятие 8 использование одной огромной транзакции не дает существенного прироста скорости, в отличие от старой версии 7.7. Более того, это крайне опасно: транзакционный лог SQL-сервера может переполниться, а при возникновении ошибки в одном документе из тысячи — вся работа будет отменена. В современных версиях каждый документ при проведении и так открывает свою транзакцию, а «оборачивание» всего цикла лишь увеличивает нагрузку на tempdb и кэш транзакций.
Прежде чем приступать к программным методам, проанализируем состояние сервера. Для массовых операций критически важна дисковая подсистема и настройки СУБД.
Simple. Это отключит детальное логирование каждой операции в LDF-файл, что значительно ускорит запись и предотвратит неконтролируемый рост лога.Shared Memory. Это позволит избежать лишних сетевых задержек.TempDB активно используется при расчете итогов и проведении. Ее следует разместить на самом быстром диске (желательно NVMe SSD или даже RAM-диск).dt) небольшой, как в нашем примере (20 Гб), рассмотрите возможность временного переноса всей рабочей базы на RAM-диск. Скорость операций ввода-вывода (IOPS) в оперативной памяти в десятки раз выше, чем у любого SSD.Рассмотрим подробнее, как мы можем модифицировать процесс проведения программно, чтобы минимизировать лишние вычисления.
Это один из самых эффективных методов. При проведении документа система постоянно обновляет таблицы итогов регистров накопления и бухгалтерии. Если отключить использование итогов на время проведения, скорость записи возрастет в разы.
Внимание: Этот метод подходит только если логика проведения документов не опирается на текущие остатки (например, в режиме РАУЗ в УПП или если отключен контроль остатков).
// Пример отключения итогов для регистра
РегистрыНакопления.Продажи.УстановитьИспользованиеИтогов(Ложь);
// ... проводим документы ...
РегистрыНакопления.Продажи.УстановитьИспользованиеИтогов(Истина);
РегистрыНакопления.Продажи.ПересчитатьИтоги();
Если в системе настроены планы обмена, каждое проведение документа создает записи в таблицах регистрации изменений. Это создает колоссальную нагрузку. На время групповой обработки рекомендуется временно отключить подписки на события, отвечающие за регистрацию изменений, или программно подавлять запись обмена через ОбменДанными.Загрузка = Истина.
ОбъектДок = Ссылка.ПолучитьОбъект();
ОбъектДок.ОбменДанными.Загрузка = Истина; // Подавляет регистрации и некоторые проверки
ОбъектДок.Записать(РежимЗаписиДокумента.Проведение);
Выясним причину, почему 1С проводит всё в один поток. Платформа выполняет код последовательно, но мы можем запустить несколько фоновых заданий. Разделим массив документов на независимые группы (например, по организациям или по складам) и запустим для каждой группы отдельный процесс.
Для реализации параллельности можно использовать следующий алгоритм:
ФоновыеЗадания.Выполнить().Это позволит загрузить все ядра процессора сервера и сократить время проведения пропорционально количеству потоков (при условии, что дисковая подсистема справится с нагрузкой).
Проанализируем ситуацию: автору нужно восстановить себестоимость за 4 года. Часто перепроведение за такой срок порождает новые ошибки в старых периодах, которые уже «закрыты» и сданы в налоговую.
Рассмотрим альтернативный вариант:
Ввод корректировок. Если проблема только в неверной себестоимости из-за отсутствия цен на характеристики, можно рассчитать правильные значения в копии базы, выявить разницу и ввести в рабочую базу документ Корректировка записей регистров на начало текущего года. Это позволит получить актуальные остатки без изменения истории.
Подводя итог, для максимально быстрого проведения документов выполним следующие шаги:
Simple.ОбменДанными.Загрузка = Истина для обхода лишних проверок и триггеров обмена.TempDB на скоростной носитель.Помните, что самое быстрое перепроведение — это то, которого удалось избежать. Всегда оценивайте необходимость изменения данных за прошлые периоды, прежде чем запускать процесс, который может занять недели серверного времени.