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