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

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

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

Как в запросе 1С сравнить поле с пустой ссылкой: ЗНАЧЕНИЕ с пустыми скобками, ЕСТЬ NULL, сравнение составных типов и типичные ошибки разработчиков.

Проверка на пустую ссылку — одна из самых частых операций в запросах 1С. Она нужна, когда требуется отобрать документы без заполненного контрагента, найти элементы справочника без родителя или отфильтровать записи регистра, где не указан измерение. При этом синтаксис зависит от типа поля: простая ссылочная колонка и составное поле сравниваются по-разному.

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

Базовый способ: ЗНАЧЕНИЕ с пустой ссылкой

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

Пример запроса, отбирающего документы, где не заполнен контрагент:

ВЫБРАТЬ

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

ИЗ

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

ГДЕ

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

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

Условие можно инвертировать через оператор НЕ или неравенство <> — так отбираются записи, где ссылка заполнена:

ГДЕ

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

Сравнение через параметр запроса

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

ГДЕ

Товары.Номенклатура = &ПустаяНоменклатура

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

Запрос.УстановитьПараметр("ПустаяНоменклатура", Справочники.Номенклатура.ПустаяСсылка());

Здесь, в отличие от литерала в тексте запроса, используется метод ПустаяСсылка() — со скобками. Это частая путаница: в языке запросов скобок нет, во встроенном языке они обязательны.

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

Составные поля и поля неопределённого типа

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

Сравнение Поле = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) для составного поля сработает только если в поле действительно записана пустая ссылка именно этого типа. Если там НЕОПРЕДЕЛЕНО — условие вернёт ложь, и запись «потеряется».

Надёжные варианты для составных полей:

  • Поле = НЕОПРЕДЕЛЕНО — отбирает записи, где значение составного поля не установлено вовсе;
  • Поле В (&СписокПустыхСсылок) — параметром передаётся массив или список пустых ссылок всех возможных типов плюс НЕОПРЕДЕЛЕНО;
  • Комбинация условий через ИЛИ: проверка на пустую ссылку каждого типа и на НЕОПРЕДЕЛЕНО.
ГДЕ

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

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

ИЛИ Документ.Плательщик = НЕОПРЕДЕЛЕНО

Отличие пустой ссылки от NULL и работа с ЕСТЬ NULL

NULL в запросах 1С появляется не в самих данных, а в результате соединений таблиц — когда левому соединению не нашлось пары справа. Пустая ссылка, напротив, хранится в поле таблицы как обычное значение. Путать эти понятия нельзя: Поле ЕСТЬ NULL не найдёт записи с пустой ссылкой, а сравнение с пустой ссылкой не отловит NULL из соединения.

Типичный сценарий: нужно найти товары, для которых нет записи о цене. Здесь проверяется именно NULL после левого соединения:

ВЫБРАТЬ

Номенклатура.Ссылка КАК Товар

ИЗ

Справочник.Номенклатура КАК Номенклатура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены

ПО Номенклатура.Ссылка = Цены.Номенклатура

ГДЕ

Цены.Номенклатура ЕСТЬ NULL

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

Сравнение вариантов

ЗНАЧЕНИЕ(Тип.ПустаяСсылка)

Подходит для полей одного известного ссылочного типа. Не работает для составных полей со значением НЕОПРЕДЕЛЕНО.

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

Универсально, удобно при программном построении запросов. Требует установки параметра в коде до выполнения.

Поле = НЕОПРЕДЕЛЕНО

Для составных полей, где пустое значение хранится как НЕОПРЕДЕЛЕНО. Не отлавливает пустые ссылки конкретных типов.

ЕСТЬ NULL

Только для результатов соединений таблиц. К значениям, хранящимся в полях, не применяется.

Практические сценарии и проверка результата

При отладке запроса удобно сначала выполнить его в консоли запросов и посмотреть, сколько записей возвращает условие. Если ожидается, что пустых значений много, а запрос вернул ноль строк — почти наверняка тип пустой ссылки не совпадает с типом поля или значение хранится как НЕОПРЕДЕЛЕНО.

