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

20.08.12

Разработка - Механизмы платформы 1С

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

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

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

 

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

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С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    2567    dsdred    16    

59

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5919    dsdred    54    

83

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5875    YA_418728146    25    

68

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6977    dsdred    36    

113

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    19077    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12780    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9407    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6528    sebekerga    54    

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