Расширение функционала произвольных отчетов (сохранение в настройках ориентации страницы и повтор области строк при выводе на печать)





Расширение функционала вывода на печать произвольных отчетов для УПП, КА и других конфигураций, использующих механизм произвольных отчетов. Позврляет сохранять в настройках (справочник Сохраненные настройки) ориентации страницы, масштаб и повтор области строк при выводе на печать.

Расширение фунционала вывода на печать произвольных отчетов для УПП, КА и других конфигураций, использующих механизм произвольных отчетов. Позволяет сохранять в настройках (справочник Сохраненные настройки) ориентации страницы, масштаб и повтор области строк при выводе на печать.

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

 

Все изменения для реализации данной задачи коснулись только отчета «ПроизвольныйОтчет».

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 окончание

ТиповыеОтчеты.УправлениеОтображениемЗаголовкаТиповогоОтчета(ЭтотОбъект, Результат);

КонецЕсли;

#КонецЕсли

 

  

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

 

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

 

Результат вывода на печать с повторяющейся частью шапки таблицы:

 

3 Comments

  1. melis

    если кому-то будет нужно, могу сохарнить как внешний «ПроизвольныйОтчет», с описанными изменениями, из последней УПП

    Reply
  2. sergiobargio1

    очень хорошая и часто необходимая настройка. в УПП произвольные отчёты есть. не подскажите: а для БП можно привинтить к самописным внешним отчётам Вашу настройку как есть или необходимо будет сначало подправить код? Спасибо.

    Reply
  3. melis

    Привинтить можно, если у отчтеов есть форма, но код тогда может оказаться немного другим

    Reply

Leave a Comment

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