Порядок действий
  1. 1
    Определите тип проверяемого поля: простой ссылочный, составной или результат соединения.
  2. 2
    Для простого типа используйте ЗНАЧЕНИЕ(Справочник.Имя.ПустаяСсылка) в условии ГДЕ.
  3. 3
    Для составного поля добавьте проверку на НЕОПРЕДЕЛЕНО или передайте список пустых ссылок параметром.
  4. 4
    Для отсутствующих строк соединения используйте ЕСТЬ NULL.
  5. 5
    Выполните запрос в консоли и сравните количество строк с ожидаемым по данным базы.

Ещё один рабочий приём — временно вывести само поле и его представление в результат запроса. В консоли запросов пустая ссылка отображается как пустая строка, NULL — тоже визуально пуст, но функция ЕСТЬNULL(Поле, "НЕТ СТРОКИ") позволяет их различить: NULL заменится на маркер, а пустая ссылка останется пустой.

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

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

Количество строк в выборке
Норма

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

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

Запрос вернул 0 строк, хотя пустые значения в списке видны

Тип значения поля в консоли запросов
Норма

Пустая ссылка нужного типа сравнивается успешно

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

В поле НЕОПРЕДЕЛЕНО или NULL, а проверяется пустая ссылка

Итоги отчёта
Норма

Сумма по отбору и общий итог сходятся

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

Часть записей выпала из-за неполного условия на составное поле

Типичные ошибки и их последствия

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

Типичные ошибки
01
Сравнение поля с NULL вместо пустой ссылки — условие никогда не выполняется, записи теряются.
02
Скобки после ПустаяСсылка в тексте запроса — синтаксическая ошибка, запрос не выполняется.
03
Отсутствие скобок у ПустаяСсылка() во встроенном языке при установке параметра — ошибка выполнения кода.
04
Проверка составного поля только одной пустой ссылкой — записи со значением НЕОПРЕДЕЛЕНО выпадают из выборки.
05
Сравнение пустой ссылки одного справочника с полем другого типа — условие всегда ложно без сообщения об ошибке.

Отдельно стоит упомянуть соединения по полям, которые могут быть пустыми. Если в условии соединения участвует поле с пустой ссылкой, строки с пустыми значениями свяжутся между собой — пустая ссылка одного типа равна пустой ссылке того же типа. В результате в выборку могут попасть неожиданные пары записей. Перед соединением такие поля стоит отфильтровать.

Когда пустую ссылку проверять не нужно

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

Также не стоит проверять на пустую ссылку поля, которые по логике задачи должны участвовать в соединении: лучше сразу использовать внутреннее соединение, которое отсечёт записи без пары, чем левое соединение с последующей фильтрацией по NULL. Это упрощает текст запроса и обычно работает быстрее.

Итог

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

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

Частые вопросы

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

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

Почему запрос с условием на пустую ссылку возвращает ноль строк?

Чаще всего тип пустой ссылки не совпадает с типом поля либо поле составное и хранит НЕОПРЕДЕЛЕНО. Проверьте тип реквизита в конфигураторе и добавьте условие на НЕОПРЕДЕЛЕНО или передайте параметром список пустых ссылок всех допустимых типов.

Нужны ли скобки после ПустаяСсылка в тексте запроса?

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

Как проверить на пустую ссылку поле составного типа?

Одного сравнения недостаточно. Надёжный вариант — условие через ИЛИ: равенство пустой ссылке каждого возможного типа плюс равенство НЕОПРЕДЕЛЕНО. Альтернатива — передать параметром массив всех пустых ссылок и значение Неопределено и использовать оператор В.

Можно ли сравнить с пустой ссылкой поле типа «Строка» или «Число»?

Нет, пустая ссылка применима только к ссылочным типам. Для строк проверяется пустая строка (Поле = ""), для чисел — ноль. Для даты незаполненное значение — это дата 01.01.0001, которую можно сравнить через ДАТАВРЕМЯ(1,1,1).

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

Само сравнение недорогое, но условие по неиндексированному полю заставит СУБД сканировать таблицу целиком. На больших таблицах стоит проверять пустоту по индексированным реквизитам либо сначала сужать выборку другими условиями, а проверку пустой ссылки применять к уже ограниченному набору.