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