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

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

1С запрос: ВЫБОР КОГДА пустая ссылка — как проверить и подставить значение

Как в запросе 1С проверить пустую ссылку через ВЫБОР КОГДА, ЗНАЧЕНИЕ и ЕСТЬ NULL. Примеры кода, типичные ошибки и проверка результата запроса.

Конструкция ВЫБОР КОГДА в языке запросов 1С — аналог оператора CASE: она позволяет вернуть разные значения в зависимости от условия. Одна из самых частых задач — проверить, является ли ссылочное поле пустым, и в этом случае подставить другое значение: строку «Не указано», значение по умолчанию или NULL.

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

Ниже разобраны рабочие варианты проверки пустой ссылки внутри ВЫБОР КОГДА, отличие от проверки NULL, типичные ошибки с составными типами и способы проверить результат до вывода в отчёт.

Базовый синтаксис: ВЫБОР КОГДА со сравнением на пустую ссылку

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

ВЫБОР

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

ТОГДА "Не указана"

ИНАЧЕ Товары.Номенклатура.Наименование

КОНЕЦ КАК НоменклатураПредставление

Здесь важны два момента. Во-первых, тип сравниваемого значения должен совпадать с типом поля: сравнивать поле типа «СправочникСсылка.Номенклатура» с пустой ссылкой документа бессмысленно — условие никогда не выполнится. Во-вторых, все ветки ВЫБОР должны возвращать совместимые типы, иначе итоговый тип колонки станет составным, что усложнит дальнейшую обработку.

Если поле имеет составной тип (например, реквизит может хранить ссылку на разные справочники), одного сравнения недостаточно — об этом отдельный раздел ниже.

Проверка через параметр запроса

Альтернатива ЗНАЧЕНИЕ() — передать пустую ссылку параметром. Это удобно, когда тип поля заранее неизвестен или запрос строится универсально под разные объекты.

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

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

"ВЫБРАТЬ

| ВЫБОР

| КОГДА Таблица.Контрагент = &ПустойКонтрагент

| ТОГДА ""<не заполнен>""

| ИНАЧЕ ПРЕДСТАВЛЕНИЕ(Таблица.Контрагент)

| КОНЕЦ КАК КонтрагентТекст

|ИЗ

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

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

bsl
ВЫБОР
	КОГДА Поле = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		ТОГДА "Не заполнено"
	ИНАЧЕ ПРЕДСТАВЛЕНИЕ(Поле)
КОНЕЦ

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

Признак корректной работы — в выборке строки с незаполненным полем получают подставленное значение, а заполненные строки проходят в ветку ИНАЧЕ. Если подстановка не срабатывает вообще, чаще всего тип параметра не совпадает с типом поля.

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

Ключевая ловушка: при левом соединении таблиц несовпавшие поля дают NULL, а не пустую ссылку. Сравнение Поле = ЗНАЧЕНИЕ(...ПустаяСсылка) для NULL вернёт NULL (не ИСТИНА и не ЛОЖЬ), и строка попадёт в ветку ИНАЧЕ — то есть «пустое» значение обработается как заполненное.

ВЫБОР

КОГДА Таб.Контрагент ЕСТЬ NULL

ТОГДА "Нет данных"

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

ТОГДА "Не заполнен"

ИНАЧЕ ПРЕДСТАВЛЕНИЕ(Таб.Контрагент)

КОНЕЦ КАК КонтрагентТекст

Порядок условий важен: проверку ЕСТЬ NULL ставят первой, потому что для NULL сравнение с пустой ссылкой не даст ИСТИНА. ВЫБОР вычисляет условия последовательно и берёт первое истинное.

Чем проверять пустое значение

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

Проверяет именно незаполненное ссылочное поле в самой таблице. Не ловит NULL после соединений.

ЕСТЬ NULL

Ловит отсутствие значения после левого соединения или в необязательных данных. Не ловит пустую ссылку как значение.

Поле = &Параметр

Гибкий вариант для универсального кода: тип пустой ссылки задаётся при установке параметра.

ЕСТЬNULL(Поле, ЗНАЧЕНИЕ(...ПустаяСсылка))

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

Приведение NULL к пустой ссылке через ЕСТЬNULL

Если нужно единообразно обработать и NULL, и пустую ссылку, удобно сначала привести значение функцией ЕСТЬNULL(), а потом сравнить один раз:

ВЫБОР

