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