Как правильно настроить отбор по пустым значениям дополнительных реквизитов в СКД?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

При работе с механизмом характеристик в Системе компоновки данных (СКД) разработчики часто сталкиваются с тем, что незаполненные дополнительные реквизиты объектов интерпретируются системой как NULL. Это создает сложности при попытке выполнить отбор по «пустой ссылке», так как стандартные механизмы сравнения не всегда корректно обрабатывают отсутствие значения в динамически присоединенных данных.

Разбор природы проблемы

Когда мы выводим дополнительные реквизиты через механизм характеристик, СКД выполняет неявное левое соединение с таблицей значений свойств. Если для конкретного объекта значение свойства отсутствует, результатом запроса становится NULL. Попытки применить ЕСТЬNULL непосредственно в исходном запросе часто оказываются безуспешными, так как СКД перекрывает типы данных на этапе формирования отчета. Рассмотрим, как корректно выйти из этой ситуации, не нарушая работу отчета.

Способ 1: Использование логики «ИЛИ» для отборов

Вместо того чтобы пытаться искусственно «превратить» NULL в пустую ссылку, что часто приводит к потере связей с владельцем объекта или нарушению структуры данных, рассмотрим более простой и надежный подход — комбинирование условий отбора. Если задача состоит в том, чтобы отфильтровать объекты по определенному списку значений, включая те, у которых свойство вовсе не заполнено, выполним следующие шаги:

  1. Откроем настройки отчета и перейдем на вкладку Отбор.
  2. Создадим группу условий с типом связи ИЛИ.
  3. Внутри этой группы добавим два условия:
    • Первое условие: наш дополнительный реквизит Не в списке (указываем список значений, которые нам не нужны).
    • Второе условие: наш дополнительный реквизит Не заполнено.

Этот подход работает на уровне логики СКД, позволяя исключить ненужные элементы справочника, при этом сохраняя в выборке все объекты, для которых свойство не было задано (то есть тех, где значение равно NULL).

Способ 2: Явное левое соединение в запросе

Если автоматический механизм характеристик СКД не позволяет добиться нужного результата, мы можем отказаться от него в пользу явного написания запроса в наборе данных. Это даст нам полный контроль над тем, как именно NULL преобразуется в пустую ссылку. Рассмотрим, как это реализовать:

В тексте запроса набора данных мы самостоятельно добавляем левое соединение с таблицей Справочник.ЗначенияСвойствОбъектов.ДополнительныеРеквизиты. Тогда в блоке ВЫБРАТЬ мы используем конструкцию:


ВЫБРАТЬ
    Партнеры.Ссылка КАК Партнер,
    ЕСТЬNULL(ДопРеквизиты.Значение, ЗНАЧЕНИЕ(Справочник.ЗначенияСвойствОбъектов.ПустаяСсылка)) КАК ЗначениеСвойства
ИЗ
    Справочник.Партнеры КАК Партнеры
ЛЕВОЕ СОЕДИНЕНИЕ
    Справочник.Партнеры.ДополнительныеРеквизиты КАК ДопРеквизиты
ПО
    Партнеры.Ссылка = ДопРеквизиты.Ссылка
    И ДопРеквизиты.Свойство = &НужноеСвойство

Используя этот метод, мы гарантированно получаем «Пустую ссылку» вместо NULL. Теперь в отборах СКД мы сможем оперировать полем ЗначениеСвойства как полноценным объектом системы.

Рекомендации по реализации

Проанализировав ситуацию, мы пришли к выводу, что самый оптимальный метод зависит от сложности отчета. Если вам нужно просто добавить возможность фильтрации — используйте Способ 1, так как он не требует изменения кода запроса и является наиболее «родным» для СКД. Если же отчет требует сложной обработки данных или использования вычисляемых полей для дальнейших расчетов, лучше использовать Способ 2 с явным соединением таблиц.

При настройке обязательно убедитесь, что тип значения, получаемого в результате ЕСТЬNULL, совпадает с типом данных Справочник.ЗначенияСвойствОбъектов. В противном случае СКД может привести данные к типу Строка или Неопределено, что сделает дальнейшую работу с отборами невозможной.

← На главную