В процессе разработки аналитических отчетов перед программистом 1С часто встает задача создания сводных таблиц (Pivot Tables), аналогичных тем, что используются в Excel. Традиционный подход с динамическим формированием текста запроса в цикле является трудоемким и сложным в поддержке. В этой статье мы подробно разберем современные и классические методы реализации сводных таблиц, которые предоставляет платформа 1С:Предприятие 8.
Система компоновки данных — это основной и наиболее рекомендуемый инструмент для построения многомерных отчетов. Рассмотрим подробнее, как реализовать сводную таблицу через СКД.
Основным элементом здесь выступает группировка типа "Таблица". В отличие от обычной линейной группировки, "Таблица" позволяет задать измерения для строк и измерения для колонок. Проанализируем шаги настройки:
Номенклатура).Период или Склад).Сумма).Важный нюанс: Как отмечалось в обсуждении, результат СКД с типом "Таблица" стандартными средствами выгружается только в табличный документ. Если вам необходимо программно получить эти данные в ТаблицаЗначений, придется использовать ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Выясним причину сложности: структура кросс-таблицы не является плоской, поэтому автоматическая выгрузка "как есть" невозможна. Программисту необходимо самостоятельно обойти дерево результата.
Если требуется предоставить пользователю интерактивный инструмент в стиле Excel прямо на форме, стоит обратить внимание на объект СводнаяТаблица. Этот механизм позволяет перетаскивать поля мышкой, менять измерения и показатели местами в режиме реального времени.
Разберем алгоритм программного подключения:
Сначала необходимо разместить на форме элемент управления ПолеТабличногоДокумента. Затем инициализируем сводную таблицу и связываем её с данными. Посмотрим на пример кода:
// Пример инициализации сводной таблицы
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента1;
СводнаяТаб = ТабДок.ВстроенныеТаблицы.Добавить(Тип("СводнаяТаблица"));
// В качестве источника можно использовать ТаблицуЗначений или РезультатЗапроса
СводнаяТаб.ИсточникДанных = РезультатЗапроса;
// Настройка отображения
СводнаяТаб.ОтображатьПоля = Истина;
СводнаяТаб.Обновление = Истина;
Проанализируем преимущества этого метода: интерактивность. Пользователь сам решает, что он хочет видеть в строках, а что в колонках. Однако помните, что этот механизм считается "древним злом" из-за ограниченных возможностей стилизации и проблем с производительностью на сотнях тысяч строк.
Малоизвестный, но мощный инструмент платформы — объект АнализДанных с типом анализа Сводка. Рассмотрим, как он работает. Этот объект предназначен для автоматизированного построения статистических сводок.
АнализДанных.ТипАнализаДанных.Сводка.Выполнить(), который возвращает объект РезультатАнализаДанныхСводка.Этот результат можно вывести в табличный документ. Система сама сгруппирует данные и создаст иерархию. Выясним, почему это удобно: вам не нужно вручную описывать структуру колонок, система делает это автоматически на основе метаданных источника.
Если количество колонок заранее известно и фиксировано (например, 12 месяцев года), эффективнее всего использовать чистый SQL-подход в запросе 1С. Разберем по шагам, как это выглядит в коде запроса:
ВЫБРАТЬ
Продажи.Номенклатура КАК Номенклатура,
СУММА(ВЫБОР КОГДА МЕСЯЦ(Продажи.Период) = 1 ТОГДА Продажи.Сумма ИНАЧЕ 0 КОНЕЦ) КАК Январь,
СУММА(ВЫБОР КОГДА МЕСЯЦ(Продажи.Период) = 2 ТОГДА Продажи.Сумма ИНАЧЕ 0 КОНЕЦ) КАК Февраль,
// ... и так далее для каждого месяца
СУММА(Продажи.Сумма) КАК Итого
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГРУППИРОВАТЬ ПО
Продажи.Номенклатура
Этот метод работает быстрее всего, так как вся агрегация происходит на стороне СУБД. Главный минус — отсутствие динамики. Если состав колонок меняется (например, нужно выводить склады, список которых непостоянен), придется возвращаться к динамической генерации текста запроса.
В современных версиях платформы (8.3.14+) появилась технология 1С:Аналитика. Это полноценная BI-система внутри экосистемы 1С. Если ваша задача — предоставить руководству красивые и быстрые сводные таблицы (диаграммы, дашборды) с возможностью Drill-down (расшифровки до документа), то это лучшее решение.
Рассмотрим подробнее работу 1С:Аналитики:
Подведем итог нашему анализу. Выбор метода зависит от конкретной бизнес-задачи:
СводнаяТаблица (для простых задач) или 1С:Аналитика (для серьезного BI).АнализДанных.ВЫБОР.Использование динамического формирования текста запроса в цикле (как упоминал автор темы) допустимо только в самых крайних случаях, когда ни один из вышеперечисленных инструментов не позволяет добиться нужного результата из-за специфических ограничений бизнес-логики.