КОГДА ЕСТЬNULL(Таб.Склад, ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка))

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

ТОГДА "Склад не указан"

ИНАЧЕ ПРЕДСТАВЛЕНИЕ(Таб.Склад)

КОНЕЦ

Такой приём сокращает текст запроса и убирает зависимость от порядка условий. Ограничение: тип второго аргумента ЕСТЬNULL должен быть совместим с типом поля, иначе запрос не выполнится.

Составные типы и сравнение по ссылке

Если реквизит имеет составной тип (например, «СправочникСсылка.Контрагенты, СправочникСсылка.Организации»), значение считается пустым, если оно равно пустой ссылке любого из допустимых типов. Одного сравнения недостаточно:

ВЫБОР

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

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

ИЛИ Таб.Плательщик ЕСТЬ NULL

ТОГДА "Не указан"

ИНАЧЕ ПРЕДСТАВЛЕНИЕ(Таб.Плательщик)

КОНЕЦ

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

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

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

Подстановка значения по умолчанию в отчёт

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

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

Обратная задача — найти ошибки учёта: документы, где не заполнен обязательный по смыслу реквизит. Здесь ВЫБОР не нужен, достаточно условия в ГДЕ:

ВЫБРАТЬ

Реализация.Ссылка,

Реализация.Номер

ИЗ

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

ГДЕ

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

И НЕ Реализация.ПометкаУдаления

Группировка с объединением пустых значений

При группировке пустая ссылка, NULL и разные типы пустых значений образуют отдельные группы. Чтобы собрать их в одну, в поле группировки применяют ВЫБОР КОГДА с приведением к единому маркеру, например строке «Без значения».

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

Проверка результата и ограничения

Перед переносом запроса в рабочий код выполните его в консоли запросов на данных, где точно есть три категории строк: с заполненным полем, с пустой ссылкой и (если есть соединения) с NULL. Каждая категория должна попасть в свою ветку ВЫБОР.

Учтите ограничение производительности: ВЫБОР КОГДА в секции ГДЕ по невычисляемому полю может мешать оптимизатору использовать индексы. Для отборов по пустой ссылке на больших таблицах предпочтительнее прямое сравнение в ГДЕ, а ВЫБОР оставить для полей выборки.

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

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

Строки с пустой ссылкой
Норма

Получили значение из ветки ТОГДА (текст или значение по умолчанию)

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

Попали в ИНАЧЕ — неверный тип сравнения или это NULL

Строки с NULL после соединения
Норма

Обработаны отдельным условием ЕСТЬ NULL или через ЕСТЬNULL

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

Отображаются как заполненные либо как пустые без различения

Тип итоговой колонки
Норма

Одинаковый во всех ветках, группировки работают

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

Составной тип, итоги и сортировка ведут себя странно

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

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

Пустая ссылка — это значение ссылочного типа, которое хранится в самом поле и означает «не заполнено». NULL — отсутствие значения, возникающее при левом соединении без совпадений или в необязательных данных. Сравнение NULL с пустой ссылкой даёт NULL, а не ИСТИНА, поэтому проверять их нужно разными конструкциями.

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

Перечислите сравнения с пустой ссылкой каждого допустимого типа через ИЛИ и добавьте проверку ЕСТЬ NULL. Либо приведите поле через ВЫРАЗИТЬ к конкретному типу, если работать нужно только с одним из них.

Можно ли использовать ВЫБОР КОГДА в секции ГДЕ?

Да, синтаксис это допускает. Но для простого отбора по пустой ссылке достаточно прямого сравнения в ГДЕ — оно короче и лучше оптимизируется. ВЫБОР в ГДЕ оправдан, когда условие отбора само зависит от данных строки.

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

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

Как вывести вместо пустой ссылки текст в СКД?

В наборе данных СКД используйте тот же ВЫБОР КОГДА в вычисляемом поле запроса. Альтернатива — вычисляемое поле СКД с выражением на языке выражений компоновки, но вариант в запросе обычно быстрее, так как вычисляется на СУБД.

Что вернёт ПРЕДСТАВЛЕНИЕ(пустая ссылка)?

Для пустой ссылки представление обычно пустое или служебное, поэтому в отчётах его заменяют осмысленным текстом через ВЫБОР КОГДА. Для NULL функция ПРЕДСТАВЛЕНИЕ вернёт NULL, что в итоговой таблице отобразится пустой ячейкой.

Итог

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

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