Свертка информационной базы — стандартная процедура, призванная уменьшить объем базы данных и повысить скорость работы системы. Однако при попытке удалить старые документы пользователи и администраторы 1С часто сталкиваются с ситуацией, когда стандартная обработка «Удаление помеченных объектов» зависает на этапе «Контроль» на десятки часов или даже суток. Разберем детально, почему это происходит, стоит ли ждать завершения процесса и какие существуют проверенные и быстрые альтернативные способы очистки базы.
Проанализируем техническую сторону работы стандартного механизма контроля ссылок в платформе 1С:Предприятие:
НайтиПоСсылкам(). Чтобы гарантировать целостность данных, система обязана выполнить полное сканирование абсолютно всех таблиц базы данных (документов, справочников, табличных частей, регистров сведений, накопления, бухгалтерии, планов обмена) на наличие ссылок на каждый проверяемый объект. Когда массив удаляемых документов составляет сотни тысяч позиций, сложность и время сканирования возрастают в геометрической прогрессии.Если этап контроля длится уже более суток на файловой базе без видимого прогресса, ждать завершения нет смысла — процесс может длиться неделями из-за постоянной фрагментации памяти и очередей ввода-вывода. Рассмотрим эффективные стратегии решения задачи.
Когда при свертке удаляется значительная часть данных (от 30% до 50% и более), самым быстрым и надежным решением является отказ от физического удаления документов «на месте». Вместо этого применим методику выгрузки только необходимых актуальных данных в чистую конфигурацию.
Разберем пошаговый порядок действий:
.cf) текущей рабочей базы.ВыгрузкаЗагрузкаXML или правил обмена («1С:Конвертация данных») выгрузим из рабочей базы в чистую:
Результат: Новая база получается полностью оптимизированной, свободной от битых ссылок, фрагментации файлов и служебного мусора, а весь перенос обычно занимает от 1 до 4 часов вместо нескольких суток ожидания.
Если перенос в новую базу невозможен и требуется очистить текущую базу, откажемся от передачи всего массива документов на удаление разом. Разделим удаление на небольшие порции.
Посмотрим на пример программного поиска и удаления объектов пачками по 200–500 элементов:
// Пример порционного поиска ссылок и удаления
МассивУдаляемых = Новый Массив;
Выборка = Документы.ЗаказПокупателя.Выбрать(НачалоДня(Дата("20200101")), КонецДня(Дата("20201231")));
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления Тогда
МассивУдаляемых.Добавить(Выборка.Ссылка);
КонецЕсли;
// Обрабатываем порциями по 200 элементов
Если МассивУдаляемых.Количество() >= 200 Тогда
СсылкиВБазе = НайтиПоСсылкам(МассивУдаляемых);
Если СсылкиВБазе.Количество() = 0 Тогда
// Если ссылки не найдены, удаляем объекты физически
УдалитьОбъекты(МассивУдаляемых, Ложь);
Иначе
// Обрабатываем неразрешенные ссылки или логируем их
Для Каждого Стр Из СсылкиВБазе Цикл
Сообщить("Объект " + Строка(Стр.Данные) + " используется в: " + Строка(Стр.Объект));
КонецЦикла;
КонецЕсли;
МассивУдаляемых.Очистить();
КонецЕсли;
КонецЦикла;
Если МассивУдаляемых.Количество() > 0 Тогда
СсылкиВБазе = НайтиПоСсылкам(МассивУдаляемых);
Если СсылкиВБазе.Количество() = 0 Тогда
УдалитьОбъекты(МассивУдаляемых, Ложь);
КонецЕсли;
КонецЕсли;
Также для управляемого удаления рекомендуется использовать специализированную обработку «Удаление объектов с контролем ссылок» из состава внешнего пакета «Инструменты разработчика». Она оптимизирует дерево ссылок, наглядно показывает циклические связи и позволяет удалять объекты пакетами любого заданного размера.
Перед запуском удаления объектов обязательно выполним подготовительные операции, которые ускорят проверку в разы:
ЛинейныйУзелОбмена или программно через метод ПланыОбмена.УдалитьРегистрациюИзменений().УстановитьИспользованиеИтогов(Ложь) или стандартную процедуру управления итогами. Это избавит СУБД от постоянного пересчета агрегатных таблиц.ВерсииОбъектов. Удалим устаревшие версии специальной регламентной обработкой.Если требуется ускорить стандартный процесс в файловом режиме:
1Cv8.1CD туда. Скорость случайных операций чтения при контроле ссылочной целостности увеличится в десятки раз по сравнению даже с быстрыми NVMe SSD..dt в клиент-серверную базу. Сервер СУБД строит более эффективные планы запросов при выполнении метода НайтиПоСсылкам(), что позволяет завершить контроль значительно быстрее. После завершения очистки базу можно выгрузить обратно в файловый вариант.Важно помнить: после физического удаления документов размер файла 1Cv8.1CD автоматически не уменьшится, так как файловая СУБД 1С лишь помечает страницы данных как свободные.
Чтобы физически освободить дисковое пространство и перестроить индексы, выполним одно из следующих действий:
.dt и загрузим его в новую пустую папку (при выгрузке/загрузке служебные пустоты не сохраняются, и база уменьшится до фактического размера).