User Rating: 5 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Active
 

Добрый день.

 

Сегодня хочу рассказать Вам как создавать внешние печатные формы для конфигурации "Зарплата и Управление Персоналом 3.0". Как известно в ЗУП 3.0 использована библиотека стандратных подсистем, а значит струтура обработки выглядит совсем по другому. Когда мне в первый раз пришлось делать печатную форму для БСП в управляемых формах (тогда это была УТ 11), первым делом я полез на диск ИТС с целью найти там подробную документацию, о том какие экспортные процедуры, с какими параметрами должны быть в обрабтке и как оно все работает. Тут ИТС меня немного разочаровал, т.к. там все рассказано, о том, как процедуры должны выглядеть в модуле документа, а во внешней печатной форме параметры процедуры "печать" переставлены местами, поэтому пришлось искать информацию в других источниках и ковырять подсистему изнутри.

 

Ну что же, начнем. То, что у нас получится в конце, вполне можно будет использовать как шаблон.

Шаг первый - очевидный. Создаем новую обработку. Присвоим её произвольное имя: "ОбразецПечати".

Шаг второй. Создадим макет. Поскольку у нас тестовый пример, то макет я создам самый простой, без единого параметра.

Создаем простейший макет с одной горизонтальной секцией, без параметров. (1С ЗУП 3.0)

 Шаг третий - самый интересный. Открываем модуль объекта и начинаем программировать. Согласно БСП при регистрации внешней обработки, она (обработка) должна сообщить, что она умеет, к каким объектам она привязана, как она называется. На вопрос, что она умеет обработка должна вернуть список команд - это таблица значений. В нашем случае обработка умеет выводить одну печатную форму, поэтому команда будет всего одна. Для формирования таблицы значений определим пару процедур, которые во всех внешних печатных формах всегда будут одинаковыми:

//процедура, которая подготавливает структуру таблицы команд

Функция ПолучитьТаблицуКоманд()

   // Создадим пустую таблицу команд и колонки в ней
   Команды = Новый ТаблицаЗначений;

   // Как будет выглядеть описание печатной формы для пользователя
   Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));

   // Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
   Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));

   // Тут задается, как должна вызваться команда обработки
   // Возможные варианты:
   // - ОткрытиеФормы - в этом случае в колонке идентификатор должно быть указано имя формы, которое должна будет открыть система
   // - ВызовКлиентскогоМетода - вызвать клиентскую экспортную процедуру из модуля формы обработки
   // - ВызовСерверногоМетода - вызвать серверную экспортную процедуру из модуля объекта обработки
   Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));

   // Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
   Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));

   // Для печатной формы должен содержать строку ПечатьMXL
   Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
  
   Возврат Команды;
  
КонецФункции

//Создает в таблице команд новую строку

Функция ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
 НоваяКоманда = ТаблицаКоманд.Добавить();
 НоваяКоманда. Представление = Представление;
 НоваяКоманда. Идентификатор= Идентификатор;
 НоваяКоманда. Использование= Использование;
 НоваяКоманда. ПоказыватьОповещение= ПоказыватьОповещение;
 НоваяКоманда. Модификатор= Модификатор;
КонецФункции

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

