Почему в запросе 1С не работает условие «ГДЕ Поле = NULL»?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

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

Понимаем природу NULL: почему нельзя использовать «равно»

Главная причина, по которой условие ВТ.ХозяйствующийСубъект = NULL возвращает пустую выборку, кроется в логике работы СУБД. В стандарте SQL и в языке запросов 1С значение NULL не является «пустым значением» в обычном понимании. Оно означает «неопределенность» или «отсутствие данных».

Математическая логика сравнения здесь работает по принципу трехзначной логики:

  1. Истина (True)
  2. Ложь (False)
  3. Неопределенность (Unknown/NULL)

Когда мы пишем Поле = NULL, результат такого выражения всегда будет NULL (неопределенность), а не ЛОЖЬ. Поскольку оператор ГДЕ в языке запросов 1С отбирает записи только в том случае, если условие возвращает ИСТИНА, любая запись, для которой результат сравнения равен NULL, просто отбрасывается фильтром.

Правильное решение: используем оператор ЕСТЬ NULL

Чтобы корректно отобрать записи, в которых не нашлось соответствия при левом соединении, нам необходимо использовать специальный оператор ЕСТЬ NULL. Этот оператор был специально разработан для того, чтобы проверять поле на неопределенность и возвращать ИСТИНА или ЛОЖЬ, что полностью соответствует требованиям синтаксиса языка запросов.

Рассмотрим, как исправить запрос из вашего примера. Вместо ошибочной конструкции, нам следует написать следующее:


ВЫБРАТЬ
    ВТ.Контрагент КАК Контрагент,
    ВТ.ХозяйствующийСубъект КАК ХозяйствующийСубъект
ИЗ
    ВТ КАК ВТ
ГДЕ
    ВТ.ХозяйствующийСубъект ЕСТЬ NULL

Это выражение гарантированно вернет все записи, где во временной таблице ВТ поле ХозяйствующийСубъект не было заполнено в процессе соединения с исходным справочником.

Дополнительные инструменты для работы с NULL

Иногда нам требуется не просто отфильтровать данные, а подставить вместо NULL какое-то конкретное значение для дальнейшего вывода в отчет или обработки. Для этих целей в 1С существует функция ЕСТЬNULL(). Разберем её использование на примере:


ВЫБРАТЬ
    ВТ.Контрагент,
    ЕСТЬNULL(ВТ.ХозяйствующийСубъект, ЗНАЧЕНИЕ(Справочник.ХозяйствующиеСубъектыВЕТИС.ПустаяСсылка)) КАК ХозяйствующийСубъект
ИЗ
    ВТ КАК ВТ

В этом случае, если значение в поле ХозяйствующийСубъект равно NULL, система автоматически подставит пустую ссылку соответствующего справочника. Это позволяет избежать ошибок при отображении данных в формах или при выполнении дальнейших вычислений в коде.

Краткие выводы и советы

Проанализировав ситуацию, мы можем сформулировать основные правила работы с NULL в платформе 1С:

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

← На главную