Как пометить на удаление большой объем документов в серверной базе 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с крупными серверными базами данных (объемом от 100 ГБ и выше) стандартные механизмы отбора и пометки документов на удаление часто приводят к зависанию системы. Попытка единовременно обработать массив данных за несколько лет вызывает блокировки таблиц в MS SQL Server и переполнение журнала транзакций. Проанализируем основные причины этой проблемы и рассмотрим эффективные варианты её решения.

Выясним причины длительного выполнения операций

Прежде чем выбирать алгоритм работы, разберем по шагам, почему база 1С прекращает откликаться при массовых манипуляциях с документами:

  1. Эскалация блокировок СУБД (Lock Escalation): При обработке слишком большого массива записей за одну операцию MS SQL Server автоматически переходит от блокировок отдельных строк или страниц к полной блокировке таблиц. В результате процессы 1С блокируют друг друга и зависают.
  2. Переполнение журнала транзакций (LDF): В полной модели восстановления (FULL) любые изменения, отмена проведения документов и удаление движений фиксируются в журнале транзакций. Файл `.ldf` начинает разрастаться, упираясь в скорость дисковой подсистемы.
  3. Выполнение бизнес-логики модулей: Стандартный метод установки пометки удаления вызывает отмену проведения документа и исполняет код в обработчиках ПередЗаписью и ПриЗаписи. Это влечет за собой пересчеты, дополнительные проверки и высокую нагрузку на процессор.
  4. Непрерывный пересчет итогов регистров: При изменении состояния прошлых периодов система на лету пытается пересчитывать итоги регистров накопления и сведений, что критически замедляет запись.

Способ 1. Пакетная обработка в транзакциях

Основной технический подход при работе с миллионами записей — работа небольшими порциями (пачками) внутри транзакций. Оптимальный размер порции составляет от 500 до 2000 документов.

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

Рассмотрим пример кода для обработки документов порциями:


Выборка = Запросы.ПолучитьДокументыЗаПериод(ДатаНачала, ДатаОкончания);
Счетчик = 0;

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

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

Если ТранзакцияАктивна() Тогда
    ЗафиксироватьТранзакцию();
КонецЕсли;

Способ 2. Подготовка базы данных и MS SQL для ускорения

Чтобы ускорить процесс записи и исключить технические сбои серверной инфраструктуры, перед запуском процедуры выполнения необходимо произвести настройку среды:

  1. Перевод модели восстановления SQL в SIMPLE: В консоли управления MS SQL Server временно измените модель восстановления базы данных с FULL на SIMPLE. Это предотвратит неуправляемый рост файла `.ldf`. После окончания процедур верните режим обратно и сделайте полную резервную копию.
  2. Отключение расчета итогов: В платформе 1С отключите расчет итогов для регистров накопления на период проведения работ. Это предотвратит постоянный пересчет агрегатов при изменении прошлых периода.
  3. Блокировка регламентных заданий: Отключите фоновые задачи в консоли кластера серверов 1С (включая обновление индекса полнотекстового поиска и сбор статистики).

Способ 3. Альтернативный метод — переносы в новую чистую базу

Если задача состоит в свертке базы данных (оставить только последний год), самый чистый и правильный архитектурный путь — не удалять гигабайты старых данных из текущей базы, а перенести нужные данные в пустую.

Рассмотрим алгоритм этого подхода:

  1. Создается новая пустая информационная база с той же конфигурацией.
  2. С помощью обработок «Универсальный обмен данными XML» или прямой работы через COMConnector из рабочей базы в новую переносятся только справочники.
  3. Формируются и переносятся документы ввода остатков на начало целевого периода (например, на 01.01.2017).
  4. Последовательно по месяцам переносятся документы за оставшийся рабочий год.

Этот метод полностью исключает необходимость фрагментации и очистки таблиц базы объемом 100 ГБ, а новая база сразу работает с максимальной производительностью.

Обязательные действия после массового удаления

По завершении операций удаления или пометки документов данные в таблицах СУБД оказываются сильно фрагментированными. Чтобы вернуть скорость работы базы на прежний уровень, выполните регламентные работы на сервере MS SQL:

  1. Обновление статистики: Выполните команду UPDATE STATISTICS для всех таблиц базы данных.
  2. Реиндексация: Проведите процедуру перестроения индексов (REBUILD INDEX).
  3. Сжатие файлов базы: Записи удалены, но физический размер файлов MDF/LDF на диске не уменьшится автоматически. Для освобождения дискового пространства выполните операцию SHRINKDATABASE.
← На главную