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

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

В процессе разработки аналитических отчетов перед программистом 1С часто встает задача создания сводных таблиц (Pivot Tables), аналогичных тем, что используются в Excel. Традиционный подход с динамическим формированием текста запроса в цикле является трудоемким и сложным в поддержке. В этой статье мы подробно разберем современные и классические методы реализации сводных таблиц, которые предоставляет платформа 1С:Предприятие 8.

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

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

Основным элементом здесь выступает группировка типа "Таблица". В отличие от обычной линейной группировки, "Таблица" позволяет задать измерения для строк и измерения для колонок. Проанализируем шаги настройки:

  1. В схеме компоновки данных создаем набор данных (запрос), который выбирает "плоские" данные (например, Период, Номенклатура, Склад, Сумма).
  2. На вкладке "Настройки" добавляем элемент "Таблица".
  3. В "Строки" таблицы добавляем нужные измерения (например, Номенклатура).
  4. В "Колонки" таблицы добавляем измерения, которые должны развернуться горизонтально (например, Период или Склад).
  5. В "Выбранные поля" добавляем ресурсы (например, Сумма).

Важный нюанс: Как отмечалось в обсуждении, результат СКД с типом "Таблица" стандартными средствами выгружается только в табличный документ. Если вам необходимо программно получить эти данные в ТаблицаЗначений, придется использовать ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Выясним причину сложности: структура кросс-таблицы не является плоской, поэтому автоматическая выгрузка "как есть" невозможна. Программисту необходимо самостоятельно обойти дерево результата.

Метод 2: Встроенный объект «СводнаяТаблица»

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

Разберем алгоритм программного подключения:

Сначала необходимо разместить на форме элемент управления ПолеТабличногоДокумента. Затем инициализируем сводную таблицу и связываем её с данными. Посмотрим на пример кода:


// Пример инициализации сводной таблицы
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;
СводнаяТаб = ТабДок.ВстроенныеТаблицы.Добавить(Тип("СводнаяТаблица"));

// В качестве источника можно использовать ТаблицуЗначений или РезультатЗапроса
СводнаяТаб.ИсточникДанных = РезультатЗапроса; 

// Настройка отображения
СводнаяТаб.ОтображатьПоля = Истина;
СводнаяТаб.Обновление = Истина;

Проанализируем преимущества этого метода: интерактивность. Пользователь сам решает, что он хочет видеть в строках, а что в колонках. Однако помните, что этот механизм считается "древним злом" из-за ограниченных возможностей стилизации и проблем с производительностью на сотнях тысяч строк.

Метод 3: Использование объекта «АнализДанных»

Малоизвестный, но мощный инструмент платформы — объект АнализДанных с типом анализа Сводка. Рассмотрим, как он работает. Этот объект предназначен для автоматизированного построения статистических сводок.

  1. Создаем объект АнализДанных.
  2. Устанавливаем тип анализа ТипАнализаДанных.Сводка.
  3. Задаем источник данных (результат запроса или таблицу значений).
  4. Выполняем метод Выполнить(), который возвращает объект РезультатАнализаДанныхСводка.

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

Метод 4: Реализация через запрос (Конструкция ВЫБОР)

Если количество колонок заранее известно и фиксировано (например, 12 месяцев года), эффективнее всего использовать чистый SQL-подход в запросе 1С. Разберем по шагам, как это выглядит в коде запроса:


ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    СУММА(ВЫБОР КОГДА МЕСЯЦ(Продажи.Период) = 1 ТОГДА Продажи.Сумма ИНАЧЕ 0 КОНЕЦ) КАК Январь,
    СУММА(ВЫБОР КОГДА МЕСЯЦ(Продажи.Период) = 2 ТОГДА Продажи.Сумма ИНАЧЕ 0 КОНЕЦ) КАК Февраль,
    // ... и так далее для каждого месяца
    СУММА(Продажи.Сумма) КАК Итого
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГРУППИРОВАТЬ ПО
    Продажи.Номенклатура

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

Метод 5: 1С:Аналитика

В современных версиях платформы (8.3.14+) появилась технология 1С:Аналитика. Это полноценная BI-система внутри экосистемы 1С. Если ваша задача — предоставить руководству красивые и быстрые сводные таблицы (диаграммы, дашборды) с возможностью Drill-down (расшифровки до документа), то это лучшее решение.

Рассмотрим подробнее работу 1С:Аналитики:

Итоги и рекомендации

Подведем итог нашему анализу. Выбор метода зависит от конкретной бизнес-задачи:

  1. Для типовых отчетов в конфигурации всегда используйте СКД. Это стандарт индустрии, который поймет любой другой программист.
  2. Для сложных интерфейсов, где пользователь должен сам "крутить" данные, используйте СводнаяТаблица (для простых задач) или 1С:Аналитика (для серьезного BI).
  3. Для программной обработки данных, если нужно получить результат сворачивания в коде для дальнейших расчетов, используйте программный вывод СКД в коллекцию или объект АнализДанных.
  4. Для максимальной скорости на фиксированных измерениях используйте запрос с конструкцией ВЫБОР.

Использование динамического формирования текста запроса в цикле (как упоминал автор темы) допустимо только в самых крайних случаях, когда ни один из вышеперечисленных инструментов не позволяет добиться нужного результата из-за специфических ограничений бизнес-логики.

← На главную