При разработке сложных аналитических отчетов в системе компоновки данных (СКД) часто возникает задача визуального объединения нескольких колонок под одной «общей» шапкой. Типичный пример: у нас есть категории (например, «Фонд заработной платы») и входящие в них виды расчетов (оклад, премия). Нам нужно, чтобы заголовок категории располагался над всеми соответствующими видами расчета, а рядом с ними выводился итог по этой самой категории — и все это под единой «крышей» заголовка категории.
Рассмотрим подробнее, как реализовать такую структуру, используя стандартные механизмы СКД, и разберем, почему простые настройки списка иногда не позволяют добиться желаемого результата.
Проанализируем наиболее правильный с точки зрения архитектуры СКД подход. Если нам нужно, чтобы одна группировка «накрывала» другую в горизонтальной плоскости (в колонках), нам следует использовать элемент Таблица вместо обычного Списка в настройках структуры отчета.
Разберем по шагам, как это настроить:
Категория, а внутри него (как подчиненную группировку) добавим поле ВидРасчета.Теперь самое важное — как заставить общие итоги по категории встать под ту же шапку. Для этого выделим группировку Категория в колонках и перейдем на вкладку Другие настройки (внизу окна настроек):
В этом случае система автоматически создаст ячейку-заголовок для Категория, которая будет объединена над всеми колонками ВидРасчета и колонкой «Итого» данной категории. Это самый надежный метод для динамических данных, когда состав видов расчета заранее неизвестен.
Если по каким-то причинам использование кросс-таблицы невозможно (например, отчет должен оставаться плоским списком), можно применить метод визуального объединения колонок. Выясним, как это работает через настройки выбранных полей.
Посмотрим на алгоритм действий:
ВидРасчета и наш ресурс Сумма.Важный нюанс: Этот способ хорошо работает, если колонки фиксированы. Если же ВидРасчета — это группировка, то для «накрытия» итогов этим методом придется комбинировать настройки расположения ресурсов. Чтобы убрать лишние подзаголовки (например, слово «Сумма»), установите параметр Вариант отображения полей в значение Нет для родительской группы полей.
Иногда типовых настроек недостаточно, чтобы шапка выглядела именно так, как требует заказчик. В таких случаях мы используем Макеты. Это позволяет «нарисовать» шапку вручную, сохранив при этом динамическое заполнение данных.
Проанализируем ситуацию: нам нужно объединить ячейки над ресурсом и группировкой. Для этого:
КатегорияЗаголовок).При использовании макетов крайне важно правильно указать Имя группировки в настройках. Если группировка в структуре называется ГруппаКатегория, то и макет должен быть привязан именно к этому имени. Тогда СКД при выводе заменит стандартную генерацию шапки на ваш отрисованный шаблон.
Если состав колонок крайне динамичен, и даже макеты не справляются с правильным объединением, можно прибегнуть к постобработке результата. Рассмотрим пример кода, который можно разместить в модуле объекта отчета в процедуре ПриКомпоновкеРезультата или после вывода процессора вывода:
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Поиск и объединение ячеек в шапке
ОбластьШапки = ДокументРезультат.Область(1, 1, 2, ДокументРезультат.ШиринаТаблицы);
// Здесь можно реализовать логику обхода ячеек и вызова метода Объединить()
Однако помните, что программное объединение — это крайняя мера. В 90% случаев задача «накрытия» одной группировки другой решается через структуру Таблица в настройках СКД с включенным параметром Расположение общих итогов: Конец. Это позволяет сохранить высокую производительность отчета и чистоту кода.
Подводя итог, можно сказать: для корректного отображения иерархической шапки всегда начинайте с настройки структуры колонок в кросс-таблице. Это базовый и самый мощный инструмент СКД для работы с многомерными данными.