Как в 1С вывести строки в колонки: превращаем данные в кросс-таблицу

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

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

Самый простой и эффективный способ для создания отчетов — использование Система компоновки данных (СКД). Платформа предоставляет встроенные механизмы для автоматического разворачивания данных.

  1. В настройках отчета добавьте новую группировку.
  2. Вместо классического списка выберите структуру «Таблица».
  3. В качестве строк установите поле Номенклатура.
  4. В качестве столбцов установите поле ВидЦены.Наименование.
  5. В выбранных полях (ресурсах) укажите поле Цена с функцией Сумма().

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

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

Если вам требуется получить данные не в отчете, а в ТаблицаЗначений для дальнейшей обработки в коде, лучше всего воспользоваться методом постобработки линейного результата запроса. Это позволяет избежать сложных и тяжелых запросов с множественными соединениями.

Алгоритм действий:

  1. Выполните простой запрос к данным, выбрав Номенклатура, ВидЦены и Цена.
  2. Создайте пустую ТаблицаЗначений и добавьте в нее колонку Номенклатура.
  3. В цикле обхода результата запроса проверяйте наличие колонки для каждого вида цены. Если её нет — добавляйте её методом Колонки.Добавить().
  4. Для заполнения используйте НайтиСтроки() или Соответствие для быстрого поиска нужной номенклатуры в таблице.

Этот метод считается наиболее гибким, так как он не ограничивает вас заранее известным списком колонок и отлично работает при динамически меняющемся количестве видов цен.

Способ 3: Динамические запросы и соединения

В некоторых случаях разработчики прибегают к формированию текста запроса динамически. Этот метод предполагает, что вы сначала получаете список всех необходимых видов цен, а затем в цикле формируете текст запроса с нужным количеством условий или соединений.

Пример логики динамического построения запроса:


ТекстЗапроса = "ВЫБРАТЬ спр.Ссылка КАК Номенклатура";
Для Каждого ВидЦены Из МассивВидовЦен Цикл
    ТекстЗапроса = ТекстЗапроса + "
    | , СУММА(ВЫБОР КОГДА Цены.ВидЦены = &Вид" + ВидЦены.Код + " ТОГДА Цены.Цена ИНАЧЕ 0 КОНЕЦ) КАК " + ВидЦены.ИмяКолонки;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + " ИЗ Справочник.Номенклатура КАК спр ...";

Использование конструкции ВЫБОР КОГДА при группировке (условная агрегация) является более производительным решением для СУБД, чем выполнение множества ЛЕВОЕ СОЕДИНЕНИЕ, так как база данных делает всего один проход по таблице.

Что выбрать?

Для создания отчетов всегда используйте СКД — это стандарт платформы, требующий минимальных усилий. Если задача стоит в получении данных для программного алгоритма (например, для заполнения формы), используйте постобработку в памяти через ТаблицаЗначений. К динамическим запросам стоит прибегать только в случаях, когда данных очень много и критически важна производительность на уровне SQL-сервера.

← На главную