При отладке и тестировании запросов в 1С часто возникает задача проверить, как запрос отработает с пустым значением ссылочного типа. Например, найти все элементы справочника, у которых не указан родитель, или выбрать документы без договора-основания. В консоли запросов не всегда очевидно, как задать в качестве параметра именно пустую ссылку, а не просто оставить поле пустым. Разберем эту задачу и рассмотрим правильные и надежные способы ее решения.
Самый правильный, документированный и надежный способ указать пустую ссылку в параметре запроса — это использовать встроенную функцию языка запросов ЗНАЧЕНИЕ(). Этот метод гарантирует, что платформа корректно распознает тип данных и передаст в запрос именно типизированную пустую ссылку.
Представим, что у нас есть запрос, который выбирает номенклатуру по родителю. Параметр для родителя назовем &Родитель.
ВЫБРАТЬ
Номенклатура.Ссылка,
Номенклатура.Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = &Родитель
Чтобы найти элементы верхнего уровня (у которых родитель — пустая ссылка), выполним следующие шаги в консоли запросов:
&Родитель.
ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
Важный момент: необходимо явно указать полный путь к нужной пустой ссылке, включая тип объекта метаданных (Справочник), его имя (Номенклатура) и само свойство ПустаяСсылка.
После выполнения запроса с таким параметром система отберет только те записи, у которых поле Родитель действительно равно пустой ссылке справочника "Номенклатура". Этот способ является универсальным и будет работать во всех версиях платформы 1С:Предприятие 8.
В ходе обсуждений на форумах опытные разработчики поделились более короткими вариантами синтаксиса, которые также работают в некоторых версиях платформы. Например, в выражении для параметра можно опустить слово ПустаяСсылка и оставить только точку в конце.
ЗНАЧЕНИЕ(Справочник.Номенклатура.)
Такая запись может сработать и дать тот же результат. Однако здесь мы сталкиваемся с недокументированными возможностями платформы. Главный риск их использования заключается в том, что фирма "1С" не гарантирует их работоспособность в будущих релизах. То, что работает сегодня, может перестать работать после очередного обновления, и ваш код или сохраненные настройки запросов вызовут ошибку.
Вывод: для быстрой разовой проверки в консоли такой "лайфхак" использовать можно, но встраивать его в код обработок, отчетов или сохранять для постоянного использования категорически не рекомендуется. Лучше придерживаться официального синтаксиса.
Начинающие разработчики часто путают понятия "пустая ссылка" и "NULL". Важно понимать их фундаментальное различие, так как это влияет на логику построения запросов.
Справочники.Контрагенты.ПустаяСсылка() — это не просто пустота, а конкретно "пустой контрагент". Сравнение в запросе ГДЕ Поле = &ПустойПараметр будет корректно работать именно с пустой ссылкой.NULL чаще всего появляется в результате левых или правых соединений таблиц, когда для записи из одной таблицы не нашлось соответствия в другой.Сравнивать что-либо с NULL с помощью знака равенства (=) нельзя. Для проверки на NULL существуют специальные операторы: ЕСТЬ NULL и ЕСТЬ НЕ NULL.
Посмотрим на пример. Допустим, мы хотим найти контрагентов, для которых не заполнена контактная информация в соответствующем регистре сведений. Мы соединяем справочник контрагентов с регистром, и для тех, у кого нет записей в регистре, поля из него будут иметь значение NULL.
ВЫБРАТЬ
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
ПО Контрагенты.Ссылка = КонтактнаяИнформация.Объект
ГДЕ
КонтактнаяИнформация.Объект ЕСТЬ NULL
Этот запрос вернет всех контрагентов, для которых не нашлось ни одной записи в регистре КонтактнаяИнформация. Попытка написать ГДЕ КонтактнаяИнформация.Объект = NULL не приведет к желаемому результату.
Также в запросах есть полезная функция ЕСТЬNULL(ПроверяемоеПоле, ЗначениеЗамены), которая позволяет заменить NULL на другое значение прямо в тексте запроса. Например, ЕСТЬNULL(СуммаДокумента, 0) вернет сумму документа, если она есть, или 0, если значение поля оказалось NULL.