При переносе данных или некачественной интеграции в информационных базах 1С часто образуется множество неиспользуемых элементов справочников (например, «Номенклатура», «Контрагенты»). В результате из десятков тысяч позиций в реальном документообороте задействована лишь часть, а остальное создает ненужную нагрузку на базу. Рассмотрим, как найти и пометить на удаление объекты, не имеющие ссылочных связей, с учетом особенностей работы крупных клиент-серверных баз.
Для массового поиска и удаления элементов без кастомной разработки удобнее всего задействовать специализированный комплекс инструментов. Разберем по шагам, как выполнить процедуру:
Стандартный системный метод поиска ссылок может выполняться слишком долго на базах объемом от 50–60 ГБ. В таких случаях эффективнее написать целевой запрос, проверяющий наличие элементов в регистрах накопления, сведений или табличных частях ключевых документов.
Рассмотрим пример запроса для поиска элементов справочника Номенклатура, которые не участвовали в оборотах регистра Закупки:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Закупки.Обороты КАК ЗакупкиОбороты
| ПО Номенклатура.Ссылка = ЗакупкиОбороты.Номенклатура
|ГДЕ
| ЗакупкиОбороты.Номенклатура ЕСТЬ NULL
| И НЕ Номенклатура.ЭтоГруппа";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
// Логика пометки на удаление найденного элемента
КонецЦикла;
Выборка элементов с результатом NULL в левом соединении позволяет быстро отфильтровать элементы, так как СУБД использует индексы существующих таблиц, а не сканирует всю конфигурацию.
В платформе 1С предусмотрен встроенный метод глобального контекста НайтиПоСсылкам:
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаОбъект);
НайденныеСсылки = НайтиПоСсылкам(МассивСсылок);
Если НайденныеСсылки.Количество() = 0 Тогда
// На объект нет ссылок в базе
КонецЕсли;
Важное ограничение: метод НайтиПоСсылкам выполняет сканирование всех таблиц информационной базы, допускающих хранение проверяемого типа. На базах MS SQL / PostgreSQL размером в десятки гигабайт это приводит к длительному выполнению и высокой нагрузке на дисковый ввод-вывод. Для ускорения необходимо жестко ограничивать область поиска с помощью параметров ОбластьПоиска и ВключитьОбъекты, либо использовать альтернативные функции БСП, такие как ОбщегоНазначения.ЕстьСсылкиНаОбъект.
При попытке ускорить обработку большого массива данных путем распараллеливания процессов на уровне нескольких фоновых заданий или клиентов часто возникают взаимоблокировки (Deadlocks). Проанализируем причины этого явления:
УстановитьПометкуУдаления платформа 1С производит запись объекта. В типовых конфигурациях при этом срабатывают подписки на события, записывающие данные в регистры ВерсииОбъектов (версионирование), регистры прав доступа, штрихкодов или индексы полнотекстового поиска.Для предотвращения блокировок при чистке крупных баз рекомендуем выполнять обработку порциями (пакетами по 500–1000 элементов) в рамках отдельных транзакций, а при возможности — проводить работы в монопольном режиме с временным отключением служебных подписок на события и версионирования.