К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить пустую ссылку в запросе 1С

Как получить пустую ссылку в запросе 1С: функция ЗНАЧЕНИЕ, параметры запроса, проверка ссылок на пустоту, сравнение в отборах и виртуальных таблицах.

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

Ниже разобраны все рабочие способы получения пустой ссылки в запросе: через функцию ЗНАЧЕНИЕ, через параметр, программное формирование пустой ссылки и передачу её в запрос, а также типичные ошибки при сравнении составных типов реквизитов.

Что такое пустая ссылка и зачем она нужна в запросе

Пустая ссылка — это ссылочное значение, которое имеет определённый тип (например, «СправочникСсылка.Номенклатура»), но не указывает ни на один реальный объект базы данных. У каждого ссылочного типа ровно одна пустая ссылка. Она не равна NULL: NULL в запросах означает отсутствие значения вообще (например, при левом соединении без пары), а пустая ссылка — вполне конкретное значение.

Типовые задачи, где требуется пустая ссылка в запросе:

  • поиск документов, где не заполнен обязательный по логике реквизит (контрагент, склад, договор);
  • отбор элементов справочника верхнего уровня — у них реквизит «Родитель» пуст;
  • сравнение результата соединения таблиц, когда нужно отличить «нет связанного объекта» от «объект есть»;
  • подстановка значения по умолчанию при формировании временных таблиц.

Способ 1. Функция ЗНАЧЕНИЕ с конструкцией «ПустаяСсылка»

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

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

ЗНАЧЕНИЕ(Документ.РеализацияТоваровУслуг.ПустаяСсылка)

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

Пример запроса, который выбирает контрагентов без родителя (элементы верхнего уровня):

ВЫБРАТЬ

Контрагенты.Ссылка КАК Контрагент

ИЗ

Справочник.Контрагенты КАК Контрагенты

ГДЕ

Контрагенты.Родитель = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

Важно: тип внутри ЗНАЧЕНИЕ должен точно совпадать с типом сравниваемого реквизита. Если реквизит «Родитель» имеет тип «СправочникСсылка.Контрагенты», то и пустую ссылку нужно брать именно этого справочника. При несовпадении типов сравнение может не сработать так, как ожидается.

Когда ЗНАЧЕНИЕ не подходит

Функция ЗНАЧЕНИЕ работает только с типами, известными на момент написания запроса. Если тип реквизита составной (например, «Владелец» может быть справочником «Контрагенты» или «Организации»), пустую ссылку придётся указывать для каждого типа отдельно или передавать параметром.

Способ 2. Передача пустой ссылки через параметр запроса

Второй универсальный способ — сформировать пустую ссылку на встроенном языке и передать её в запрос как параметр. Это особенно удобно, когда тип ссылки определяется динамически или запрос используется в разных контекстах.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Реализации.Ссылка КАК Документ

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализации

|ГДЕ

| Реализации.Контрагент = &ПустойКонтрагент";

Запрос.УстановитьПараметр("ПустойКонтрагент",

Справочники.Контрагенты.ПустаяСсылка());

Результат = Запрос.Выполнить();

Менеджер объекта (Справочники, Документы, ПланыСчетов и т. д.) имеет метод ПустаяСсылка(), который возвращает пустую ссылку нужного типа. Переданный параметр полностью равнозначен конструкции ЗНАЧЕНИЕ в тексте запроса.

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

Сравнение способов

ЗНАЧЕНИЕ в тексте запроса

Подходит, когда тип известен заранее и фиксирован. Не требует кода на встроенном языке, работает в консоли запросов и СКД.

Параметр запроса

Подходит для динамических типов и составных реквизитов. Требует программной установки параметра, недоступен в чистом тексте запроса без кода.

Как проверить реквизит на пустую ссылку в условии ГДЕ

Стандартная проверка — прямое сравнение через знак равенства. Запрос вернёт документы, у которых не заполнен склад:

ВЫБРАТЬ

Поступление.Ссылка КАК Документ

ИЗ

Документ.ПоступлениеТоваровУслуг КАК Поступление

ГДЕ

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

Обратная задача — отобрать только заполненные ссылки. Используется неравенство:

ГДЕ

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

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

Пустая ссылка при составном типе реквизита

Составной тип — частый источник ошибок. Если реквизит «Плательщик» может быть и справочником «Контрагенты», и справочником «Организации», то сравнение с пустой ссылкой только одного типа не охватит все незаполненные значения. Пустая ссылка контрагента и пустая ссылка организации — разные значения, и незаполненный реквизит может хранить любую из них в зависимости от истории ввода.

Надёжный вариант — проверка на оба типа через ИЛИ:

ГДЕ

(Платеж.Плательщик = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)

ИЛИ Платеж.Плательщик = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)

ИЛИ Платеж.Плательщик = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка))

Альтернатива — приведение типа через ВЫРАЗИТЬ и сравнение с одной пустой ссылкой, но это работает корректно только если тип реквизита на момент проверки совпадает с типом приведения. На практике перечисление всех типов через ИЛИ надёжнее и читабельнее.

