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