Как в отчете СКД расположить поля горизонтально: пошаговое руководство по транспонированию данных

Программист IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с классическим требованием пользователей (особенно бухгалтеров): «Сделайте так, чтобы данные шли не вниз, а вправо». В стандартном понимании список записей растет вертикально, но задачи анализа иногда требуют превратить каждое поле записи в строку, а сами записи выстроить в колонки. В этой статье мы подробно разберем, как реализовать такой «переворот» отчета, используя стандартные и расширенные инструменты СКД.

Метод 1. Использование структуры «Таблица» и группировки в колонках

Это самый простой и правильный с точки зрения архитектуры СКД способ. Давайте проанализируем, как работает обычный список. В списке все поля, выбранные на закладке Настройки, выводятся в одну строку для каждой записи. Чтобы изменить это поведение, нам необходимо перевести отчет в режим таблицы.

Рассмотрим пошагово процесс настройки:

  1. Перейдем на закладку Настройки в схеме компоновки данных.
  2. В иерархии настроек (левое окно) нажмем правой кнопкой мыши на корневой элемент «Отчет» и выберем Новая таблица. Старый элемент «Список» можно удалить или отключить.
  3. В структуре таблицы мы увидим два раздела: Строки и Колонки.
  4. Если мы хотим, чтобы записи уходили вправо, нам нужно оставить раздел Строки пустым (или добавить туда статичное описание), а в раздел Колонки добавить группировку. Если нам нужны детальные записи, добавим группировку Детальные записи в колонки.
  5. Теперь самое важное: чтобы поля внутри этой колонки располагались друг под другом, а не в одну строчку, перейдем на вкладку Выбранные поля для этой конкретной группировки колонок.

Для того чтобы добиться эффекта «карточки», где названия полей идут слева, а значения — справа (но в колонках), нам потребуется сгруппировать выбранные поля. Выделим нужные поля, нажмем правую кнопку мыши и выберем Сгруппировать поля. В свойстве Расположение этой группы укажем значение Вертикально. При необходимости более точечного распределения показателей подойдёт настройка СКД для вывода ресурса только в одной выбранной колонке.

Метод 2. Использование вычисляемых полей и фиктивных группировок

Иногда требуется более сложная структура, когда названия строк должны быть фиксированными (например: «Остаток», «Приход», «Расход»), а колонки — динамическими. В этом случае мы применим метод имитации транспонирования.

Разберем ситуацию: нам нужно вывести показатели по номенклатуре горизонтально. Проанализируем алгоритм:

  1. В наборе данных добавим вычисляемое поле, назовем его ИмяПоказателя.
  2. В настройках таблицы в Строки добавим это поле ИмяПоказателя.
  3. В Колонки добавим наше основное измерение, например, Номенклатура.
  4. В качестве ресурсов будем использовать выражения, которые выводят конкретное значение в зависимости от того, какая строка сейчас формируется.

Для реализации этого метода часто используется функция ВычислитьВыражение. Посмотрим на пример выражения для ресурса Значение:


Выбор 
    Когда ИмяПоказателя = "Количество" Тогда Сумма(Количество)
    Когда ИмяПоказателя = "Сумма" Тогда Сумма(СуммаОборот)
    Иначе 0 
Конец

Таким образом, СКД создаст столько строк, сколько уникальных значений в поле ИмяПоказателя, и столько колонок, сколько элементов Номенклатура попало в выборку. Чтобы очистить горизонтальный отчет от лишних пустых секций, можно использовать способ скрытия столбцов при отсутствии данных в СКД.

Метод 3. Программный вывод и метод Присоединить()

Если визуальные настройки СКД не позволяют добиться требуемой гибкости (например, нужно сложное объединение ячеек в шапке, которая тоже должна «расти» вправо), мы можем прибегнуть к программному выводу отчета в ТабличныйДокумент.

Выясним причину, почему это эффективно: при программном выводе мы полностью контролируем процесс заполнения ячеек. Вместо стандартного метода Вывести(), который добавляет данные вниз, мы будем использовать метод Присоединить().

Рассмотрим фрагмент кода для реализации такого вывода:


// Создаем процессор вывода
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);

// Начинаем вывод
ПроцессорВывода.НачатьВывод();

Пока Истина Цикл
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Если ЭлементРезультата = Неопределено Тогда
        Прервать;
    КонецЕсли;

    // Вместо стандартного вывода анализируем тип элемента
    // И используем Результат.Присоединить(Область), если нужно выводить вправо
    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;

ПроцессорВывода.ЗакончитьВывод();

Важный нюанс: при программном выводе через Присоединить() необходимо заранее подготовить области макета, чтобы ширина колонок и формат ячеек соответствовали ожиданиям пользователя.

Метод 4. Настройка пользовательских макетов (Макет группировки)

Рассмотрим подробнее работу с вкладкой Макеты. Это «тяжелая артиллерия» СКД, позволяющая отрисовать практически любой внешний вид. Если нам нужно, чтобы одна колонка отчета представляла собой сложный блок данных, мы можем создать Макет группировки для колонки.

Проанализируем шаги:

  1. На закладке Макеты добавим новый макет группировки.
  2. Укажем имя группировки, которая находится у нас в колонках.
  3. В области макета нарисуем вертикальный столбец ячеек. Каждая ячейка будет содержать параметр (например, [Цена], [Остаток]).
  4. При формировании отчета СКД увидит, что для группировки колонок задан макет, и будет «приклеивать» этот вертикальный блок справа для каждого нового значения группировки.

Рекомендации по оформлению «бесконечных» горизонтальных отчетов

Работа с горизонтальными данными специфична, поэтому важно учитывать следующие моменты:

Подводя итог, можно сказать, что СКД — чрезвычайно гибкий инструмент. Даже если на первый взгляд кажется, что система заточена под вертикальные списки, использование типа «Таблица» в сочетании с вертикальной группировкой полей или собственными макетами позволяет удовлетворить требования самых взыскательных пользователей.

← На главную