Функция СведенияОВнешнейОбработке() Экспорт
 ПараметрыРегистрации = Новый Структура;
 МассивНазначений = Новый Массив;
 МассивНазначений.Добавить("Документ.ПриемНаРаботу");
 ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов...
 ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
 ПараметрыРегистрации.Вставить("Наименование", " Привет мир "); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
 ПараметрыРегистрации.Вставить("Версия", "1.0");
 ПараметрыРегистрации.Вставить("БезопасныйРежим", ИСТИНА);
 ПараметрыРегистрации.Вставить("Информация", " ОБРАЗЕЦ ");//так будет выглядеть описание печ.формы для пользователя
 ТаблицаКоманд = ПолучитьТаблицуКоманд();
 ДобавитьКоманду(ТаблицаКоманд, "Привет мир", "Макет", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
 ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
 Возврат ПараметрыРегистрации;
КонецФункции

Собственно в ней и придется Вам ковырять каждый раз, когда Вы создаете новую внешнюю печатную форму. Из куска кода видно, что привязывать её мы будем к документу "Прием на работу", соответсвенны Вы пишете своё. Называться печатная форма у нас будет "Привет мир", опять таки меняем на своё. Вот тут в шаблоне удобно будет написать явную билеберду, чтобы она бросалась в глаза, чтобы не забыть её исправить потом, на мой взгля "Привет мир" подходит как нельзя кстати. Версия - это для себя, пишите что хотите, она будет отображаться в форме элемента справочника внешних обработок. Слово "ОБРАЗЕЦ" - тоже видно только в форме справочника печатных форм. Далее добавляем команду, вот тут вторым параметров передается имя кнопки, это то, что увидит пользователь в документе в пункте меню "печать".

Этого набора из трех процедур достаточно, чтобы обработка добавлялась в справочник внешних обработок, весь этот запутанный код - сервисный и к алгоритму печати не имеет отношения. По сути, авторы БСП вынудили нас так сложно программировать, если раньше вы сразу приступали к написанию функции "Печать", то теперь при написании обработки с нуля, а не по образцу, Вы потратите время на сервис. Раньше параметры регистрации были не обязательными и указывались в макете обработки, теперь все выглядит намного серьезней. Первое впечатление, когда я увидел это - круто, столько возможностей, все унифицированно... а на практике всегда создаю всего одну команду в одной обаботке, и цепляю её к одному документу. Т.е. по факту мне нужно две строки для регистрации: имя объекта, название кнопки. А тут все так ... ну да ладно, не мне судить.

Шаг четвертый - не менее интересный.

-Функция ПЕЧАТЬ?

-А вот и нет, теперь не функция, а процедура.

-А как вернуть макет?

-Послать его в функцию глобального модуля подсистемы печати.

-...? Окай

Вот текст этой процедуры:

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
 Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Макет") Тогда
  УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм,
     "Макет", "Макет",
     СформироватьТабДокумнтОбразца(МассивОбъектов, ОбъектыПечати));
 КонецЕсли;
КонецПроцедуры

Теперь разяснения. В первой строке процедуры идет немного непоняное условие. Дело в том, что при вызове процедуры печати система передает нам таблицу значений, в которой указано, что нам надо напечатать. Посути функция УправлениеПечатью.НужноПечататьМакет(...) проверяет наличие в таблице значений строки в которой в колонке "ИмяВРЕГ" строки с названием макета. На практике в большинстве случаев вещь бесполезная, т.к. наша обработка будет уметь формировать только одну печатную форму. Т.е. это условие можно опустить и на работоспособность это не повлияет.

Далее УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(...) - она то как раз и добавляет табличный макет куда нужно, чтобы потом вывести его на экран. Если Вам нужно показать свой табличный документ в своем окне (не в типовом), то не вызывайте эту процедуру, а просто напишите тут свой код.

Еще хочу добавить, что процедура Печать выполняется на клиенте и при необходимости Вы можете тут открыть произвольную форму, с целью спросить дополнительную информацию у пользователя необходимую для печати.

Далее СформироватьТабДокумнтОбразца(...) - это функция, которую нам предстоит написать в модуле обработки и которая возвращает табличный документ. В 100 из 100 случаев она будет серверная, т.к. нам надо получить значение реквизитов из объектов перечисленных в параметре "МассивОбъектов".

Шаг пятый - формируем макет.

УРА, мы наконец приступим к алгоритму формирования макета, получению данных и т.д.

Но в нашем образце мы поступим прозаично и тут даже комментировать не буду)))

Функция СформироватьТабДокумнтОбразца(МассивОбъектов, ОбъектыПечати)
 табДок = Новый ТабличныйДокумент;
 макет = ПолучитьМакет("Макет");
 
 областьШапка = Макет.ПолучитьОбласть("Шапка");
 табДок.Вывести(областьШапка);
 
 Возврат табДок;
КонецФункции

 

 

Вот собственно и все, спасибо за внимание

 

 

Авторизуйтесь пожалуйста

Comments   

