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

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

Как в запросе 1С проверить значение на NULL

Как проверить значение на NULL в запросе 1С: оператор ЕСТЬ NULL, функция ЕСТЬNULL, типичные ошибки сравнения с NULL и примеры кода для консоли запросов.

В языке запросов 1С значение NULL обозначает отсутствие данных, и обычное сравнение с ним через знак равенства не работает: выражение Поле = NULL никогда не вернёт истину. Это одна из самых частых причин «пустых» результатов запроса у начинающих разработчиков. Проверка выполняется специальным оператором ЕСТЬ NULL (IS NULL) или функцией ЕСТЬNULL().

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

Ниже разобраны синтаксис проверки, замена NULL значением по умолчанию, поведение NULL в условиях и группировках, а также типичные ошибки, которые приводят к потере строк в отчётах.

Что такое NULL в запросах 1С и откуда он берётся

NULL — это не пустая строка, не ноль и не пустая ссылка. Это специальное значение «данные отсутствуют». Поэтому любые арифметические операции и сравнения с NULL дают NULL, а не ложь или истину. Запрос с условием ГДЕ Остаток = NULL синтаксически корректен, но не вернёт ни одной строки, даже если NULL в данных есть.

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

Оператор ЕСТЬ NULL (IS NULL): базовая проверка

Стандартный способ отобрать записи с отсутствующим значением — оператор ЕСТЬ NULL в секции ГДЕ. Он работает и в русском, и в английском синтаксисе (IS NULL), оба варианта эквивалентны.

ВЫБРАТЬ

Накладная.Ссылка,

Остатки.КоличествоОстаток

ИЗ

Документ.РасходнаяНакладная КАК Накладная

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

ПО Накладная.Склад = Остатки.Склад

ГДЕ

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

Для обратного условия — отобрать только записи, где значение есть, — используется отрицание: НЕ Поле ЕСТЬ NULL или Поле ЕСТЬ НЕ NULL (вариант IS NOT NULL в английском синтаксисе). Скобки вокруг такого условия желательны, если оно комбинируется с другими через И/ИЛИ, чтобы не ошибиться в приоритете.

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

Функция ЕСТЬNULL: замена NULL значением по умолчанию

Функция ЕСТЬNULL(Выражение, ЗначениеЕслиNULL) возвращает само выражение, если оно не NULL, иначе — указанное значение. Это основной инструмент, когда NULL нужно не отфильтровать, а заменить: например, вывести ноль вместо отсутствующего остатка или пустую строку вместо отсутствующего комментария.

ВЫБРАТЬ

Номенклатура.Наименование,

ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток

ИЗ

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

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

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

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

NULL в условиях, соединениях и группировках

В условиях соединения NULL тоже не сравнивается: связь ПО Таблица1.Поле = Таблица2.Поле не сработает для пары NULL–NULL. Если такие записи нужно связать, условие дополняют проверкой: ПО (Таблица1.Поле = Таблица2.Поле ИЛИ (Таблица1.Поле ЕСТЬ NULL И Таблица2.Поле ЕСТЬ NULL)).

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

В агрегатных функциях поведение различается: СУММА, СРЕДНЕЕ, МАКСИМУМ игнорируют NULL-значения, а КОЛИЧЕСТВО(*) считает все строки, включая те, где поле равно NULL. Если нужен подсчёт только заполненных значений, используют КОЛИЧЕСТВО(Поле) — оно пропускает NULL.

Типичные ошибки
01
Условие «Поле = NULL» — запрос выполняется без ошибки, но возвращает пустой результат, и причину долго ищут в данных
02
ЕСТЬNULL применена только в списке полей, а в соединении или ГДЕ NULL продолжает искажать выборку
03
Несовместимые типы аргументов ЕСТЬNULL — запрос падает с ошибкой при исполнении
04
Ожидание, что пустая ссылка равна NULL: это разные значения, проверять нужно отдельно

NULL, пустая ссылка и пустая строка: в чём разница

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

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

