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