Разработка и Конфигурация · 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, пустую ссылку и нулевое значение. Порядок условий важен: проверки выполняются сверху вниз, срабатывает первое истинное.
ВЫБРАТЬ
ВЫБОР
КОГДА Остатки.КоличествоОстаток ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Остатки.КоличествоОстаток
КОНЕЦ КАК Остаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиЗамена NULL при левом соединении таблиц
Самый частый сценарий — левое соединение справочника с виртуальной таблицей остатков или цен. Если по номенклатуре нет записей в регистре, все поля правой таблицы будут NULL, и без обработки в отчёте появятся пустые ячейки, а суммирование даст неожиданные итоги.
Замена NULL на ноль делается так:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Товар,
ВЫБОР
КОГДА Остатки.КоличествоОстаток ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Остатки.КоличествоОстаток
КОНЕЦ КАК Остаток
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки
ПО Номенклатура.Ссылка = Остатки.Номенклатура
Такой запрос гарантированно вернёт строку по каждому элементу справочника, а в колонке «Остаток» будет число, пригодное для дальнейших вычислений и группировок.
- 1Найдите поля, которые приходят из присоединяемой (правой) таблицы соединения
- 2Оберните каждое такое поле в ВЫБОР КОГДА Поле ЕСТЬ NULL ТОГДА ЗначениеПоУмолчанию ИНАЧЕ Поле КОНЕЦ
- 3Убедитесь, что тип значения по умолчанию совпадает с типом поля: число с числом, строка со строкой
- 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(СУММА(Таблица.Сумма), 0).
Аналогично ведут себя МАКСИМУМ, МИНИМУМ и СРЕДНЕЕ при отсутствии строк. Функция КОЛИЧЕСТВО в этом смысле безопаснее — она возвращает 0, но КОЛИЧЕСТВО(Поле) не считает 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» для битых ссылок и дополнительно проверьте равенство пустой ссылке через ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка), объединив условия через ИЛИ — незаполненность и отсутствие объекта это разные случаи.