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