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