Почему зависает контроль и удаление помеченных объектов в свернутой базе 1С и как решить проблему?

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

Свертка информационной базы — стандартная процедура, призванная уменьшить объем базы данных и повысить скорость работы системы. Однако при попытке удалить старые документы пользователи и администраторы 1С часто сталкиваются с ситуацией, когда стандартная обработка «Удаление помеченных объектов» зависает на этапе «Контроль» на десятки часов или даже суток. Разберем детально, почему это происходит, стоит ли ждать завершения процесса и какие существуют проверенные и быстрые альтернативные способы очистки базы.

Почему зависает проверка ссылочной целостности

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

  1. Работа метода поиска ссылок: При запуске этапа проверки платформа использует внутренние алгоритмы, аналогичные функции НайтиПоСсылкам(). Чтобы гарантировать целостность данных, система обязана выполнить полное сканирование абсолютно всех таблиц базы данных (документов, справочников, табличных частей, регистров сведений, накопления, бухгалтерии, планов обмена) на наличие ссылок на каждый проверяемый объект. Когда массив удаляемых документов составляет сотни тысяч позиций, сложность и время сканирования возрастают в геометрической прогрессии.
  2. Ограничения файлового формата (1CD): Для файловой базы объем 15 Гбайт является критическим. Внутренний движок файловой СУБД 1С не имеет оптимизатора запросов уровня промышленных СУБД (MS SQL, PostgreSQL), а интенсивные операции проверки создают огромную очередь на дисковый ввод-вывод (I/O) и блокируют таблицы целиком.
  3. Скрытые связи и вторичные таблицы: Часто объекты удерживаются не самими проведенными документами, а служебными записями: таблицами регистрации изменений планов обмена, записями версионирования объектов, независимыми регистрами сведений или журналом регистрации.

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

Стратегия 1. «Свертка наоборот» — перенос остатков и актуальных данных в чистую базу

Когда при свертке удаляется значительная часть данных (от 30% до 50% и более), самым быстрым и надежным решением является отказ от физического удаления документов «на месте». Вместо этого применим методику выгрузки только необходимых актуальных данных в чистую конфигурацию.

Разберем пошаговый порядок действий:

  1. Создадим пустую информационную базу из файла конфигурации (.cf) текущей рабочей базы.
  2. В исходной базе сформируем документы ввода начальных остатков на дату свертки (например, с помощью стандартной обработки «Свертка информационной базы»).
  3. С помощью универсальной обработки ВыгрузкаЗагрузкаXML или правил обмена («1С:Конвертация данных») выгрузим из рабочей базы в чистую:
    1. Все нормативно-справочные данные (справочники, планы видов характеристик, классификаторы).
    2. Сформированные документы ввода остатков.
    3. Документы за актуальный несворачиваемый период (например, за последние 2 года) вместе с движениями.
    4. Необходимые регистры сведений (цены, курсы валют, контактная информация).
  4. Загрузим полученный XML-файл в новую чистую базу.
  5. Проведем проверку взаиморасчетов, складских остатков и финансового результата.

Результат: Новая база получается полностью оптимизированной, свободной от битых ссылок, фрагментации файлов и служебного мусора, а весь перенос обычно занимает от 1 до 4 часов вместо нескольких суток ожидания.

Стратегия 2. Порционное удаление данных (батчинг)

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

Посмотрим на пример программного поиска и удаления объектов пачками по 200–500 элементов:


// Пример порционного поиска ссылок и удаления
МассивУдаляемых = Новый Массив;
Выборка = Документы.ЗаказПокупателя.Выбрать(НачалоДня(Дата("20200101")), КонецДня(Дата("20201231")));

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

Если МассивУдаляемых.Количество() > 0 Тогда
    СсылкиВБазе = НайтиПоСсылкам(МассивУдаляемых);
    Если СсылкиВБазе.Количество() = 0 Тогда
        УдалитьОбъекты(МассивУдаляемых, Ложь);
    КонецЕсли;
КонецЕсли;

Также для управляемого удаления рекомендуется использовать специализированную обработку «Удаление объектов с контролем ссылок» из состава внешнего пакета «Инструменты разработчика». Она оптимизирует дерево ссылок, наглядно показывает циклические связи и позволяет удалять объекты пакетами любого заданного размера.

Стратегия 3. Подготовка базы и устранение «держателей» ссылок

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

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

Стратегия 4. Использование аппаратных ресурсов (RAM-диск или временный SQL)

Если требуется ускорить стандартный процесс в файловом режиме:

  1. Временный перенос на RAM-диск: Создадим в оперативной памяти виртуальный диск (выделив 20–25 Гбайт RAM) и скопируем файл базы данных 1Cv8.1CD туда. Скорость случайных операций чтения при контроле ссылочной целостности увеличится в десятки раз по сравнению даже с быстрыми NVMe SSD.
  2. Временный перенос в СУБД (MS SQL / PostgreSQL): Загрузим файл выгрузки .dt в клиент-серверную базу. Сервер СУБД строит более эффективные планы запросов при выполнении метода НайтиПоСсылкам(), что позволяет завершить контроль значительно быстрее. После завершения очистки базу можно выгрузить обратно в файловый вариант.

Обязательный финальный шаг: сжатие таблиц базы данных

Важно помнить: после физического удаления документов размер файла 1Cv8.1CD автоматически не уменьшится, так как файловая СУБД 1С лишь помечает страницы данных как свободные.

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

  1. В режиме Конфигуратора откроем меню Администрирование → Тестирование и исправление... и выберем пункт «Сжатие таблиц информационной базы».
  2. Либо выполним полную выгрузку базы в файл .dt и загрузим его в новую пустую папку (при выгрузке/загрузке служебные пустоты не сохраняются, и база уменьшится до фактического размера).
← На главную