Альтернатива внешним печатным формам. ЗУП 3.1

Как в ЗУП 3.1.8 отказаться от внешних печатных форм и расширением увеличить количество полей, доступных при редактировании макетов, для изменения печатных форм Т1, Т5, Т8 и аналогичные пользователями.

В ЗУП 3.1.8  КОРП реализовали возможность вносить определённые изменения в макеты печатных форм и отчётов самим пользователем, без изменения конфигурации. В ПРОФ версии этот механизм остался куцым. Т.е. если вам надо поменять название колонки, добавить надпись — это пожалуйста. А если вам надо вывести дополнительные какие то параметры — тут все немного сложнее.

Так как у меня проект по переходу с переписанной 2.5 на 3.1 то печатные формы — это как раз то, чем мне совсем не хочется заниматься — и без них полно проблем.

Первым делом я заглянула что есть на самом инфостарте: для  3.1.8 подходила только публикация отсюда //infostart.ru/public/783619/ , но есть жирное "НО" — она не редактирует саму СКД, т.е. чтобы подлезть к составу выбранных полей, добавить ещё несколько вычисляемых полей или что угодно другое — необходимо либо программно допиливать, либо ещё как то извращаться, при этом рискую попасть впросак с пользовательскими настройками отчета. Было решено искать обходные пути. 

После осмотра списка выбранных полей в СКД обратила внимание, что если воспользоваться теми полями, которых нет на форме — они действительно выводятся, например у нас принято использовать полное наименование организации в Т-1. 

   

 

Эта возможность уже решает часть задач, но мне надо гораздо больше. Дело в том, что у нас привыкли использовать полное наименование подразделения, где родители подразделения указаны в родительном падеже, например:

 

Для этого мне потребовалось добавить расширение с назначением "Исправление". Теперь отважно прошествуем в общий модуль ЗарплатаКадрыОтчеты и добавив его в расширение заменяем функцию ПодразделениеНаПечать. Так как у нас действительно везде в документообороте используется в качестве полного наименования это представление подразделения — я решила воспользоваться именно этим вариантом. Возможно в дальнейшем я об этом пожалею, но пока все устраивает. Получилось вот так:

&Вместо("ПодразделениеНаПечать")
Функция Исправ_ПодразделениеНаПечать(Знач Подразделение) Экспорт

Если ЗначениеЗаполнено(Подразделение) Тогда

НастройкиПечатныхФорм = ЗарплатаКадры.НастройкиПечатныхФорм();
Если НастройкиПечатныхФорм.ВыводитьПолнуюИерархиюПодразделений Тогда
//Возврат Подразделение.ПолноеНаименование();
Возврат ПолучитьПолноеНаименованиеПодразделения(Подразделение);
Иначе
Возврат Подразделение;
КонецЕсли;

Иначе
Возврат "";
КонецЕсли;

КонецФункции

Функция ПолучитьПолноеНаименованиеПодразделения(Подразделение)

ТПодразделение = Подразделение.Родитель;
ПодразделениеТекстом = Подразделение.Наименование;
Пока не (ТПодразделение.Родитель = Справочники.ПодразделенияОрганизаций.ПустаяСсылка()) Цикл
ПодразделениеТекстом = ПодразделениеТекстом + " "
+ СклонениеПредставленийОбъектов.ПросклонятьПредставление(ТПодразделение.Наименование, 2, ТПодразделение.Ссылка);
ТПодразделение = ТПодразделение.Родитель;
КонецЦикла;

Возврат ПодразделениеТекстом;

КонецФункции

Мне удобненько: видно, что было раньше и мне все равно какие ещё способы изобретет 1С для формирования краткого и полного наименования — для меня этот способ самый верный.

Следующая проблема — расширить список выбранных полей. Тут встал вопрос, а не получится ли, что у меня у пользователей будут какие-то дополнительные пользовательские настройки. Или вдруг этот отчет вызывается ещё из десятка мест.. или ещё нечто неведомое.. Значит саму СКД трогать даже программно надо аккуратно. Но нам надо возможность добавлять поля и заполнять их чем нашей душе угодно. Лезу проверять процедуры печати отчета, в надежде, что есть возможность что-то подпихнуть перед формированием в СКД.

Если ЗАО 1С выпилила механизм доступных полей с пользовательского интерфейса, то уж со стороны кода он обязательно где-нибудь торчит, например прямо в процедуре Сформировать посреди модуля менеджера отчета:

Процедура Сформировать(ДокументРезультат, РезультатКомпоновки, ОбъектыПечати = Неопределено) Экспорт

КадровыйУчет.ВывестиНаПечатьТ1(
ДокументРезультат,
РезультатКомпоновки.ДанныеОтчета.Строки,
РезультатКомпоновки.МакетПечатнойФормы,
РезультатКомпоновки.ИдентификаторыМакета,
ОбъектыПечати);

КонецПроцедуры

Вот прямо здесь РезультатКомпоновки.ДанныеОтчета.Строки — это и есть наше дерево строк результата. Т.е здесь уже все данные сформированы и там именно то, что в дальнейшем будет выводиться к нам на печать. Значит, не грех добавить ещё пару колонок. Захватываем модуль менеджера отчета и перед Сформировать добавляем свои несколько строк кода:

&Перед("Сформировать")
Процедура Испр_Сформировать(ДокументРезультат, РезультатКомпоновки, ОбъектыПечати)
Для каждого ТДокументы из РезультатКомпоновки.ДанныеОтчета.Строки Цикл
Если ЗначениеЗаполнено(ТДокументы.СсылкаНаОбъект) тогда
Если РезультатКомпоновки.ДанныеОтчета.Колонки.Найти("СсылкаНаОбъектДолжностьРуководителяНаПечать") = неопределено тогда
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Строка"));
КС = Новый КвалификаторыСтроки(250);
ОписаниеСтроки = Новый ОписаниеТипов(МассивТипов,КС);
РезультатКомпоновки.ДанныеОтчета.Колонки.Добавить("СсылкаНаОбъектДолжностьРуководителяНаПечать",
ОписаниеСтроки,
"СсылкаНаОбъект.Должность руководителя на печать",
);
Иначе
КонецЕсли;

Для каждого ТПараметрыДокумента из ТДокументы.Строки Цикл
ТПараметрыДокумента.СсылкаНаОбъектДолжностьРуководителяНаПечать = ЗарплатаКадрыОтчеты.ДолжностьПодписантаНаПечать();//ТПараметрыДокумента.СсылкаНаОбъект.Руководитель);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Функцию формирования самого строкового представления я опять вытаскиваю в общий модуль ЗарплатаКадрыОтчеты — он у меня уже захвачен, а специфичное представление должности подписанта мне потребуется ещё пожалуй в нескольких печатных формах для кадров и расчетчиков. Кстати, я могу здесь даже передавать в функции параметром любое выбранное в СКД поле, а так же любой реквизит этого поля. А также можно свободно добавлять сколько угодно дополнительных колонок в структуру дерева, и все эти колонки будут доступны нам в качестве параметров макета в пользовательском режиме:

 

Итог:

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

2 Comments

  1. Japan

    Тема хорошая, но не всем подойдет, т.к. доработка общих модулей вещь такая, в какой то ВПФ нужно — в какой то нет, хорошо что у вас совпало для всех. По поводу моей выкладки //infostart.ru/public/783619/, добавлять там свои параметры можно, у меня описано как это сделать.

    Reply
  2. MishaD

    Сделал через внешнюю печатную форму, но ваша методика через расширение будет поудобней.

    Reply

Leave a Comment

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