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