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