Проблема очистки базы данных после масштабной свертки в 1С:Бухгалтерия 2.0 — это классическая техническая задача, с которой сталкиваются администраторы и программисты при работе с высоконагруженными системами. Когда количество объектов, помеченных на удаление, превышает 500 000, стандартная обработка «Удаление помеченных объектов» перестает справляться. Система может «повесить» сервер на десятки часов, а в худшем случае — вылететь с ошибкой нехватки памяти (дамп). В этой статье мы подробно разберем, как очистить базу от «мусора» максимально быстро и без потери целостности данных.
Прежде чем переходить к решениям, проанализируем ситуацию. Стандартный механизм 1С при удалении выполняет поиск ссылок на каждый удаляемый объект во всей базе данных. Если у вас 500 000 объектов, и в базе десятки миллионов записей в регистрах, количество проверок становится астрономическим. Кроме того, стандартная обработка пытается построить общую таблицу связей в оперативной памяти, что приводит к перегрузке ресурсов сервера.
Самый надежный программный способ — это написание собственной обработки, которая будет удалять объекты небольшими пачками. Это позволяет избежать переполнения лога транзакций и снижает нагрузку на память. Рассмотрим алгоритм реализации такой обработки. Нам необходимо выбирать помеченные объекты и удалять их по 500–1000 штук за один проход.
Посмотрим на пример кода, который реализует такой подход:
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Счетчик = 0;
МассивКУдалению = Новый Массив;
Пока Выборка.Следующий() Цикл
Если Выборка.ПометкаУдаления Тогда
МассивКУдалению.Добавить(Выборка.Ссылка);
Счетчик = Счетчик + 1;
КонецЕсли;
Если Счетчик >= 1000 Тогда
// Используем метод платформы для удаления группы объектов
УдалитьОбъекты(МассивКУдалению, Истина);
МассивКУдалению.Очистить();
Счетчик = 0;
КонецЕсли;
КонецЦикла;
Если МассивКУдалению.Количество() > 0 Тогда
УдалитьОбъекты(МассивКУдалению, Истина);
КонецЕсли;
Обратите внимание на параметр Истина в методе УдалитьОбъекты. Он активирует проверку ссылочной целостности. Если на объект есть ссылка, он не будет удален, и система перейдет к следующему. Это гораздо безопаснее прямого удаления.
Опытные разработчики часто используют готовые наборы инструментов, такие как «Портативные инструменты разработчика» (TormozIT). Эти инструменты позволяют выполнять удаление по метаданным. Проанализируем преимущества этого метода: вы можете выбрать конкретный тип документа (например, «Счета-фактуры выданные») и запустить очистку только по нему. Это разделяет одну гигантскую задачу на несколько мелких, которыми проще управлять.
Если ваша база работает на клиент-серверном варианте (MS SQL Server), можно значительно ускорить процесс за счет настройки самой СУБД. Выясним основные причины торможения на уровне SQL: это постоянная запись в лог транзакций (LDF-файл) и перестроение индексов.
DELETE FROM для очистки тяжелых таблиц регистраций или временных данных. Однако помните, что 1С хранит данные в таблицах с именами вроде _Document150, и прямое вмешательство может нарушить логику платформы.Рассмотрим ситуацию, когда помеченных объектов больше, чем «живых» данных. В этом случае проще не удалять лишнее, а перенести нужное. Разберем этот способ по шагам:
ПометкаУдаления = Ложь.Этот метод часто оказывается в разы быстрее, так как платформа просто копирует полезные данные, игнорируя гигабайты мусора в регистрах сведений и накопленные хвосты от неудачных сверток.
Часто удаление документов блокируется записями в независимых регистрах сведений (например, «Версии объектов» или «Даты изменения объектов»). Проанализируем, как это ускорить. Вместо того чтобы удалять документ и ждать, пока система найдет записи в регистрах, сначала очистите сами регистры программно:
Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
// Если нужно очистить весь регистр для ускорения
Набор.Записать(Истина);
Когда «тяжелые» регистры очищены, проверка ссылок при удалении документов будет проходить значительно быстрее. Вы можете использовать объект Запрос, чтобы найти все уникальные регистраторы, помеченные на удаление, и очистить их наборы записей в цикле.
При выполнении таких операций крайне важно соблюдать последовательность действий:
Table Lock).Подводя итог, можно сказать, что ключом к успешному удалению огромных массивов данных в 1С является порционность и разделение ответственности между платформой и СУБД. Используя пакетную обработку или метод инверсии (перенос в чистую базу), вы сэкономите время и сохраните стабильность системы.