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