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