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