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