Типичные ошибки
01
Сравнение с NULL вместо пустой ссылки: условие «Реквизит = NULL» не находит незаполненные ссылочные реквизиты, потому что незаполненное значение — это пустая ссылка, а не NULL.
02
Несовпадение типа в ЗНАЧЕНИЕ: указан справочник «Контрагенты», а реквизит имеет тип «Организации» — сравнение не сработает.
03
Проверка только одного типа при составном реквизите: часть незаполненных значений остаётся вне выборки.
04
Использование ЕСТЬ NULL для проверки незаполненности реквизита основной таблицы: ЕСТЬ NULL нужен только для полей, появившихся из соединений.

Программная проверка пустой ссылки вне запроса

Если значение уже получено на встроенном языке (например, из выборки запроса или реквизита объекта), проверить его на пустоту можно двумя способами: функцией ЗначениеЗаполнено() или методом Пустая() у ссылочного значения.

Если НЕ ЗначениеЗаполнено(Выборка.Контрагент) Тогда

// Реквизит не заполнен

КонецЕсли;

Если Выборка.Контрагент.Пустая() Тогда

// То же самое для ссылочного типа

КонецЕсли;

Разница между подходами: ЗначениеЗаполнено() универсальна и работает с любыми типами (числа, строки, даты, ссылки), а Пустая() — только со ссылочными. Для проверки именно ссылок оба варианта равнозначны. Внутри запроса функция ЗначениеЗаполнено недоступна — там используется только сравнение с ЗНАЧЕНИЕ или параметром.

Как найти документы с незаполненным реквизитом
  1. 1
    Определите точный тип реквизита в конфигураторе (свойство «Тип» реквизита объекта).
  2. 2
    Напишите запрос с условием: Реквизит = ЗНАЧЕНИЕ(Тип.ПустаяСсылка).
  3. 3
    Если тип составной — перечислите пустые ссылки всех допустимых типов через ИЛИ.
  4. 4
    Выполните запрос в консоли запросов и проверьте, что в выборку попали ожидаемые документы.
  5. 5
    Перенесите проверенный текст в код, при необходимости заменив ЗНАЧЕНИЕ на параметр.

Пустая ссылка в СКД и динамических списках

В схеме компоновки данных и в отборах динамических списков пустая ссылка задаётся теми же средствами. В тексте запроса СКД работает ЗНАЧЕНИЕ с ПустаяСсылка, а в настройках отбора пустую ссылку можно выбрать из списка значений — платформа сама подставит корректное значение нужного типа.

При программной установке отбора динамического списка пустую ссылку передают как значение элемента отбора:

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Контрагент");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Справочники.Контрагенты.ПустаяСсылка();

ЭлементОтбора.Использование = Истина;

Этот подход работает в управляемых формах любых типовых и самописных конфигураций и не требует изменения текста запроса списка.

Контрольные точки

Как проверить результат

Запрос с условием на пустую ссылку
Норма

В выборку попадают только объекты с незаполненным реквизитом

Тревожный признак

Выборка пуста, хотя незаполненные объекты точно есть — вероятно, неверный тип в ЗНАЧЕНИЕ

Составной тип реквизита
Норма

Найдены объекты со всеми вариантами пустых ссылок

Тревожный признак

Часть объектов не попадает в выборку — проверены не все типы

Соединение таблиц
Норма

Отсутствие связанного объекта корректно определяется через ЕСТЬ NULL

Тревожный признак

Сравнение с пустой ссылкой не ловит строки без пары в соединении

Часто задаваемые вопросы

Чем пустая ссылка отличается от NULL в запросе 1С?

Пустая ссылка — это значение определённого ссылочного типа, которое не указывает ни на один объект. NULL — отсутствие значения, возникающее, например, при левом соединении без подходящей строки. Сравнение пустой ссылки с NULL даёт ложь, поэтому проверять их нужно по-разному: пустую ссылку через ЗНАЧЕНИЕ, NULL — через ЕСТЬ NULL.

Можно ли получить пустую ссылку для любого типа через ЗНАЧЕНИЕ?

Да, для любого ссылочного типа конфигурации: справочники, документы, планы видов характеристик, планы счетов, планы видов расчёта, бизнес-процессы, задачи. Синтаксис одинаков — ЗНАЧЕНИЕ(ИмяТипа.ИмяОбъекта.ПустаяСсылка).

Как в запросе проверить, что реквизит заполнен?

Используйте неравенство: Реквизит <> ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка). Для составных типов потребуется проверка на неравенство каждой пустой ссылке через И, либо дополнительная проверка на NULL, если поле приходит из соединения.

Почему условие «Реквизит = NULL» не находит документы без контрагента?

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

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

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

Работает ли ЗНАЧЕНИЕ с ПустаяСсылка в консоли запросов?

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

Итог

Что важно запомнить

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