Отсутствие проверки на NULL или приведения через ЕстьNULL при левых/правых соединениях
При использовании левых или правых (внешних) соединений поля из присоединяемых таблиц могут принимать значение NULL
. А все выражения с NULL
и сравнения с NULL
в запросах приводят также к NULL
.
При использовании подобных полей в выражениях нужно учитывать возможность появления NULL.
Пример запроса
ВЫБРАТЬ
Товары.Наименование,
Цены.Цена
ИЗ
Справочник.Товары КАК Товары
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних КАК Цены
ПО Товары.Ссылка = Цены.Товар
В запросе поле "Цена" может принимать значение NULL
. И придется учитывать этот момент в своем коде 1С или последующих запросах, что добавляет сложности в разработке.
Для упрощения возможно применить несколько вариантов
-
Используйте приведение через
ЕстьNULL(Поле, ЗаменяющееЗначение)
. Например,ЕстьNULL(Цены.Цена, 0)
-
Используйте проверку "ЕСТЬ NULL". Например,
ВЫБОР КОГДА Цены.Цена ЕСТЬ NULL Тогда 0 Иначе Цены.Цена
Это искусственный пример. В данном случае лучше использовать приведение через ЕстьNULL(Поле, ЗаменяющееЗначение)
- Используйте внутреннее соединение вместо левого или правого соединения. Естественно, если вы уверены, что замена на внутреннее соединение не поменяет логику запроса.
См. также
- раздел "Левое внешнее соединение" из документации на платформу 1С 8.3.15
- раздел "Левое внешнее соединение" из книги "Язык запросов 1С:Предприятия"
Экранирование кода
// sonar:UsingLeftOuterJoin:off
// sonar:UsingLeftOuterJoin:on