При разработке отчетов на Системе Компоновки Данных (СКД) часто возникает задача построения кросс-таблиц со сложной структурой шапки. Стандартное поведение СКД предполагает, что ресурсы выводятся в колонках, а измерения — в строках. Однако, требования бизнеса часто диктуют обратное: необходимо вывести наименования показателей (например, "Сумма в рублях", "Сумма в валюте") в строках таблицы, а временные периоды (месяцы) — в колонках. Для решения подобных задач можно использовать стандартные механизмы.
В этой статье мы подробно разберем, как решить эту задачу. Мы рассмотрим как метод модификации запроса (который выбрал автор темы), так и методы настройки самой схемы компоновки, которые могут быть полезны в различных ситуациях.
Представим, что у нас есть запрос к регистру продаж, который возвращает два числовых поля (ресурса): СуммаПродажиРуб и СуммаПродажиEUR. Нам необходимо построить отчет, где:
Подобный пример формирования шапки отчета по неделям или месяцам является классическим для управленческой отчетности. Разберем три основных способа реализации такой структуры.
Этот метод был выбран автором как рабочий. Суть его заключается в том, чтобы превратить "широкую" таблицу (где показатели находятся в разных колонках) в "длинную" (где показатели находятся в одной колонке значений, а их имя — в отдельной колонке-измерении). В чем-то этот подход напоминает реализацию таблицы умножения на СКД, где структура данных подготавливается под конкретную визуальную модель.
Для этого мы используем конструкцию ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С.
Рассмотрим алгоритм действий:
Шаг 1. Подготовка данных во временную таблицу
Сначала мы получаем исходные данные и помещаем их во временную таблицу. Это важно для производительности, чтобы не обращаться к физическим таблицам базы данных несколько раз.
ВЫБРАТЬ
Продажи.Период КАК Период,
Продажи.СуммаРуб КАК СуммаРуб,
Продажи.СуммаEUR КАК СуммаEUR
ПОМЕСТИТЬ ВТ_ИсходныеДанные
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Месяц, ) КАК Продажи;
Шаг 2. "Разворот" таблицы (Транспонирование)
Теперь мы делаем выборку из временной таблицы дважды (или столько раз, сколько у нас ресурсов), объединяя результаты. При этом мы создаем искусственное поле ИмяПоказателя.
ВЫБРАТЬ
ВТ.Период КАК Период,
"Сумма в рублях" КАК ИмяПоказателя,
ВТ.СуммаРуб КАК Значение
ИЗ
ВТ_ИсходныеДанные КАК ВТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВТ.Период,
"Сумма в EUR",
ВТ.СуммаEUR
ИЗ
ВТ_ИсходныеДанные КАК ВТ
Шаг 3. Настройка СКД
После такой модификации запроса настройка в СКД становится тривиальной. Если же вы создаете отчет программно, можно упростить программное создание структуры СКД с помощью готовых модулей-оберток. В интерактивном режиме действия следующие:
Значение.Период.ИмяПоказателя.В результате мы получим отчет вида:
Плюсы метода:
Минусы метода:
Если вам нужно сохранить визуальное разделение на Рубли и Евро внутри одной ячейки месяца или просто сгруппировать их под общим заголовком "Сумма продажи", можно не менять структуру данных так кардинально.
Шаг 1. Доработка запроса
Добавим в запрос статическое строковое поле или используйте Вычисляемые поля в СКД, добавив поле РазделОтчета с выражением "Показатели продаж".
Шаг 2. Настройка структуры
РазделОтчета.Период.СуммаРуб и СуммаEUR.Настройка "Расположение ресурсов" во вкладке "Другие настройки" позволит определить, будут ли ресурсы идти горизонтально или вертикально под шапкой периода.
Иногда нужно просто визуально объединить два ресурса под одной шапкой, не создавая лишних группировок в строках. Это делается исключительно настройками варианта отчета. В некоторых случаях может потребоваться вывод ресурса в СКД только в одной колонке, что также достигается точечной настройкой выбранных полей.
СуммаРуб и СуммаEUR внутрь этой группы.Чтобы вывести "Январь 2025" вместо стандартного представления даты, можно использовать несколько подходов: свойство Оформление в наборе данных, условное оформление или выражение представления с использованием функции Формат(Период, "ДФ='MMMM yyyy'").
Если вы выбрали Способ 1 (Транспонирование через UNION ALL), учтите следующие моменты:
ОБЪЕДИНИТЬ ВСЕ можно использовать метод декартова произведения (CROSS JOIN) с маленькой вспомогательной таблицей номеров. Это часто работает быстрее.Для задачи вывода названий показателей в строках с группировкой по месяцам наиболее гибким является метод изменения запроса. Он позволяет представить любые несвязанные данные в единой структуре. В более сложных архитектурных решениях иногда приходится использовать даже две разных схемы в одном отчете СКД, чтобы добиться специфического поведения компонентов. Однако для простых случаев часто достаточно штатных настроек "Выбранных полей" и "Вычисляемых полей".