Пустая ссылка составного типа в запросе

Пришла на днях задачка от клиента: Хочу говорит такой-сякой отчет, с такими то данными, ресурсами, группировкам и т.д. Но главное условие этого отчета, что бы выводились только те документы, у которых некий реквизит “ДокументОснование” был не пустой. Фигня делов, накидал сделал и понял… не работает главное условие. Итак разберемся.
Есть к примеру у нас документ “ЗарплатаСотрудника” с реквизитом “ДокументОснование” составного типа:

Первое что я сделал на автомате при реализации условия, что ссылка составного типа не должны быть пустой, это использовал значение “null”:
1 2 3 4 5 6 7 |
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование ЕСТЬ NULL |
Соответственно не получив результат вспомнил, что NULL – это по сути отсутствующие значения, а не как не нулевое или пустое. Это значение появляется в результате соединений в запросе, обращениям к реквизитам для битой ссылки…
Тогда пришлось использовать второй на вскидку вариант: значение “Неопределено”:
1 2 3 4 5 6 7 |
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО |
Этот вариант оказался более рабочим, но и здесь была проблема: если в документе в реквизите “ДокументОснование” никогда ничего не выбирали, то там действительно будет значение “Неопределено”. Но если в этом реквизите был выбран тип значения, а само значение выбрано не было – то в этом случае в реквизите будет уже пустая ссылка этого типа, а не значение “Неопределено”. Что меня не устраивало.
И остался у меня последний вариант: проверка на пустую ссылку для всех типов:
1 2 3 4 5 6 7 8 9 10 11 |
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО И НЕ(ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Анкета.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.Встреча.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.ЗапланированноеВзаимодействие.ПустаяСсылка) ИЛИ ЗарплатаСотрудника.ДокументОснование = ЗНАЧЕНИЕ(Документ.НазначениеОпросов.ПустаяСсылка)) |
Данный вариант оказался рабочим и документы с пустым полем “ДокументОснование” не попадали в отчет. Но мне данное решение показалось не оптимальным: как минимум оно выглядело не красиво, а как максимум при добавлении нового типа в данный реквизит, пришлось бы переписывать запрос отчета.
Полазив на форумах и почитав методическую информацию было найдено решение со значением NULL. Поскольку NULL появляется при соединения, то в запросе можно получить у реквизита “ДокументОснование” ссылку. Соответственно на уровне SQL все ссылочные значения, получаемые через точку, формируются через левое соединение, что и даст нам NULL при пустых значениях:
1 2 3 4 5 6 7 |
ВЫБРАТЬ ЗарплатаСотрудника.Ссылка КАК Ссылка, ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование ИЗ Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника ГДЕ НЕ ЗарплатаСотрудника.ДокументОснование.Ссылка ЕСТЬ NULL |
Вот таким нехитрым способом удалось решить задачу. Если можете предложить решение лучше или оптимальнее пишите. Всегда интересно узнать что-то новое.
Спасибо тебе, добрый человечище!
Всегда пожалуйста, заходи если что еще, может чего полезного найдешь!
ВЫБРАТЬ
ЗарплатаСотрудника.Ссылка КАК Ссылка,
ЗарплатаСотрудника.ДокументОснование КАК ДокументОснование
ИЗ
Документ.ЗарплатаСотрудника КАК ЗарплатаСотрудника
ГДЕ
НЕ ЗарплатаСотрудника.ДокументОснование = НЕОПРЕДЕЛЕНО
И ЗарплатаСотрудника.ДокументОснование.Ссылка ЕСТЬ NULL