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