Перейти к содержанию

Отсутствие проверки на NULL или приведения через ЕстьNULL при левых/правых соединениях

При использовании левых или правых (внешних) соединений поля из присоединяемых таблиц могут принимать значение NULL. А все выражения с NULL и сравнения с NULL в запросах приводят также к NULL.

При использовании подобных полей в выражениях нужно учитывать возможность появления NULL.

Пример запроса

ВЫБРАТЬ
  Товары.Наименование,
  Цены.Цена
ИЗ
  Справочник.Товары КАК Товары
    ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ РегистрСведений.Цены.СрезПоследних КАК Цены
    ПО Товары.Ссылка = Цены.Товар

В запросе поле "Цена" может принимать значение NULL. И придется учитывать этот момент в своем коде 1С или последующих запросах, что добавляет сложности в разработке.

Для упрощения возможно применить несколько вариантов

  1. Используйте приведение через ЕстьNULL(Поле, ЗаменяющееЗначение). Например, ЕстьNULL(Цены.Цена, 0)

  2. Используйте проверку "ЕСТЬ NULL". Например,

ВЫБОР
    КОГДА Цены.Цена ЕСТЬ NULL
        Тогда 0
    Иначе
        Цены.Цена

Это искусственный пример. в данном лучше использовать приведение через ЕстьNULL(Поле, ЗаменяющееЗначение)

3 . Используйте внутреннее соединение вместо левого или правого соединения. Естественно, если вы уверены, что замена на внутреннее соединение не поменяет логику запроса.

См. также - раздел "Левое внешнее соединение" из документации на платформу 1С 8.3.15 - раздел "Левое внешнее соединение" из книги "Язык запросов 1С:Предприятия"