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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При выполнении свертки информационных баз 1С разработчики и администраторы часто сталкиваются с ситуацией, когда пометка на удаление сотен тысяч исторических документов занимает несколько суток. Ограниченность технологического окна (выходные или праздничные дни) не позволяет останавливать работу пользователей на столь длительный срок. Разберем детально, почему штатные механизмы работают медленно, и какие подходы позволяют многократно ускорить очистку данных как в локальных базах на MS SQL Server, так и в распределенных информационных базах (РИБ).

Выясним причины низкой производительности штатной пометки на удаление

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

  1. Отмена проведения и пересчет итогов. Если использовать штатный метод УстановитьПометкуУдаления(Истина) для проведенного документа, платформа инициирует построчную отмену проведения. Это влечет за собой очистку движений по всем регистрам, пересчет итогов и агрегатов, а также проверки связанных данных.
  2. Регистрация изменений в планах обмена (РИБ). При каждой перезаписи объекта 1С добавляет записи в таблицы регистрации изменений для всех узлов планов обмена. Запись миллионов строк в эти таблицы резко замедляет СУБД и приводит к разрастанию базы данных, а последующая выгрузка в XML способна полностью парализовать обмен.
  3. Срабатывание прикладных обработчиков. На каждый документ вызываются события ПередЗаписью, ПриЗаписи, многочисленные подписки на события конфигурации, алгоритмы версионирования объектов и индексация полнотекстового поиска.

Способ 1. Программная оптимизация: разделение очистки движений и пометки

Рассмотрим наиболее эффективный программный подход, который позволяет выполнить операцию без вызова тяжелой бизнес-логики конфигурации. Разделим процесс на два последовательных быстрых шага с использованием свойства ОбменДанными.Загрузка = Истина.

Шаг 1. Очистка движений документов напрямую через наборы записей. Записываем пустые наборы записей по регистрам, не вызывая перепроведение документа.


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

Шаг 2. Пакетная установка пометки на удаление. Устанавливаем свойство ПометкаУдаления = Истина и записываем объект в режиме обычной записи (а не отмены проведения), группируя документы в транзакции по 500–1000 штук.


Счетчик = 0;
НачатьТранзакцию();

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

Если Счетчик % 1000 <> 0 Тогда
    ЗафиксироватьТранзакцию();
КонецЕсли;

Способ 2. Оптимизация процесса в распределенных информационных базах (РИБ)

Если в системе настроен РИБ, прямая очистка на уровне SQL нарушает целостность обмена, а штатная пометка создает гигантские пакеты выгрузки. Разберем правильные стратегии работы с РИБ:

  1. Пометка без регистрации с пересозданием начального образа. При установке пометки на удаление в центральном узле полностью отключаем регистрацию изменений в планах обмена (либо очищаем ее методом ПланыОбмена.УдалитьРегистрациюИзменений()). После завершения свертки в центре для каждого подчиненного узла формируется новый начальный образ через ПланыОбмена.СоздатьНачальныйОбраз(). Развернуть готовый образ на точках значительно быстрее, чем передавать многогигабайтные XML-файлы с удаляемыми объектами.
  2. Временная отвязка узлов РИБ. На подчиненном узле вызывается метод ПланыОбмена.УстановитьГлавныйУзел(Неопределено). База становится автономной, в ней проводится очистка, затем восстанавливается привязка к главному узлу и выравниваются номера сообщений обмена.

Способ 3. Организационное разделение работ на этапы

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

  1. Свертка остатков и очистка движений в нерабочее время. Главная цель монопольного окна — ввести документы ввода остатков на дату свертки и очистить движения старых документов. Как только движения очищены, а остатки введены, база готова к работе пользователей.
  2. Фоновая пометка на удаление в рабочее время. Сама пометка документов на удаление не требует монопольного доступа. Ее можно выполнять частями (помесячно или по типам документов) в фоновых заданиях или регламентным заданием БСП с ограничением размера порций.
  3. Свертка на копии с догрузкой данных. Создается копия рабочей базы, на ней без спешки проводится полная свертка и пометка на удаление. После этого за короткое технологическое окно в копию переносятся только новые документы, созданные пользователями за время проведения свертки, выполняется контрольная сверка остатков, и копия становится основной рабочей базой.

Способ 4. Настройки СУБД (MS SQL Server) на время массовых операций

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

  1. Модель восстановления (Recovery Model). Перевод базы в режим Simple (простая модель восстановления) предотвращает неконтролируемый рост журнала транзакций (LDF-файла) при массовой записи сотен тысяч документов.
  2. Отключение индексов и полнотекстового поиска. На время массовой записи отключаем полнотекстовый поиск программным вызовом ПолнотекстовыйПоиск.УстановитьРежим(РежимПолнотекстовогоПоиска.НеИспользовать), а после завершения всех процедур свертки обязательно выполняем полную реиндексацию и дефрагментацию таблиц средствами СУБД.
← На главную