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