NULL, да не NULL

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

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

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

Например

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

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

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

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

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

вернет NULL.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Похожие материалы

Справочники

Документы

Отчеты

Обработки