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