Свертка информационной базы — это сложная и ответственная процедура, направленная на сокращение объема данных и повышение производительности системы. В типовых конфигурациях, таких как 1С:Управление торговлей, этот процесс реализован через специальный помощник. Одним из самых длительных этапов является "Пометка удаления документов и удаление движений регистров". Часто системные администраторы и программисты сталкиваются с ситуацией, когда процесс затягивается на десятки часов, и возникает закономерный вопрос: можно ли его прервать и как это скажется на данных?
В этой статье мы подробно разберем механику процесса свертки, проанализируем риски прерывания и рассмотрим способы ускорения выполнения этой операции.
Прежде чем принимать решение об остановке процесса, проанализируем, что именно делает программа в данный момент. На этапе свертки система выполняет две основные задачи:
Важно понимать, что в современных версиях 1С:Управление торговлей (начиная с 11.x) этот процесс не выполняется одной гигантской транзакцией. Если бы система пыталась пометить миллион документов в одной транзакции, файл лога транзакций SQL Server (.ldf) мгновенно бы переполнился, а база данных зависла. Процесс идет порциями — по типам документов или по определенному количеству объектов. Именно это дает нам возможность относительно безопасно прерывать выполнение.
Рассмотрим ситуацию, когда время, отведенное на технологическое окно, подходит к концу, а процесс все еще идет. Прерывать процесс можно, однако делать это стоит осмотрительно. Если мы закроем сеанс или принудительно завершим работу через консоль кластера 1С, произойдет откат текущей активной транзакции (той порции данных, которая обрабатывается в данный момент).
Выясним, какие последствия нас ждут:
Если процесс был прерван, у нас есть несколько путей возобновления работы. Рассмотрим каждый из них.
При повторном запуске "Помощника свертки базы данных" система обычно анализирует текущее состояние. В большинстве случаев помощник предложит продолжить выполнение с того этапа, на котором произошла остановка. Даже если он начнет обход документов с самого начала, процесс пойдет значительно быстрее. Проанализируем почему: алгоритм проверяет признак ПометкаУдаления. Если документ уже помечен, система просто пропускает его, не выполняя тяжелую операцию записи в базу данных.
Если штатный помощник ведет себя нестабильно после прерывания, мы можем завершить процесс самостоятельно. Для этого воспользуемся стандартной обработкой "Групповое изменение реквизитов". Выберем необходимые типы документов за период свертки и установим реквизит ПометкаУдаления в значение Истина. Это позволит нам гибко управлять процессом, выбирая документы по частям (например, сначала только "Заказы клиентов", затем "Реализации").
Чтобы не возникало необходимости прерывать свертку, разберем шаги по оптимизации производительности. Выполним следующие действия перед запуском:
Все функции — Стандартные — Управление итогами. При отключенных итогах система не тратит ресурсы на пересчет итоговых таблиц при каждом изменении документа.Simple (Простая модель восстановления). Это предотвратит бесконечный рост лога транзакций.ПередЗаписью или ПриЗаписи. Часто там прописаны проверки, которые замедляют запись объектов в десятки раз. На время свертки их стоит временно деактивировать.Если вам требуется написать собственный скрипт для доработки процесса после прерывания, рассмотрим пример эффективного кода для массовой пометки удаления с отключением проверок. Используем объект ДокументОбъект и метод УстановитьПометкуУдаления.
// Пример программной пометки удаления порциями
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ССЫЛКА
|ИЗ Документ.РеализацияТоваровУслуг
|ГДЕ Дата < &ДатаСвертки И ПометкаУдаления = ЛОЖЬ";
Запрос.УстановитьПараметр("ДатаСвертки", ДатаСвертки);
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
ДокОбъект = Результат.Ссылка.ПолучитьОбъект();
// Отключаем дополнительные обработки для ускорения
ДокОбъект.ОбменДанными.Загрузка = Истина;
Попытка
ДокОбъект.УстановитьПометкуУдаления(Истина);
Исключение
Сообщить("Ошибка при обработке документа: " + Результат.Ссылка);
КонецПопытки;
КонецЦикла;
Использование свойства ОбменДанными.Загрузка = Истина является критически важным. Это позволяет обойти встроенные в конфигурацию прикладные проверки, которые на этапе свертки уже не имеют значения, так как данные за прошлые периоды признаются корректными по умолчанию.
Почему же даже после успешной пометки удаления база не уменьшается в размере? Помните, что пометка удаления — это лишь установка флажка в таблице. Основная работа впереди: выполнение обработки "Удаление помеченных объектов". Именно там происходит проверка ссылочной целостности, и именно этот этап может стать "бутылочным горлышком". Поэтому, если вы прервали свертку на этапе пометки, это лишь малая часть пути. Рекомендуем всегда иметь актуальную резервную копию перед любыми действиями со сверткой, так как процесс затрагивает глобальные структуры данных информационной базы.
Подведем итог: прерывать процесс пометки удаления можно. После перезапуска системы и оптимизации настроек (итоги, SQL, полнотекстовый поиск) вы сможете продолжить работу либо через штатный помощник, либо с помощью инструментов групповой обработки данных.