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