ЗначениеКак появляетсяКак проверить
NULLЛевое соединение, составной тип, нет записи в регистреПоле ЕСТЬ NULL
Пустая ссылкаНезаполненный ссылочный реквизитПоле = ЗНАЧЕНИЕ(...ПустаяСсылка)
Пустая строкаНезаполненный строковый реквизитПоле = ""
НольНезаполненный числовой реквизитПоле = 0

Сравнение подходов

ЕСТЬ NULL в ГДЕ

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

ЕСТЬNULL в ВЫБРАТЬ

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

ЕСТЬNULL в условии соединения

Подходит, когда NULL мешает связи таблиц; усложняет запрос и может замедлить выполнение на больших таблицах

Практический порядок отладки запроса с NULL

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

После этого выберите обработку: фильтрация через ЕСТЬ NULL, замена через ЕСТЬNULL или комбинированное условие с пустой ссылкой. В конце снова выполните запрос и сверьте количество строк и итоги с ожидаемыми — особенно суммы, потому что СУММА по NULL-полю молча занижает результат.

Порядок действий
  1. 1
    Выполните запрос в консоли без условий и найдите поле, где появляется NULL
  2. 2
    Определите источник NULL: левое соединение, составной тип или виртуальная таблица
  3. 3
    Добавьте ЕСТЬ NULL в ГДЕ, если записи нужно отфильтровать, либо ЕСТЬNULL — если значение нужно заменить
  4. 4
    Проверьте совместимость типов аргументов ЕСТЬNULL
  5. 5
    Выполните запрос повторно и сверьте количество строк и итоговые суммы
Контрольные точки

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

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

Совпадает с ожидаемым по данным учёта

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

Строк меньше — вероятно, NULL отсекается условием или внутренним соединением

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

NULL заменён значением по умолчанию через ЕСТЬNULL

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

Пустые значения выводятся как есть и ломают дальнейшие вычисления

Итоговые суммы
Норма

СУММА учитывает все нужные строки

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

Итог занижен из-за NULL в суммируемом поле

Ограничения и влияние на производительность

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

Ещё одно ограничение: ЕСТЬNULL принимает ровно два аргумента. Если потенциальных NULL несколько уровней (NULL может вернуть и вложенное выражение), функции вкладывают друг в друга: ЕСТЬNULL(ЕСТЬNULL(Поле1, Поле2), 0). Такие конструкции быстро становятся трудночитаемыми — в сложных случаях понятнее перенести логику во временную таблицу или в код модуля.

Частые вопросы о проверке NULL в запросах 1С

Почему условие «Поле = NULL» не возвращает строки?

По правилам логики NULL не равен ничему, включая NULL. Любое сравнение с NULL даёт NULL, а не истину, поэтому строка не проходит фильтр. Используйте оператор «Поле ЕСТЬ NULL».

Чем ЕСТЬ NULL отличается от ЕСТЬNULL?

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

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

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

Можно ли использовать NULL в параметрах запроса?

Да, параметру можно присвоить NULL и проверять его оператором ЕСТЬ NULL, например для необязательных отборов: «&Параметр ЕСТЬ NULL ИЛИ Поле = &Параметр». Учтите, что такое условие может замедлить запрос на больших таблицах.

Почему СУММА по полю вернула NULL, а не ноль?

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

Работает ли ЕСТЬ NULL в СКД и динамических списках?

Да, язык запросов общий: оператор ЕСТЬ NULL и функция ЕСТЬNULL работают в наборах данных СКД, динамических списках и произвольных запросах. В СКД дополнительно доступна обработка NULL в выражениях вычисляемых полей и ресурсов.

Итог

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

NULL в запросе 1С проверяется только оператором ЕСТЬ NULL, а заменяется функцией ЕСТЬNULL. Сравнение через «= NULL» не работает. Не путайте NULL с пустой ссылкой и пустой строкой — для них нужны свои проверки. Перед добавлением обработки выясните, откуда NULL появляется в данных.