При удалении объектов или наведении порядка в информационной базе 1С часто возникает задача: найти все места, где используется конкретный объект, и очистить или заменить ссылки на него. Функция НайтиПоСсылкам позволяет сформировать таблицу найденных ссылок, однако дальнейшая очистка требует учета специфики различных типов метаданных (справочники, документы, регистры). Проанализируем, как правильно обработать каждый случай и избежать ошибок целостности данных.
Функция НайтиПоСсылкам принимает массив ссылок и возвращает таблицу значений со следующими ключевыми колонками:
Рассмотрим пошагово, как выполнять очистку или замену ссылок в зависимости от структуры найденных данных.
Для простых ссылочных объектов алгоритм зависит от того, где именно находится ссылка — в шапке объекта или в его табличной части.
Для реквизитов шапки достаточно получить объект, очистить или заменить значение реквизита и записать его. Если реквизит имеет составной тип, ему присваивается значение Неопределено. Для однозначного типа используется пустая ссылка соответствующего типа (например, Справочники.Номенклатура.ПустаяСсылка()).
Проанализируем пример кода для очистки реквизита шапки:
Объект = СсылкаНаОбъект.ПолучитьОбъект();
Объект.Реквизит = Неопределено; // Или Справочники.ИмяСправочника.ПустаяСсылка()
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();
Если ссылка находится внутри табличной части, очистка конкретной ячейки может привести к появлению незаполненной строки, что часто нарушает правила проверки заполнения. В таких случаях строку табличной части обычно полностью удаляют методом Удалить().
Важно помнить, что флаг Объект.ОбменДанными.Загрузка = Истина позволяет обойти встроенные проверки при записи, однако применять его следует с осторожностью, чтобы не нарушить бизнес-логику информационной базы.
Разберем случаи, когда ссылки найдены в регистрах различных типов:
СоздатьНаборЗаписей(). Если ссылка находится в ресурсах или реквизитах, значение считывается и перезаписывается. Если ссылка находится в измерениях, изменить ее «на месте» невозможно — потребуется удалить запись из набора или пересоздать ее с новым ключом.ОбменДанными.Загрузка = Истина.Посмотрим на пример работы с набором записей регистра сведений:
НаборЗаписей = РегистрыСведений.ЗначенияРеквизитов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(СсылкаНаОбъект);
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
Запись.Значение = Неопределено;
КонецЦикла;
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();
В современных конфигурациях для массовой замены или очистки ссылок рекомендуется применять встроенные методы БСП. Функция ОбщегоНазначения.ЗаменитьСсылки() или механизмы подсистемы «Поиск и удаление дублей» берут на себя автоматическую обработку всех видов регистров, каскадных связей и правильную обработку блокировок в транзакции.
Для ручной интерактивной работы пользователям и администраторам доступна типовая обработка «Поиск и замена значений».
Если объект был удален напрямую без контроля ссылочной целостности, в базе остаются битые ссылки (значения вида Объект не найден). Чтобы массово очистить такие ссылки во всех таблицах базы данных, используем штатную процедуру платформы «Тестирование и исправление информационной базы» с выбором параметра «Очищать ссылки» при обнаружении ссылок на несуществующие объекты.