Как быстро провести документы в 1С за несколько лет: практическое руководство по оптимизации

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

Ситуация, когда требуется перепровести огромный массив данных (за 3–4 года и более), часто возникает при исправлении методологических ошибок в учете, например, при неверном расчете себестоимости или ошибках в аналитике характеристик. Стандартные средства 1С в таких случаях могут работать крайне медленно. Разберем, как ускорить этот процесс, начиная от технических настроек сервера и заканчивая программными методами оптимизации кода.

Миф о транзакциях в 1С 8.х

Проанализируем сначала код, предложенный в начале обсуждения. Автор попытался обернуть цикл проведения документов в одну большую транзакцию, надеясь на ускорение:


НачатьТранзакцию();
Попытка
    Для Каждого Док из ТаблицаДокументов цикл
        объект = Док.ссылка.получитьОбъект();
        объект.Записать(РежимЗаписиДокумента.Проведение);
    КонецЦикла;
    ЗафиксироватьТранзакцию();
Исключение
    Если ТранзакцияАктивна() Тогда
        ОтменитьТранзакцию();
    КонецЕсли;
КонецПопытки;

Важно понимать, что в платформе 1С:Предприятие 8 использование одной огромной транзакции не дает существенного прироста скорости, в отличие от старой версии 7.7. Более того, это крайне опасно: транзакционный лог SQL-сервера может переполниться, а при возникновении ошибки в одном документе из тысячи — вся работа будет отменена. В современных версиях каждый документ при проведении и так открывает свою транзакцию, а «оборачивание» всего цикла лишь увеличивает нагрузку на tempdb и кэш транзакций.

Техническая настройка инфраструктуры

Прежде чем приступать к программным методам, проанализируем состояние сервера. Для массовых операций критически важна дисковая подсистема и настройки СУБД.

  1. Режим восстановления базы данных (Recovery Model): Перед началом глобального перепроведения обязательно переключите базу данных на SQL-сервере в режим Simple. Это отключит детальное логирование каждой операции в LDF-файл, что значительно ускорит запись и предотвратит неконтролируемый рост лога.
  2. Использование Shared Memory: Если сервер приложений 1С и SQL-сервер находятся на одной физической машине, убедитесь, что в строке подключения используется протокол Shared Memory. Это позволит избежать лишних сетевых задержек.
  3. Размещение TempDB: База TempDB активно используется при расчете итогов и проведении. Ее следует разместить на самом быстром диске (желательно NVMe SSD или даже RAM-диск).
  4. RAM-диск для всей базы: Если размер базы (в формате dt) небольшой, как в нашем примере (20 Гб), рассмотрите возможность временного переноса всей рабочей базы на RAM-диск. Скорость операций ввода-вывода (IOPS) в оперативной памяти в десятки раз выше, чем у любого SSD.

Программные методы ускорения

Рассмотрим подробнее, как мы можем модифицировать процесс проведения программно, чтобы минимизировать лишние вычисления.

1. Отключение расчета итогов

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

Внимание: Этот метод подходит только если логика проведения документов не опирается на текущие остатки (например, в режиме РАУЗ в УПП или если отключен контроль остатков).


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

2. Отключение регистрации на узлах обмена

Если в системе настроены планы обмена, каждое проведение документа создает записи в таблицах регистрации изменений. Это создает колоссальную нагрузку. На время групповой обработки рекомендуется временно отключить подписки на события, отвечающие за регистрацию изменений, или программно подавлять запись обмена через ОбменДанными.Загрузка = Истина.


ОбъектДок = Ссылка.ПолучитьОбъект();
ОбъектДок.ОбменДанными.Загрузка = Истина; // Подавляет регистрации и некоторые проверки
ОбъектДок.Записать(РежимЗаписиДокумента.Проведение);

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

Выясним причину, почему 1С проводит всё в один поток. Платформа выполняет код последовательно, но мы можем запустить несколько фоновых заданий. Разделим массив документов на независимые группы (например, по организациям или по складам) и запустим для каждой группы отдельный процесс.

Для реализации параллельности можно использовать следующий алгоритм:

  1. Разбить таблицу документов на N частей.
  2. Для каждой части вызвать процедуру через ФоновыеЗадания.Выполнить().
  3. Внутри процедуры выполнять проведение.

Это позволит загрузить все ядра процессора сервера и сократить время проведения пропорционально количеству потоков (при условии, что дисковая подсистема справится с нагрузкой).

Методологический подход: корректировка вместо перепроведения

Проанализируем ситуацию: автору нужно восстановить себестоимость за 4 года. Часто перепроведение за такой срок порождает новые ошибки в старых периодах, которые уже «закрыты» и сданы в налоговую.

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

Итоги и рекомендации

Подводя итог, для максимально быстрого проведения документов выполним следующие шаги:

  1. Переведем SQL в режим Simple.
  2. Используем ОбменДанными.Загрузка = Истина для обхода лишних проверок и триггеров обмена.
  3. Если позволяет логика конфигурации (нет жесткой зависимости от итогов в реальном времени), отключим итоги регистров.
  4. Разделим задачу на 4–8 параллельных потоков через фоновые задания.
  5. Обязательно вынесем TempDB на скоростной носитель.

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

← На главную