Когда объект был удален непосредственно, то все ссылки на него в справочниках, в документах, в регистрах стали битыми и отображаются следующим образом:<Объект не найден> (16:bca8000c6efdd52111d8eaba7c9706eb)
Битая ссылка не является пустой. Т.е. метод Пустая() возвращает Ложь. Определить, что ссылка битая можно так:
1 2 3 4 5 |
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда //битая ссылка КонецЕсли; // или так (НО ненадежно): Если Лев(СокрЛП(Ссылка),18) = "<Объект не найден>" Тогда |
1 2 3 4 5 6 |
// Еще вариант (действует для обьектов, которые имеют ссылку) Попытка обьект=Ссылка.Ссылка; Исключение сообщить("битая"); КонецПопытки; |
И последний вариант для проверки в запросах:
ГДЕ Объект.РеквизитОбъекта ЕСТЬ NULL И Не Объект=&ПустаяСсылкаОбъекта
Ниже дана программа для удаления записей регистров, у которых регистратор — битая ссылка, т.е. не существует в базе.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Процедура УдалениеБитыхСсылок(ИмяРегистра,ТипРегистра,ТипРегистраЗ) МенеджерРегистра = ТипРегистра[ИмяРегистра]; Запрос = Новый Запрос(" |ВЫБРАТЬ Регистратор |ИЗ "+ТипРегистраЗ+"."+ИмяРегистра+" |ГДЕ Регистратор.Ссылка ЕСТЬ NULL И НЕ Регистратор = &ПустаяСсылкаДокумента"); Запрос.УстановитьПараметр("ПустаяСсылкаДокумента",Неопределено); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Набор = ТипРегистра[ИмяРегистра].СоздатьНаборЗаписей(); Набор.Отбор.Регистратор.Установить(Выборка.Регистратор); Набор.Записать(); ОбработкаПрерыванияПользователя(); Состояние(""+ТипРегистра+" "+ИмяРегистра); КонецЦикла; КонецПроцедуры Процедура КнопкаВыполнитьНажатие(Кнопка) Для Каждого пРегистр из Метаданные.РегистрыСведений Цикл Подчинен = (пРегистр.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору); Если Подчинен Тогда УдалениеБитыхСсылок(пРегистр.Имя,РегистрыСведений,"РегистрСведений") КонецЕсли; КонецЦикла; Для Каждого пРегистр из Метаданные.РегистрыБухгалтерии Цикл УдалениеБитыхСсылок(пРегистр.Имя,РегистрыБухгалтерии,"РегистрБухгалтерии") КонецЦикла; Для Каждого пРегистр из Метаданные.РегистрыРасчета Цикл УдалениеБитыхСсылок(пРегистр.Имя,РегистрыРасчета,"РегистрРасчета") КонецЦикла; Для Каждого пРегистр из Метаданные.РегистрыНакопления Цикл УдалениеБитыхСсылок(пРегистр.Имя,РегистрыНакопления,"РегистрНакопления") КонецЦикла; КонецПроцедуры |