Как развернуть строки в колонки при формировании отчета в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разберем распространенную задачу при разработке отчетов в 1С:Предприятие — необходимость транспонировать строки с датами или другими динамическими измерениями в колонки (построить кросс-таблицу).

Ограничения языка запросов 1С

Проанализируем возможность разворота строк непосредственно в тексте запроса. В платформе 1С:Предприятие отсутствует встроенный оператор динамической транспозиции (аналог PIVOT в SQL). Запрос всегда возвращает фиксированную структуру колонок.

Развернуть динамический набор строк в колонки средствами самого запроса теоретически возможно только при ограниченном и заранее известном наборе значений (например, с помощью конструкций ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ с группировкой) или путем динамической сборки текста запроса в коде 1С. Однако такой подход является громоздким и трудноподдерживаемым. На практике для этих целей применяют специализированные механизмы платформы.

Способ 1. Использование Системы компоновки данных (СКД)

Рассмотрим наиболее простой и эффективный метод построения кросс-таблиц — работу в системе компоновки данных.

Разберем по шагам порядок настройки СКД:

  1. Настройка структуры: В схеме компоновки данных на вкладке Настройки вместо обычной группировки создаем элемент структуры типа Таблица.
  2. Разделение измерений: В секцию Строки добавляем аналитику строк (например, номенклатуру или контрагента), а в секцию Колонки — поле, строки которого нужно развернуть (например, дату или период).
  3. Настройка ресурсов: Выводимые числовые показатели (количество, сумма) добавляем на вкладку Ресурсы с указанием агрегатной функции (например, СУММА(Количество)).
  4. Вычисляемые поля и группы: Для дополнительных расчетов можно добавить Вычисляемые поля, а для сложного оформления колонок — настроить вертикальные группы.

Способ 2. Программный вывод в Табличный документ

Выясним, как сформировать кросс-таблицу вручную, если отчет выводится процедурным кодом без использования СКД.

Процесс разворота колонок реализовывается через комбинацию горизонтальных и вертикальных областей макета с использованием методов Вывести() и Присоединить() объектом ТабличныйДокумент.

Разберем алгоритм программного формирования:

  1. В макете отчета создаем пересекающиеся области: например, область шапки Шапка|Лево и область динамической колонки Шапка|Колонка.
  2. Первичным запросом или обходом выборки получаем массив уникальных значений дат для колонок.
  3. Методом Вывести() выводим фиксированную левую область, а затем в цикле методом Присоединить() добавляем колонки вправо.
  4. При выводе каждой строки данных методом Вывести() добавляется начало строки, после чего во вложенном цикле методом Присоединить() выводятся ячейки показателей на пересечении строки и колонки.

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


// Выводим статичную левую часть шапки
ОбластьШапкаЛево = Макет.ПолучитьОбласть("Шапка|Лево");
ОбластьШапкаКолонка = Макет.ПолучитьОбласть("Шапка|Колонка");

ТабличныйДокумент.Вывести(ОбластьШапкаЛево);

// В цикле присоединяем динамические колонки вправо
Для Каждого ТекДата Из МассивДат Цикл
    ОбластьШапкаКолонка.Параметры.ДатаПериода = ТекДата;
    ТабличныйДокумент.Присоединить(ОбластьШапкаКолонка);
КонецЦикла;

Резюме

Прямой разворот строк в колонки в самом тексте запроса 1С неудобен и ограничен. Оптимальным решением является использование структуры Таблица в СКД или программное формирование макета с помощью метода Присоединить() для объекта ТабличныйДокумент.

← На главную