NULL, да не NULL
Если вы пользуетесь в запросе конструкциями вида
… ГДЕ Продукция.Родитель = &А ИЛИ Продукция.Родитель.Родитель = &А ИЛИ …
- Описание
- Подробнее
Описание
Если вы пользуетесь в запросе конструкциями вида
... ГДЕ Продукция.Родитель = &А ИЛИ Продукция.Родитель.Родитель = &А ИЛИ ...для определения принадлежности элемента справочника определенным папкам, то надо иметь в виду некоторые особенности.
В коде вы можете спокойно брать родителя любого уровня и будете получать просто пустую ссылку, если вышестоящего родителя нет.
Например
Справочники.Номенклатура.ПустаяСсылка().Родитель— это пустая ссылка.
В запросе всё немного не так.
Родитель корневого элемента будет пустая ссылка, а все вышестоящие родители будут равны NULL.
Такой запросец (имитирует обращение к предку второго уровня коренвого элемента, т.к. предок первого уровня это пустая ссылка)
ВЫБРАТЬ
(ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родительвернет NULL.
Что интересно, SQL запрос
ВЫБРАТЬ
(ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родитель.Родительтоже вернет NULL.
Хотя, казалось бы, он эквивалентен запросу
ВЫБРАТЬ
(NULL).Родителькоторый приводит к ошибке.
Дальше еще интереснее.
Вот такой незамысловатый запрос
ВЫБРАТЬ
ВЫБОР
КОГДА НЕ ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) В (
NULL
)
ТОГДА 1
ИНАЧЕ 2
КОНЕЦ
вернет 1, ну действительно, вроде логично. Хотя операции сравнения с NULL вегда возвращают ЛОЖЬ и необходимо использовать конструкцию ЕСТЬ NULL.
Но с какого-то перепугу
ВЫБРАТЬ
ВЫБОР
КОГДА НЕ ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) В (
(ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)).Родитель
)
ТОГДА 1
ИНАЧЕ 2
КОНЕЦ
возвращает 2.
Кстати, если в двух последних запросах В заменить на В ИЕРАРХИИ, то первый запрос так и будет возвращать 1, а второй запрос начнет сыпать ошибку.
Подводя итог: обращение к родителям вышестоящего уровня в запросе может привести к псевдо-NULL значениям, которые ведут себя не совсем как NULL. Хотя для них операция ЕСТЬ NULL будет истина. Чтоб оградить себя от подобных казусов, все обращения к «дедам», «прадедам» и т.д. элементов справочников следует заключать в конструкцию ISNULL.
P.S. Не благодарите за ваше острое желание проверить тексты запросов, содержащих Родитель.Родитель

