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