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