[ Вопрос дня ] Какие тонкости имеются при программном выводе заголовка отчета на СКД?

В этой статье разберем довольно популярный вопрос, с которым можно столкнуться не только в реальной работе, но и при устройстве на работу.

Чтобы было понятно, о чем далее пойдет речь, посмотрим на проблему глазами пользователя. Есть простейший отчет, построенный при помощи СКД, вид которого представлен на рис.1:

Исходный демонстрационный отчет
Рис. 1. Исходный демонстрационный отчет

Нам нужно, чтобы отчет имел заголовок «Отчет по продажам» с параметрами, которые бы заполнялись на основе произвольных данных. Для простоты, в нашем случае эти параметры заголовка будем заполнять из параметров самого отчета (Рис. 2):

Требуемый вид отчета
Рис. 2. Требуемый вид отчета

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

Вопрос

Тестирую разные варианты вывода заголовка в отчет на СКД, не могу понять логику.1 вариант

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    Начало = Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода").Значение;
НачалоПериода = Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода").Значение;
    КонецПериода = Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода").Значение;
    ТекстЗаголовка = "Отчет по продажам";
    НачалоПериода = Дата(НачалоПериода);
    ТекстЗаголовка = ТекстЗаголовка + " с " + Формат(НачалоПериода, "ДФ=dd.MM.yyyy");
    КонецПериода = Дата(КонецПериода);
    ТекстЗаголовка = ТекстЗаголовка + " по " + Формат(КонецПериода, "ДФ=dd.MM.yyyy");    
КомпоновщикНастроек.Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", ТекстЗаголовка);        
КонецПроцедуры

 

2 вариант

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    НачалоПериода = Настройки.ПараметрыДанных.Элементы.Найти("НачалоПериода").Значение;
    КонецПериода = Настройки.ПараметрыДанных.Элементы.Найти("КонецПериода").Значение;
    ТекстЗаголовка = "Отчет по продажам";
    НачалоПериода = Дата(НачалоПериода);
    ТекстЗаголовка = ТекстЗаголовка + " с " + Формат(НачалоПериода, "ДФ=dd.MM.yyyy");
    КонецПериода = Дата(КонецПериода);
    ТекстЗаголовка = ТекстЗаголовка + " по " + Формат(КонецПериода, "ДФ=dd.MM.yyyy");    КомпоновщикНастроек.Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", ТекстЗаголовка);
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);    
КонецПроцедуры

Во втором варианте заголовок не меняется на желаемый. Но если исправить одну строчку:

вместо

КомпоновщикНастроек.Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(“Заголовок”, ТекстЗаголовка);

написать

Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(“Заголовок”, ТекстЗаголовка);

отрабатывает так, как надо.

В общем, комбинации строк дают разные результаты:

Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(“Заголовок”, ТекстЗаголовка);
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); // результат какой надо
КомпоновщикНастроек.Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(“Заголовок”, ТекстЗаголовка);
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); // заголовок не меняется ( а в варианте 1 при таком коде меняется )
КомпоновщикНастроек.Настройки.ПараметрыВывода.УстановитьЗначениеПараметра(“Заголовок”, ТекстЗаголовка);
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);

вообще ведет к ошибке , компоновка не происходит.

Я запутался в разных сущностях с одинаковыми именами и типами. Результата я добиваюсь, но нет чувства, что разобрался полностью. Не проясните?

Ответ

Здесь дело в двух моментах: значении параметра СтандартнаяОбработка (Истина или Ложь) и в значениях переменных, связанных с настройками компоновки.

1 вариант

СтандартнаяОбработка в коде не изменяется, значит, система будет формировать отчет автоматически. Нам нужно только обеспечить, чтобы в компоновщике содержались корректные настройки. Далее система самостоятельно получит эти настройки из компоновщика, выполнит все действия по компоновке отчета.

Поэтому работать надо именно с компоновщиком настроек:

КомпоновщикНастроек.Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", ТекстЗаголовка);

Вы именно так и делаете, всё получается правильно.

2 вариант

СтандартнаяОбработка в коде установлена в значение Ложь. Значит, все действия по компоновке отчета нужно выполнить вручную (создать макет компоновки по схеме и настройкам компоновки, поработать с процессором компоновки и с процессором вывода результата компоновки данных в табличный документ).

У вас получается следующий код (не самые важные строки я отбросил):

СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ТекстЗаголовка = ...;
КомпоновщикНастроек.Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", ТекстЗаголовка);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
...

Вы получили из компоновщика настройки. Они хранятся в переменной Настройки. Затем в компоновщике устанавливаете новый заголовок, но в переменной Настройки всё осталось без изменений. Это фактически две разные переменные – Настройки (без заголовка) и КомпоновщикНастроек.Настройки (с новым заголовком).

А макет компоновки вы получаете на основании переменной Настройки, где заголовок не установлен. Поэтому на выходе этот заголовок не выводится в отчете.

Попробуйте еще для закрепления поменять порядок строк:

СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
ТекстЗаголовка = ...;
КомпоновщикНастроек.Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", ТекстЗаголовка);
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
...

 

В этом случае заголовок в отчете уже будет выводиться.

Таким образом, можно сделать следующие выводы:

  1. При использовании метода ПолучитьНастройки к “обычным” настройкам применяются пользовательские и фиксированные настройки из этого же компоновщика. В результате выполнения этого метода получаем переменную типа НастройкиКомпоновкиДанных. Это именно те настройки, с которыми и будет компоноваться отчет.
  2. Если нужно установить один параметр в настройках, то нет смысла отключать стандартную обработку. Если же необходимо отчет скомпоновать полностью вручную (например, предварительно подготовить таблицу с внешними данными, обработать ее, вывести ее в виде отчета), то тогда отключаем стандартную обработку и вручную прописываем все шаги формирования отчета.

Этим, пожалуй, и завершим разбор сегодняшнего вопроса.  Как видите, казалось бы, такая простая задача, как вывод заголовка, которая по сути своей является вспомогательной при решении билетов, при должном рассмотрении является не такой и простой. Но мы надеемся, что после знакомства с нашим материалом у вас немного “просветлело” :)

Завтра разберем новый вопрос, в котором внимательная слушательница чуть не подловила нашего тренера, поэтому не переключайтесь!

Комментарии / обсуждение (2):

    • Василий Ханевич

      Добрый день!
      Это можно реализовать при помощи программной работы с получившимся отчетом – табличным документом.

      Пусть структура отчета выглядит следующим образом. Создана отдельная группировка для вывода заголовка отчета:
      Структура
      Настраиваем макет группировки для заголовка:
      Макет
      В процедуре ПриКомпоновкеРезультата выполняем компоновку отчета и дорабатываем получившийся табличный документ – объединяем ячейки для заголовка и центрируем:

      Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
         
          СтандартнаяОбработка = Ложь;
         
          Настройки = КомпоновщикНастроек.ПолучитьНастройки();
          КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
          МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
         
          ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
          ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
         
          ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
          ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
          ПроцессорВывода.Вывести(ПроцессорКомпоновки);
         
          Область = ДокументРезультат.Область(1, 1, 1, ДокументРезультат.ШиринаТаблицы);
          Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
         
      КонецПроцедуры

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.