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

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

1С: конструкция ВЫБОР КОГДА ЕСТЬ NULL в запросах

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

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

Конструкция «ВЫБОР КОГДА ЕСТЬ NULL» — стандартный приём для подстановки значения по умолчанию вместо NULL прямо в тексте запроса. Это избавляет от дополнительной обработки выборки в коде и делает отчёты устойчивыми к незаполненным данным. Ниже разобраны синтаксис, типовые сценарии, ограничения и ошибки, которые чаще всего встречаются на практике.

Что такое NULL в запросах 1С и почему с ним нельзя сравнивать через «=»

NULL — это не пустая строка, не ноль и не пустая ссылка, а специальное значение «отсутствие данных». Оно возникает, когда запрос не может получить значение поля: например, левое соединение не нашло пару в правой таблице, или обращение идёт к реквизиту через точку от NULL-ссылки.

Ключевая особенность: любое сравнение с NULL даёт не ИСТИНА и не ЛОЖЬ, а неопределённый результат, который в условиях трактуется как ложь. Поэтому условие ГДЕ Остаток = NULL не отберёт ни одной строки, даже если NULL там есть. Проверка выполняется только оператором ЕСТЬ NULL или НЕ ... ЕСТЬ NULL.

Синтаксис конструкции ВЫБОР КОГДА ЕСТЬ NULL

Полная форма конструкции выглядит так:

ВЫБОР

КОГДА Таблица.Поле ЕСТЬ NULL

ТОГДА ЗначениеПоУмолчанию

ИНАЧЕ Таблица.Поле

КОНЕЦ КАК Поле

Ветка ИНАЧЕ обязательна, если нужно вернуть само значение поля, когда оно не NULL. Если её опустить, для всех не-NULL строк результатом будет NULL — это частая причина «пропавших» данных в отчёте.

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

bsl
ВЫБРАТЬ
	ВЫБОР
		КОГДА Остатки.КоличествоОстаток ЕСТЬ NULL
			ТОГДА 0
		ИНАЧЕ Остатки.КоличествоОстаток
	КОНЕЦ КАК Остаток
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

Замена NULL при левом соединении таблиц

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

Замена NULL на ноль делается так:

ВЫБРАТЬ

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

ВЫБОР

КОГДА Остатки.КоличествоОстаток ЕСТЬ NULL

ТОГДА 0

ИНАЧЕ Остатки.КоличествоОстаток

КОНЕЦ КАК Остаток

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

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

Такой запрос гарантированно вернёт строку по каждому элементу справочника, а в колонке «Остаток» будет число, пригодное для дальнейших вычислений и группировок.

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

Альтернатива: функция ЕСТЬNULL()

Для простой замены NULL на конкретное значение в языке запросов 1С есть компактная функция ЕСТЬNULL(Поле, Замена). Запись ЕСТЬNULL(Остатки.КоличествоОстаток, 0) эквивалентна полной конструкции ВЫБОР, но короче и читается легче.

Различие в гибкости: ВЫБОР КОГДА позволяет строить сложные многоуровневые условия (несколько проверок, вычисляемые значения, разные ветки), а ЕСТЬNULL решает ровно одну задачу — подставить замену вместо NULL. Если логика ограничивается подстановкой, предпочтительнее ЕСТЬNULL; если нужны развилки по условиям — ВЫБОР КОГДА.

ВЫБОР КОГДА или ЕСТЬNULL

ВЫБОР КОГДА ... КОНЕЦ

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

ЕСТЬNULL(Поле, Замена)

Короткая замена NULL одним значением. Не умеет проверять дополнительные условия и строить цепочки ветвлений.

Проверка NULL в условии ГДЕ и в соединениях

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

ВЫБРАТЬ

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

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

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

ГДЕ

Остатки.Номенклатура ЕСТЬ NULL

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

NULL при обращении к реквизитам через точку

Когда в запросе пишут Документ.Контрагент.ИНН, а ссылка на контрагента пустая или битая, результатом будет NULL, а не пустая строка. То же происходит при разыменовании полей составного типа, если фактический тип значения не содержит запрашиваемого реквизита.

Обработка аналогична: ВЫБОР КОГДА Документ.Контрагент.ИНН ЕСТЬ NULL ТОГДА "" ИНАЧЕ Документ.Контрагент.ИНН КОНЕЦ. Для битых ссылок дополнительно можно проверять само поле ссылки: КОГДА Документ.Контрагент ЕСТЬ NULL ТОГДА "Не указан".

NULL в итогах и агрегатных функциях

Агрегатная функция СУММА по набору, где все значения NULL, вернёт NULL, а не ноль. Поэтому в запросах с группировкой и левыми соединениями замену NULL лучше делать до агрегации или оборачивать результат: ЕСТЬNULL(СУММА(Таблица.Сумма), 0).

Аналогично ведут себя МАКСИМУМ, МИНИМУМ и СРЕДНЕЕ при отсутствии строк. Функция КОЛИЧЕСТВО в этом смысле безопаснее — она возвращает 0, но КОЛИЧЕСТВО(Поле) не считает NULL-значения, что иногда искажает статистику.

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

Как проверить, что обработка NULL работает правильно

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

Дополнительно сравните итоговые суммы до и после изменения: если итог изменился без изменения данных, вероятно, раньше часть строк выпадала из-за NULL, и теперь запрос стал корректнее. Для отчётов на СКД убедитесь, что замена сделана в запросе набора данных, а не только в вычисляемых полях, иначе группировочные итоги будут расходиться с детальными строками.

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

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

Ячейки вместо NULL
Норма

Показывают значение по умолчанию (0, пустая строка, текст)

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

Остались пустые — замена не сработала или обработано не то поле

Тип колонки после ВЫБОР
Норма

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

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

Смешанные типы, ошибки при группировке в СКД

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

Совпадает с ожидаемым составом левой таблицы

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

Строк меньше — возможно, условие ГДЕ отсекает NULL-строки

Итог

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

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

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

Чем ЕСТЬNULL отличается от ВЫБОР КОГДА ЕСТЬ NULL?

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

Почему условие «Поле = NULL» не находит записи?

Потому что NULL не равен ничему, даже самому себе: результат сравнения неопределён и трактуется как ложь. Используйте «Поле ЕСТЬ NULL» — это единственный корректный способ проверки в языке запросов 1С.

Чем NULL отличается от пустой ссылки и пустой строки?

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

Можно ли использовать ВЫБОР КОГДА ЕСТЬ NULL в СКД?

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

Что вернёт СУММА, если все значения NULL?

СУММА вернёт NULL, а не ноль. Чтобы получить ноль, оберните агрегат: ЕСТЬNULL(СУММА(Поле), 0) — тогда итог по группе без данных будет числовым.

Как найти документы, у которых не заполнен контрагент?

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