В некоторых случаях бывает полезным понять, является ли значение ссылочного типа «битой ссылки» (ссылкой на не существующий объект в базе) или нет.
В первую очередь это может понадобиться для обработки исключительных ситуаций, что бы выводить пользователю более внятные сообщения,
чем это делает сама платформа. Например, не имеет смысла записывать, удалять или открывать форму несуществующего объекта.
К сожалению, у обеих платформ нет встроенных средств, позволяющих непосредственно узнать, является ли ссылка «битой» или нет.
Сразу хочется заметить, что кроме «битых ссылок» в системе имеются специальные значения «пустых ссылок» и их следует отличать друг от друга.
Предлагаю простые решения этой задачи (без построения запросов к базе данных), полученные эмпирическим путём:
1) Для платформы 1С-7.7:
- Для «битой» ссылки метод Ссылка.Выбран() и функция ПустоеЗначение() возвращают ноль;
- Для «пустой» ссылки метод Ссылка.Выбран() возвращает ноль, а функция ПустоеЗначение() единицу;
- Для «нормальной» ссылки метод Ссылка.Выбран() возвращает единицу, а функция ПустоеЗначение() ноль;
Таким образом, с точки зрения 1С-7.7 «битая» ссылка – это не пустое значение, которое не является выбранным.
2) Для платформы 1С-8.x:
Все обстаит несколько сложней.
В обоих случаях (для «битых» и «нормальных» ссылок) метод Ссылка.Пустая() и функция ЗначениеЗаполнено() ведут себя одинаково:
первый возвращает Ложь, а второй Истина.
Простоте решение было найдено случайно, при отладке ошибок времени исполнения:
- Для «битой» ссылки метод Ссылка.ПолучитьОбъект() возвращает значение Неопределено;
- Для «пустой» ссылки» метод Ссылка.ПолучитьОбъект() выбрасывает исключение:
«Ошибка при вызове метода контекста (ПолучитьОбъект): Элемент не выбран!»;
- Для «нормальной» ссылки метод Ссылка.ПолучитьОбъект() возвращает значение согласно документации;
Таким образом, с точки зрения 1С-8.х «битая» ссылка – это не пустое значение ссылочного типа,
для которого возвращается значение объекта равное Неопределено.
При этом особняком стоят ссылки на значения перечислений. У них нет метода Ссылка.ПолучитьОбъект().
И трудно вообще представить себе ситуацию, когда ссылка на перечисление может оказаться «битой».
Например, если удалить значение в конфигураторе, то при восстановлении значения функцией ЗначениеИзФайла() возвращается пустая ссылка.
Поэтому будем считать любые ссылки на перечисления «небитыми».
В архиве файла поставки находятся текстовые файлы с примерами реализации функции IsEmpty() для платформ 1С-7.7 и 1С-8.x,
возвращающей признак пустого значения и флаг «битой ссылки» для произвольного значения.