В крупных информационных системах, таких как 1С:ERP или 1С:Комплексная автоматизация, стандартная процедура удаления помеченных объектов часто превращается в проблему. Огромный объем данных приводит к тому, что регламентное задание не успевает завершиться за ночь. Основная причина — бесконечные проверки объектов, которые годами висят с пометкой на удаление, но не могут быть стерты из-за ссылок в исторических документах или регистрах. В итоге «свежие» объекты, которые можно удалить, просто не дожидаются своей очереди.
Разберем детально, как можно оптимизировать этот процесс, внедрив механизмы фильтрации, используя возможности платформы и правильные архитектурные подходы.
Проанализируем ситуацию. Стандартный механизм при каждом запуске выполняет поиск ссылок для всех объектов, помеченных на удаление. Если в базе 100 000 таких объектов, и 90% из них имеют ссылки, система каждую ночь тратит ресурсы на бесполезную работу, проверяя одни и те же «неудаляемые» элементы. Наша задача — научить систему «запоминать» такие объекты и временно исключать их из проверки.
Наиболее эффективным техническим решением является создание вспомогательного Регистра сведений, в котором будут храниться ссылки на объекты, которые не удалось удалить при прошлой итерации. Рассмотрим по шагам, как это реализовать:
ИсключенияПриУдаленииОбъектов.Объект с типом ЛюбаяСсылка. Обязательно установим свойство Ведущее для этого измерения, чтобы при физическом удалении объекта запись из этого регистра исчезала автоматически.Рассмотрим пример кода, который можно использовать для фильтрации массива объектов перед началом поиска ссылок:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Исключения.Объект КАК Объект
|ИЗ
| РегистрСведений.ИсключенияПриУдаленииОбъектов КАК Исключения";
СписокИсключений = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Объект");
// Далее в коде формирования списка на удаление:
Для Каждого ТекущийОбъект Из МассивПомеченных Цикл
Если СписокИсключений.Найти(ТекущийОбъект) <> Неопределено Тогда
Продолжить; // Пропускаем объект, так как он в списке исключений
КонецЕсли;
// Добавляем в обработку
КонецЦикла;
Важный момент: актуальность данных. Чтобы объекты не зависли в исключениях навсегда (ведь пользователь может очистить ссылку в документе), необходимо предусмотреть механизм очистки регистра. Оптимально — очищать этот регистр раз в неделю или месяц перед полным прогоном удаления.
Выясним причину, почему ссылки в регистрах мешают удалению. Часто это независимые регистры сведений, где объект является измерением. Если мы сделаем это измерение Ведущим, то при удалении объекта система автоматически удалит все связанные записи в этом регистре. Это мощный инструмент, но использовать его нужно осторожно: убедитесь, что удаление этих записей не нарушит логику учета.
Иногда технические методы стоит дополнить административными. Посмотрим на практику уведомления ответственных. Если объект не удалился, можно программно снимать с него пометку удаления и отправлять письмо пользователю, который ее установил, с перечнем мешающих ссылок.
Другой вариант — перемещение «неудаляемых» объектов в специальную группу «Архив» или «Удаленные». Это визуально очистит справочники для пользователей и позволит исключить эти группы из регламентного задания на удаление. Для реализации этого подхода:
В современных версиях Библиотеки стандартных подсистем (БСП), на которых построена ERP 2.4/2.5, реализован механизм «Фонового удаления объектов». Разберем, чем он полезен:
Если ваша конфигурация позволяет, обязательно переключитесь в режим «Удалять объекты порциями» в разделе Администрирование — Обслуживание — Удаление помеченных объектов.
Проанализируем ситуацию с точки зрения производительности SQL. Массовое удаление и постоянный поиск ссылок создают огромную нагрузку на tempdb и лог транзакций. Проверьте следующие параметры:
ВерсииОбъектов. Если история изменений для помеченного на удаление объекта больше не нужна, имеет смысл программно очищать историю версий перед запуском удаления.Если объект нельзя удалить из-за ссылки в очень старом периоде (например, в закрытом 2015 году), который физически нельзя редактировать, можно использовать метод технической очистки. Создается обработка, которая через ОбменДанными.Загрузка = Истина находит ссылку в старом регистре и заменяет ее на Неопределено или пустую ссылку. После этого объект беспрепятственно удаляется стандартным механизмом.
Резюмируем: Для стабильной работы большой базы лучше всего комбинировать регистр исключений (для отсечения заведомо «проблемных» объектов) с порционным удалением через стандартные механизмы БСП. Это позволит системе постепенно «разгребать» очередь помеченных объектов, не парализуя работу пользователей утром.