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