gifts2017

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

Опубликовал Melis Kim (melis) в раздел Программирование - Практика программирования

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

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

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

 

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

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

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

   КонецЕсли;

  #КонецЕсли

 

  

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

 

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

 

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

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Melis Kim (melis) 20.08.12 20:19
если кому-то будет нужно, могу сохарнить как внешний "ПроизвольныйОтчет", с описанными изменениями, из последней УПП
2. Sergio Bargio (sergiobargio1) 22.08.12 14:33
очень хорошая и часто необходимая настройка. в УПП произвольные отчёты есть. не подскажите: а для БП можно привинтить к самописным внешним отчётам Вашу настройку как есть или необходимо будет сначало подправить код? Спасибо.
3. Melis Kim (melis) 22.08.12 20:37
Привинтить можно, если у отчтеов есть форма, но код тогда может оказаться немного другим
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа