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

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

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

Причины низкой скорости стандартного поиска ссылок

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

  1. Влияние RLS (Ограничения прав на уровне записей): Если процедура запускается в сеансе пользователя с ограниченными правами, платформа 1С накладывает условия RLS на каждую проверяемую таблицу, что приводит к критическому снижению скорости работы СУБД.
  2. Избыточность сбора данных: Метод НайтиПоСсылкам собирает абсолютно все входящие ссылки на объект. Однако для задачи пометки или удаления элемента достаточно установить факт наличия хотя бы одной ссылки.
  3. Большие объемы передаваемых массивов: Передача сотен тысяч элементов в один вызов перегружает оптимизатор SQL и системную базу данных TempDB.
  4. Отсутствие индексов: Если реквизиты составного типа не проиндексированы в метаданных, СУБД выполняет полное сканирование таблиц (Table Scan).

Способы ускорения поиска и удаления неиспользуемых элементов

1. Сужение области поиска и передача конкретных метаданных

Рассмотри подход с программным ограничением области проверки. Вместо поиска по всей базе данных можно заранее проанализировать метаданные и передавать в метод НайтиПоСсылкам только те типы объектов, в которых теоретически могут содержаться ссылки на проверяемые элементы.

Для этого используются 3-й и 4-й параметры метода НайтиПоСсылкам:


// Пример ограничения области поиска целевыми объектами метаданных
УстановитьПривилегированныйРежим(Истина);

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

МассивНайденныхСсылок = НайтиПоСсылкам(МассивУдаляемыхСсылок, , МассивВключенныхОбъектов);

Вызов УстановитьПривилегированныйРежим(Истина) позволяет отключить RLS и выполнить запрос на максимальной скорости.

2. Оптимизация поиска через порционную обработку

Разберем по шагам логику пакетной обработки. Не следует передавать в поиск весь массив справочника целиком. Рекомендуется разбивать проверяемые элементы на небольшие пачки (порции от 100 до 500 элементов).

Это дает следующие преимущества:

  1. СУБД эффективно использует индексы и оперативную память.
  2. Исключается перегрузка TempDB на сервере SQL.
  3. Появляется возможность организовать параллельное выполнение через фоновые задания (ФоновыеЗадания.Выполнить).

3. Использование подсистемы «Инструменты разработчика» (ИР)

Проанализируем применение специализированных внешних инструментов. Подсистема «Инструменты разработчика» содержит эффективный инструмент — «Удаление объектов с контролем ссылок».

Алгоритм работы с данным инструментом выглядит следующим образом:

  1. В инструменте «Удаление объектов с контролем ссылок» выполняется анализ выбранной таблицы (например, справочника) и определяются объекты, на которые нет полезных ссылок.
  2. Найденные элементы-кандидаты передаются в инструмент «Подбор и обработка объектов».
  3. В инструменте подбора выполняется групповая пометка на удаление или непосредственное удаление подготовленных объектов.

4. Написание точечных запросов с конструкцией «ВЫБРАТЬ ПЕРВЫЕ 1»

Посмотрим на пример архитектурного решения с использованием запросов платформы 1С. Для максимально быстрого определения того, используется ли элемент, можно сформировать динамический запрос к таблицам-приемникам с использованием конструкций ВЫБРАТЬ ПЕРВЫЕ 1 и ОБЪЕДИНИТЬ ВСЕ.

Запрос прекращает сканирование конкретной таблицы сразу же после нахождения первого совпадения, что экономит значительное количество ресурсов СУБД по сравнению со стандартным поиском.

Важные предостережения при удалении

Выясним возможные риски при удалении элементов без контроля ссылочной целостности:

  1. Появление битых ссылок: Удаление объектов методом УдалитьОбъекты(МассивСсылок, Ложь) без контроля ссылок может привести к появлению записей вида <Объект не найден> в регистрах сведений и документах, что нарушит работу отчетов и процедур проведения.
  2. Работа в немонопольном режиме: В промежуток времени между проверкой отсутствия ссылок и физическим удалением пользователь может успеть выбрать данный элемент в новом документе.
← На главную