При работе с крупными информационными базами 1С (объемом в сотни гигабайт) стандартные механизмы поиска ссылок и удаления объектов сталкиваются с серьезным падением производительности. Метод НайтиПоСсылкам может вызывать зависание системы на несколько суток, так как по умолчанию он ищет абсолютно все ссылки на проверяемые элементы во всех таблицах СУБД. Разберем, почему возникает эта проблема и какие существуют эффективные пути оптимизации данного процесса.
Проанализируем основные факторы, которые замедляют работу стандартных обработок и платформенного метода НайтиПоСсылкам:
НайтиПоСсылкам собирает абсолютно все входящие ссылки на объект. Однако для задачи пометки или удаления элемента достаточно установить факт наличия хотя бы одной ссылки.Рассмотри подход с программным ограничением области проверки. Вместо поиска по всей базе данных можно заранее проанализировать метаданные и передавать в метод НайтиПоСсылкам только те типы объектов, в которых теоретически могут содержаться ссылки на проверяемые элементы.
Для этого используются 3-й и 4-й параметры метода НайтиПоСсылкам:
// Пример ограничения области поиска целевыми объектами метаданных
УстановитьПривилегированныйРежим(Истина);
МассивВключенныхОбъектов = Новый Массив;
МассивВключенныхОбъектов.Добавить(Метаданные.Справочники.Номенклатура);
МассивВключенныхОбъектов.Добавить(Метаданные.Документы.РеализацияТоваровУслуг);
МассивНайденныхСсылок = НайтиПоСсылкам(МассивУдаляемыхСсылок, , МассивВключенныхОбъектов);
Вызов УстановитьПривилегированныйРежим(Истина) позволяет отключить RLS и выполнить запрос на максимальной скорости.
Разберем по шагам логику пакетной обработки. Не следует передавать в поиск весь массив справочника целиком. Рекомендуется разбивать проверяемые элементы на небольшие пачки (порции от 100 до 500 элементов).
Это дает следующие преимущества:
ФоновыеЗадания.Выполнить).Проанализируем применение специализированных внешних инструментов. Подсистема «Инструменты разработчика» содержит эффективный инструмент — «Удаление объектов с контролем ссылок».
Алгоритм работы с данным инструментом выглядит следующим образом:
Посмотрим на пример архитектурного решения с использованием запросов платформы 1С. Для максимально быстрого определения того, используется ли элемент, можно сформировать динамический запрос к таблицам-приемникам с использованием конструкций ВЫБРАТЬ ПЕРВЫЕ 1 и ОБЪЕДИНИТЬ ВСЕ.
Запрос прекращает сканирование конкретной таблицы сразу же после нахождения первого совпадения, что экономит значительное количество ресурсов СУБД по сравнению со стандартным поиском.
Выясним возможные риски при удалении элементов без контроля ссылочной целостности:
УдалитьОбъекты(МассивСсылок, Ложь) без контроля ссылок может привести к появлению записей вида <Объект не найден> в регистрах сведений и документах, что нарушит работу отчетов и процедур проведения.