Как программно очистить или заменить все ссылки на объект в 1С

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

При удалении объектов или наведении порядка в информационной базе 1С часто возникает задача: найти все места, где используется конкретный объект, и очистить или заменить ссылки на него. Функция НайтиПоСсылкам позволяет сформировать таблицу найденных ссылок, однако дальнейшая очистка требует учета специфики различных типов метаданных (справочники, документы, регистры). Проанализируем, как правильно обработать каждый случай и избежать ошибок целостности данных.

Анализ результатов работы функции НайтиПоСсылкам

Функция НайтиПоСсылкам принимает массив ссылок и возвращает таблицу значений со следующими ключевыми колонками:

  1. Ссылка — искомый ссылочный объект, на который ссылаются другие данные.
  2. Данные — объект-источник (ссылка на документ или справочник, ключ записи регистра или набор записей).
  3. Метаданные — объект метаданных реквизита, табличной части или измерения/ресурса, где была обнаружена ссылка.

Рассмотрим пошагово, как выполнять очистку или замену ссылок в зависимости от структуры найденных данных.

Очистка и замена ссылок в ссылочных объектах (справочники, документы)

Для простых ссылочных объектов алгоритм зависит от того, где именно находится ссылка — в шапке объекта или в его табличной части.

Для реквизитов шапки достаточно получить объект, очистить или заменить значение реквизита и записать его. Если реквизит имеет составной тип, ему присваивается значение Неопределено. Для однозначного типа используется пустая ссылка соответствующего типа (например, Справочники.Номенклатура.ПустаяСсылка()).

Проанализируем пример кода для очистки реквизита шапки:


Объект = СсылкаНаОбъект.ПолучитьОбъект();
Объект.Реквизит = Неопределено; // Или Справочники.ИмяСправочника.ПустаяСсылка()
Объект.ОбменДанными.Загрузка = Истина;
Объект.Записать();

Если ссылка находится внутри табличной части, очистка конкретной ячейки может привести к появлению незаполненной строки, что часто нарушает правила проверки заполнения. В таких случаях строку табличной части обычно полностью удаляют методом Удалить().

Важно помнить, что флаг Объект.ОбменДанными.Загрузка = Истина позволяет обойти встроенные проверки при записи, однако применять его следует с осторожностью, чтобы не нарушить бизнес-логику информационной базы.

Особенности работы с регистрами сведений и движений

Разберем случаи, когда ссылки найдены в регистрах различных типов:

  1. Независимые регистры сведений: Для изменения записи создается набор записей с помощью метода СоздатьНаборЗаписей(). Если ссылка находится в ресурсах или реквизитах, значение считывается и перезаписывается. Если ссылка находится в измерениях, изменить ее «на месте» невозможно — потребуется удалить запись из набора или пересоздать ее с новым ключом.
  2. Подчиненные регистры и регистры накопления: Записи этих регистров строго привязаны к документу-регистратору. Для корректной очистки необходимо либо редактировать и перепроводить сам документ-регистратор, либо перезаписывать набор записей с установленным отбором по регистратору и флагом ОбменДанными.Загрузка = Истина.

Посмотрим на пример работы с набором записей регистра сведений:


НаборЗаписей = РегистрыСведений.ЗначенияРеквизитов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(СсылкаНаОбъект);
НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл
    Запись.Значение = Неопределено;
КонецЦикла;

НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать();

Использование функций Библиотеки Стандартных Подсистем (БСП)

В современных конфигурациях для массовой замены или очистки ссылок рекомендуется применять встроенные методы БСП. Функция ОбщегоНазначения.ЗаменитьСсылки() или механизмы подсистемы «Поиск и удаление дублей» берут на себя автоматическую обработку всех видов регистров, каскадных связей и правильную обработку блокировок в транзакции.

Для ручной интерактивной работы пользователям и администраторам доступна типовая обработка «Поиск и замена значений».

Автоматическая очистка через «Тестирование и исправление»

Если объект был удален напрямую без контроля ссылочной целостности, в базе остаются битые ссылки (значения вида Объект не найден). Чтобы массово очистить такие ссылки во всех таблицах базы данных, используем штатную процедуру платформы «Тестирование и исправление информационной базы» с выбором параметра «Очищать ссылки» при обнаружении ссылок на несуществующие объекты.

← На главную