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