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