Как транспонировать данные (перевернуть таблицу) в запросе 1С?

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

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

Транспонирование через оператор ОБЪЕДИНИТЬ ВСЕ

Один из самых прямолинейных способов реализовать транспонирование — это использование конструкции ОБЪЕДИНИТЬ ВСЕ. Этот подход позволяет последовательно собрать данные из разных колонок исходной таблицы в единый список, где номер колонки становится обычным измерением.

Разберем этот подход на конкретном примере. Предположим, у нас есть данные по неделям, и нам нужно превратить их в плоский список:


ВЫБРАТЬ Месяц, 1 КАК НомерНедели, Неделя1 КАК Количество ИЗ ИсходнаяТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Месяц, 2 КАК НомерНедели, Неделя2 КАК Количество ИЗ ИсходнаяТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Месяц, 3 КАК НомерНедели, Неделя3 КАК Количество ИЗ ИсходнаяТаблица

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

Использование конструкции ВЫБОР КОГДА для обратного преобразования

Если же вам необходимо, наоборот, собрать данные из «длинной» таблицы обратно в «широкую» (построить кросс-таблицу прямо в тексте запроса), используем агрегатные функции в связке с оператором ВЫБОР. Этот метод позволяет зафиксировать столбцы на этапе формирования выборки:


ВЫБРАТЬ 
    Месяц КАК Месяц,
    МАКСИМУМ(ВЫБОР КОГДА НомерНедели = 1 ТОГДА Количество ИНАЧЕ NULL КОНЕЦ) КАК ПерваяНеделя,
    МАКСИМУМ(ВЫБОР КОГДА НомерНедели = 2 ТОГДА Количество ИНАЧЕ NULL КОНЕЦ) КАК ВтораяНеделя
ИЗ ИсходнаяТаблица
СГРУППИРОВАТЬ ПО Месяц

Важное замечание: использование МАКСИМУМ (или других агрегатных функций, таких как СУММА) при группировке является критически важным, так как именно оно позволяет «схлопнуть» несколько строк в одну по измерению Месяц.

Почему лучше использовать СКД?

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

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

Когда стоит выгружать данные в таблицу значений?

Иногда количество колонок, которые нужно транспонировать, заранее неизвестно или оно динамически меняется. В таких случаях написание «портянок» кода в запросе становится неэффективным. Рекомендуем следующий алгоритм:

Этот подход значительно проще в отладке и позволяет избежать проблем с производительностью СУБД, перенося часть логики на уровень приложения, что часто является более оправданным с точки зрения архитектуры системы.

Подведем итог: если данные статичны — используйте возможности СКД (тип отчета Таблица). Если нужно выполнить специфические расчеты по итогам — используйте Вычисляемые поля. К написанию сложных конструкций ОБЪЕДИНИТЬ ВСЕ прибегайте только в крайнем случае, когда возможности платформы по отчетности ограничены специфическими требованиями бизнес-задачи.

← На главную