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