Как передать пустую ссылку в параметр консоли запросов 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При отладке и тестировании запросов в 1С часто возникает задача проверить, как запрос отработает с пустым значением ссылочного типа. Например, найти все элементы справочника, у которых не указан родитель, или выбрать документы без договора-основания. В консоли запросов не всегда очевидно, как задать в качестве параметра именно пустую ссылку, а не просто оставить поле пустым. Разберем эту задачу и рассмотрим правильные и надежные способы ее решения.

Способ 1: Использование функции ЗНАЧЕНИЕ() — рекомендуемый метод

Самый правильный, документированный и надежный способ указать пустую ссылку в параметре запроса — это использовать встроенную функцию языка запросов ЗНАЧЕНИЕ(). Этот метод гарантирует, что платформа корректно распознает тип данных и передаст в запрос именно типизированную пустую ссылку.

Представим, что у нас есть запрос, который выбирает номенклатуру по родителю. Параметр для родителя назовем &Родитель.


ВЫБРАТЬ
    Номенклатура.Ссылка,
    Номенклатура.Наименование
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура.Родитель = &Родитель

Чтобы найти элементы верхнего уровня (у которых родитель — пустая ссылка), выполним следующие шаги в консоли запросов:

  1. Перейдем на вкладку "Параметры".
  2. Найдем в списке наш параметр &Родитель.
  3. В колонке "Значение" для этого параметра нужно ввести не значение, а выражение. Для этого впишем следующую конструкцию:

ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)

Важный момент: необходимо явно указать полный путь к нужной пустой ссылке, включая тип объекта метаданных (Справочник), его имя (Номенклатура) и само свойство ПустаяСсылка.

После выполнения запроса с таким параметром система отберет только те записи, у которых поле Родитель действительно равно пустой ссылке справочника "Номенклатура". Этот способ является универсальным и будет работать во всех версиях платформы 1С:Предприятие 8.

Способ 2: Недокументированные сокращения (использовать с осторожностью)

В ходе обсуждений на форумах опытные разработчики поделились более короткими вариантами синтаксиса, которые также работают в некоторых версиях платформы. Например, в выражении для параметра можно опустить слово ПустаяСсылка и оставить только точку в конце.

ЗНАЧЕНИЕ(Справочник.Номенклатура.)

Такая запись может сработать и дать тот же результат. Однако здесь мы сталкиваемся с недокументированными возможностями платформы. Главный риск их использования заключается в том, что фирма "1С" не гарантирует их работоспособность в будущих релизах. То, что работает сегодня, может перестать работать после очередного обновления, и ваш код или сохраненные настройки запросов вызовут ошибку.

Вывод: для быстрой разовой проверки в консоли такой "лайфхак" использовать можно, но встраивать его в код обработок, отчетов или сохранять для постоянного использования категорически не рекомендуется. Лучше придерживаться официального синтаксиса.

Важное различие: Пустая ссылка и NULL

Начинающие разработчики часто путают понятия "пустая ссылка" и "NULL". Важно понимать их фундаментальное различие, так как это влияет на логику построения запросов.

Сравнивать что-либо с NULL с помощью знака равенства (=) нельзя. Для проверки на NULL существуют специальные операторы: ЕСТЬ NULL и ЕСТЬ НЕ NULL.

Посмотрим на пример. Допустим, мы хотим найти контрагентов, для которых не заполнена контактная информация в соответствующем регистре сведений. Мы соединяем справочник контрагентов с регистром, и для тех, у кого нет записей в регистре, поля из него будут иметь значение NULL.


ВЫБРАТЬ
    Контрагенты.Ссылка
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
        ПО Контрагенты.Ссылка = КонтактнаяИнформация.Объект
ГДЕ
    КонтактнаяИнформация.Объект ЕСТЬ NULL

Этот запрос вернет всех контрагентов, для которых не нашлось ни одной записи в регистре КонтактнаяИнформация. Попытка написать ГДЕ КонтактнаяИнформация.Объект = NULL не приведет к желаемому результату.

Также в запросах есть полезная функция ЕСТЬNULL(ПроверяемоеПоле, ЗначениеЗамены), которая позволяет заменить NULL на другое значение прямо в тексте запроса. Например, ЕСТЬNULL(СуммаДокумента, 0) вернет сумму документа, если она есть, или 0, если значение поля оказалось NULL.

← На главную