Как программно или через настройки изменить текст в макете СКД в зависимости от параметров

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает необходимость кастомизации заголовков или отдельных областей шапки. Стандартных механизмов вывода не всегда достаточно, особенно когда текст в ячейке должен меняться по сложной логике, зависящей от выбора пользователя. Чтобы ускорить процесс разработки и отладки таких механизмов, в этой статье мы детально рассмотрим классические способы управления текстом, начиная от самых простых и заканчивая полным программным управлением выводом.

Способ 1. Использование выражений в параметрах макета

Это наиболее элегантный и простой способ, который не требует написания сложного программного кода в модуле отчета, что позволяет достичь максимума возможностей СКД без кода. наименование организации, если она выбрана в параметрах.

Для реализации этого подхода выполним следующие шаги:

  1. Перейдем на закладку Макеты в схеме компоновки данных.
  2. В нужной ячейке макета вместо статического текста выберем тип заполнения Параметр.
  3. Дадим параметру понятное имя, например, ЗаголовокОрганизации.
  4. В таблице параметров (ниже области макета) для созданного параметра в колонке Выражение напишем условие.

Проанализируем пример выражения для параметра:


?(ЗначениеЗаполнено(ПараметрыДанных.Организация), 
  ПараметрыДанных.Организация.НаименованиеПолное, 
  "Организация не выбрана")

Здесь мы используем тернарный оператор встроенного языка СКД. Система проверит, заполнено ли значение параметра Организация, и в зависимости от результата подставит нужный текст прямо в макет при формировании отчета.

Способ 2. Вызов функций общих модулей в макете

Иногда логика формирования текста настолько сложна, что уместить ее в одну строку выражения невозможно. Например, нам нужно выполнить дополнительный запрос к базе данных или собрать строку из множества реквизитов. В этом случае правильная интеграция общих модулей с СКД позволяет вызвать функцию общего модуля прямо из макета.

Важное условие: Общий модуль должен иметь флаги Сервер, Внешнее соединение и Вызов сервера. Кроме того, функция должна быть экспортной.

Разберем по шагам:

  1. Создадим в общем модуле ОтчетыСервер функцию:

Функция ПолучитьСложныйТекстЗаголовка(ВыбраннаяОрганизация) Экспорт
    Если НЕ ЗначениеЗаполнено(ВыбраннаяОрганизация) Тогда
        Возврат "Данные по всем подразделениям";
    КонецЕсли;
    
    // Здесь может быть запрос или любая логика
    Результат = "Отчет по организации: " + ВыбраннаяОрганизация.НаименованиеПолное;
    Возврат Результат;
КонецФункции
  1. В макете СКД в поле Выражение параметра ячейки укажем:

ОтчетыСервер.ПолучитьСложныйТекстЗаголовка(ПараметрыДанных.Организация)

Этот метод позволяет сохранять чистоту схемы компоновки, вынося сложную логику в программный код.

Способ 3. Программная модификация в событии ПриКомпоновкеРезультата

Если задача требует "фантастической" гибкости, мы можем вмешаться в процесс компоновки программно. Это особенно актуально, когда требуется программное изменение заголовка группировки отчета, которое невозможно реализовать стандартными средствами. Для этого в модуле отчета переопределим процедуру ПриКомпоновкеРезультата. Чтобы сделать такой код более компактным и читаемым, разработчики часто применяют СКДБилдер: специальную обёртку над объектной моделью СКД.

Выясним причину, почему программный подход эффективен: мы получаем полный доступ к настройкам и самому объекту макета компоновки.


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

    // 5. Выводим результат
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(Результат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

В этом примере мы перехватываем объект МакетКомпоновкиДанных и напрямую меняем значения в его коллекции ЗначенияПараметров. Это позволяет динамически управлять данными даже в тех случаях, когда они не привязаны напрямую к полям БД.

Способ 4. Использование условного оформления для подмены текста

Малоизвестный, но крайне эффективный прием — использование Условного оформления для изменения выводимого текста. Этот метод является одним из мощных приемов работы с СКД без кода. Рассмотрим, как это работает:

  1. В настройках отчета перейдем на вкладку Условное оформление.
  2. Добавим новый элемент оформления.
  3. В оформляемых полях выберем наше поле (например, Организация).
  4. В колонке Оформление найдем свойство Текст и впишем туда нужное значение.
  5. В условии укажем, при каких обстоятельствах этот текст должен появиться (например, ПараметрыДанных.Организация Заполнено = Истина).

Этот метод хорош тем, что он работает на уровне визуального представления и легко настраивается пользователем в режиме 1С:Предприятие без изменения конфигурации.

Способ 5. Дополнительные свойства и глобальный контекст

Когда данных для макета нужно много, и они зависят от внешних факторов (текущая дата, валюта, пользователь), мы можем использовать ДополнительныеСвойства компоновщика настроек. Такой подход к передаче сложных данных в СКД позволяет передавать произвольные объекты прямо в "сердце" процесса компоновки. Иногда это требует нетривиальных архитектурных решений, таких как использование двух разных схем в одном отчете или специфическая оптимизация отчетов с набором данных типа «объект».

Проанализируем алгоритм передачи свойств:

  1. В коде модуля перед компоновкой заполняем структуру:

КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства.Вставить("ФИОДиректора", "Иванов И.И.");
  1. В макете СКД через вызов функции общего модуля или через выражение пользовательского поля обращаемся к этой коллекции.

Это обеспечивает максимальную гибкость шаблонов, позволяя выводить практически любую служебную информацию.

Резюме и рекомендации

Мы рассмотрели различные подходы к программному и полупрограммному изменению текста в макетах СКД. Эти динамические методы управления текстом позволяют значительно расширить возможности стандартных отчетов. Подведем итоги:

Выбор метода зависит от конкретной задачи, но для большинства повседневных нужд связки Параметр макета + Выражение оказывается более чем достаточно. Это сохраняет производительность отчета и делает его код понятным для других разработчиков.

← На главную