+4 # Владив 2015-02-08 07:22
Благодарю за статью. Очень помогла..
0 # Екатерина 2015-08-03 08:39
Подскажите, плз, я явно чего-то не понимаю. У меня в документе аналогичная процедура печати с 4-мя параметрами. Я ее взяла в свою ВПФ и при ее запуске ругается, что недостаточное кол-во фактических параметров на строку ВнешняяОбработк а.Печать(Иденти фикаторКоманды, ОбъектыНазначен ия). Почему у всех работает без таких ошибок....
+1 # Антон Филоненко 2015-08-03 10:47
Вы сами ответили себе в своем сообщении, когда написали строку с текстом сообщения об ошибке:
ВнешняяОбработк а.Печать(Иденти фикаторКоманды, ОбъектыНазначения)

Получается передается 2 параметра, а в ВПФ описано, что должно быть 4!!!

отсюда у меня пару вопросов:
1. Какая конфигурация (имя, редакция, релиз)
2. Где происходит ошибка? (в общем модуле чего-либо, в форме чего-либо)
0 # Екатерина 2015-08-03 11:10
1. 1С 8.2 УТ 11.0.9
2. Общий модуль ДополнительныОт четИОбработки
+1 # Антон Филоненко 2015-08-03 12:43
Это старенькая версия. В ней использовалась предыдущая библиотека стандартных подсистем. Пути у Вас два:
1. Обновить базу (если типовая, то это лучший вариант)
2. Переписать процедуру печати. Тут надо понять логику той версии БСП. Под рукой нет подходящей базы, чтобы написать пример. Посмотрю, может чуть позже отвечу
0 # Екатерина 2015-08-03 12:52
Антон, спасибо огромное, хоть объяснили в чем дело. :-) Обновиться пока не дадут. Пришлите, пожалуйста, пример, буду безгранично благодарна!
+1 # Антон Филоненко 2015-08-03 13:30
Я Вам наврал :lol:
Развернул базу УТ 11.0.9.5 Демо
Все нормально работает.

В модуле менеджера документа (авансовый отчет например) 5 параметров
Процедура Печать(МассивОб ъектов, ПараметрыПечати , КоллекцияПечатн ыхФорм, ОбъектыПечати, ПараметрыВывода ) Экспорт

А в нашей обработке - 4. Не надо копировать процедуру печать, копируйте функцию, которая возвращает табличный документ. В моей процедуре печать подмените мой вызов "СформироватьТа бДокумнтОбразца (...)" на вызов того, что Вы скопировали
0 # Екатерина 2015-08-03 13:52
Вот хоть стреляйте!
Процедура Печать(МассивОб ъектов, КоллекцияПечатн ыхФорм, ОбъектыПечати, ПараметрыВывода ) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатн ыхФорм, "ПФ_MXL_ЗаявкаТ ребованиеНаСкла д") Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатн ыхФорм,
"ПФ_MXL_ЗаявкаТ ребованиеНаСкла д", "ПФ_MXL_ЗаявкаТ ребованиеНаСкла д",
СформироватьПеч атнуюФормуЗаказ НаПеремещение(М ассивОбъектов, ОбъектыПечати)) ;
КонецЕсли;
КонецПроцедуры

Недостаточно фактических параметров в модуле (Общий модуль ДополнительныОт четИОбработки, 746 строка)
+2 # Антон Филоненко 2015-08-04 05:09
К статье прикрепил пример. Попробуйте его в своей базе. А дальше идите по принципу изменения образца
+1 # Артем 2015-10-22 07:34
Спасибо большое, всё получилось!!! но у меня возникла ругая проблема, я не могу добавить параметры в документ( не подскажите как?
ОбластьДоговора .Параметры.Долж ность = СсылкаНаОбъект. Должность;

не получается...
+1 # Антон Филоненко 2015-10-27 07:57
Как минимум я не видел Вашего макета. Есть ли в Вашей области "ОбластДоговора " параметр "Должность".
Думаю не глядя в Вашу обработку помочь не смогу.
+1 # Ольга 2016-06-08 16:04
Подскажите, возможно ли подключить печатную форму к документу, не указанному в типе параметров общей команды "Дополнительные ПечатныеФормыОб ъекта" без изменения конфигурации? У меня получается только если проставить соответствующие "галочки" в типах параметров ....
0 # Антон Филоненко 2016-08-05 10:52
Нет. Помимо команды еще надо присозданиинасе рвере уформы документа дополнить вызовом пары процедур и пару процедур добавить