Как быстро удалить более 500 000 помеченных объектов в 1С:Бухгалтерия 2.0

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия
← На главную

Проблема очистки базы данных после масштабной свертки в 1С:Бухгалтерия 2.0 — это классическая техническая задача, с которой сталкиваются администраторы и программисты при работе с высоконагруженными системами. Когда количество объектов, помеченных на удаление, превышает 500 000, стандартная обработка «Удаление помеченных объектов» перестает справляться. Система может «повесить» сервер на десятки часов, а в худшем случае — вылететь с ошибкой нехватки памяти (дамп). В этой статье мы подробно разберем, как очистить базу от «мусора» максимально быстро и без потери целостности данных.

Почему стандартное удаление работает медленно

Прежде чем переходить к решениям, проанализируем ситуацию. Стандартный механизм 1С при удалении выполняет поиск ссылок на каждый удаляемый объект во всей базе данных. Если у вас 500 000 объектов, и в базе десятки миллионов записей в регистрах, количество проверок становится астрономическим. Кроме того, стандартная обработка пытается построить общую таблицу связей в оперативной памяти, что приводит к перегрузке ресурсов сервера.

Решение 1: Пакетное удаление объектов порциями

Самый надежный программный способ — это написание собственной обработки, которая будет удалять объекты небольшими пачками. Это позволяет избежать переполнения лога транзакций и снижает нагрузку на память. Рассмотрим алгоритм реализации такой обработки. Нам необходимо выбирать помеченные объекты и удалять их по 500–1000 штук за один проход.

Посмотрим на пример кода, который реализует такой подход:


Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Счетчик = 0;
МассивКУдалению = Новый Массив;

Пока Выборка.Следующий() Цикл
    Если Выборка.ПометкаУдаления Тогда
        МассивКУдалению.Добавить(Выборка.Ссылка);
        Счетчик = Счетчик + 1;
    КонецЕсли;

    Если Счетчик >= 1000 Тогда
        // Используем метод платформы для удаления группы объектов
        УдалитьОбъекты(МассивКУдалению, Истина); 
        МассивКУдалению.Очистить();
        Счетчик = 0;
    КонецЕсли;
КонецЦикла;

Если МассивКУдалению.Количество() > 0 Тогда
    УдалитьОбъекты(МассивКУдалению, Истина);
КонецЕсли;

Обратите внимание на параметр Истина в методе УдалитьОбъекты. Он активирует проверку ссылочной целостности. Если на объект есть ссылка, он не будет удален, и система перейдет к следующему. Это гораздо безопаснее прямого удаления.

Решение 2: Использование внешних инструментов (TTools)

Опытные разработчики часто используют готовые наборы инструментов, такие как «Портативные инструменты разработчика» (TormozIT). Эти инструменты позволяют выполнять удаление по метаданным. Проанализируем преимущества этого метода: вы можете выбрать конкретный тип документа (например, «Счета-фактуры выданные») и запустить очистку только по нему. Это разделяет одну гигантскую задачу на несколько мелких, которыми проще управлять.

Решение 3: Оптимизация на уровне SQL Server

Если ваша база работает на клиент-серверном варианте (MS SQL Server), можно значительно ускорить процесс за счет настройки самой СУБД. Выясним основные причины торможения на уровне SQL: это постоянная запись в лог транзакций (LDF-файл) и перестроение индексов.

  1. Переключение в Simple Recovery Model: Перед началом удаления переведите базу данных в простую модель восстановления. Это предотвратит бесконтрольный рост файла лога транзакций.
  2. Прямое удаление через SQL (только для опытных!): В исключительных случаях, когда ссылки уже вычищены, можно использовать DELETE FROM для очистки тяжелых таблиц регистраций или временных данных. Однако помните, что 1С хранит данные в таблицах с именами вроде _Document150, и прямое вмешательство может нарушить логику платформы.

Решение 4: Перенос данных в чистую базу (Инверсия)

Рассмотрим ситуацию, когда помеченных объектов больше, чем «живых» данных. В этом случае проще не удалять лишнее, а перенести нужное. Разберем этот способ по шагам:

  1. Создайте новую пустую базу с аналогичной конфигурацией.
  2. Используйте типовую обработку «Выгрузка и загрузка данных XML».
  3. При выгрузке установите фильтр: выгружать только те объекты, у которых ПометкаУдаления = Ложь.
  4. Обязательно включите флаг «Выгружать объекты по ссылкам», чтобы подтянулись все связанные справочники.

Этот метод часто оказывается в разы быстрее, так как платформа просто копирует полезные данные, игнорируя гигабайты мусора в регистрах сведений и накопленные хвосты от неудачных сверток.

Решение 5: Работа с регистрами сведений

Часто удаление документов блокируется записями в независимых регистрах сведений (например, «Версии объектов» или «Даты изменения объектов»). Проанализируем, как это ускорить. Вместо того чтобы удалять документ и ждать, пока система найдет записи в регистрах, сначала очистите сами регистры программно:


Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
// Если нужно очистить весь регистр для ускорения
Набор.Записать(Истина); 

Когда «тяжелые» регистры очищены, проверка ссылок при удалении документов будет проходить значительно быстрее. Вы можете использовать объект Запрос, чтобы найти все уникальные регистраторы, помеченные на удаление, и очистить их наборы записей в цикле.

Важные рекомендации при массовой очистке

При выполнении таких операций крайне важно соблюдать последовательность действий:

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

← На главную