Каталог решений - NULL, да не NULL

NULL, да не NULL

NULL, да не NULL

В наличии

Если вы пользуетесь в запросе конструкциями вида

… ГДЕ Продукция.Родитель = &А ИЛИ Продукция.Родитель.Родитель = &А ИЛИ …

Категория:

Описание

Если вы пользуетесь в запросе конструкциями вида

... ГДЕ Продукция.Родитель = &А ИЛИ Продукция.Родитель.Родитель = &А ИЛИ ...

для определения принадлежности элемента справочника определенным папкам, то надо иметь в виду некоторые особенности.
В коде вы можете спокойно брать родителя любого уровня и будете получать просто пустую ссылку, если вышестоящего родителя нет.

Например

Справочники.Номенклатура.ПустаяСсылка().Родитель

— это пустая ссылка.
В запросе всё немного не так.

Родитель корневого элемента будет пустая ссылка, а все вышестоящие родители будут равны NULL.

Такой запросец (имитирует обращение к предку второго уровня коренвого элемента, т.к. предок первого уровня это пустая ссылка)

ВЫБРАТЬ
    (ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родитель

вернет NULL.

Что интересно, SQL запрос

ВЫБРАТЬ
    (ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родитель.Родитель

тоже вернет NULL.

Хотя, казалось бы, он эквивалентен запросу

ВЫБРАТЬ
    (NULL).Родитель

который приводит к ошибке.

Дальше еще интереснее.
Вот такой незамысловатый запрос

 

ВЫБРАТЬ
    ВЫБОР
        КОГДА НЕ ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) В (
                NULL
              )
        ТОГДА 1
        ИНАЧЕ 2
    КОНЕЦ


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

Но с какого-то перепугу

 

ВЫБРАТЬ
    ВЫБОР
        КОГДА НЕ ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) В (
                (ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родитель
              )
        ТОГДА 1
        ИНАЧЕ 2
    КОНЕЦ


возвращает 2.

Кстати, если в двух последних запросах В заменить на В ИЕРАРХИИ, то первый запрос так и будет возвращать 1, а второй запрос начнет сыпать ошибку.

Подводя итог: обращение к родителям вышестоящего уровня в запросе может привести к псевдо-NULL значениям, которые ведут себя не совсем как NULL. Хотя для них операция ЕСТЬ NULL будет истина. Чтоб оградить себя от подобных казусов, все обращения к «дедам», «прадедам» и т.д. элементов справочников следует заключать в конструкцию ISNULL.

P.S. Не благодарите за ваше острое желание проверить тексты запросов, содержащих Родитель.Родитель

has been added to your cart:
Оформление заказа