Рассмотрим частую задачу: при оформлении нового сотрудника в конфигурации 1С:Зарплата и управление персоналом (ЗУП) 3.1 необходимо распечатать сразу целый пакет документов. Кадровику неудобно формировать каждую печатную форму отдельно. Возникает потребность по одной кнопке вывести трудовой договор, договор о материальной ответственности и унифицированную форму приказа Т-1.
Давайте разберем по шагам, как можно реализовать данный функционал, проанализируем современные типовые возможности программы и посмотрим на пример создания внешней печатной формы (ВПФ) для объединения нескольких макетов в один комплект.
Прежде чем приступать к программированию, давайте выясним, не решена ли уже эта проблема разработчиками. В новых релизах программы (начиная с версий 3.1.29 и 3.1.30) разработчики 1С добавили штатный механизм пакетной печати. Проанализируем, как это работает:
ПриемНаРаботу или КадровыйПеревод.Если вы используете актуальную версию конфигурации, разработка сложной ВПФ может не потребоваться. Кроме того, вместо жестко закодированных в 1С макетов MXL, мы рекомендуем использовать механизм Шаблоны документов. Он позволяет кадровикам самостоятельно создавать шаблоны договоров в привычных форматах MS Word или OpenOffice. Вы просто расставляете в тексте переменные (ФИО, должность, оклад), и программа сама заполняет их данными из документа-основания.
Если специфика бизнес-процесса такова, что типовой функционал не покрывает всех требований (например, у вас более старый релиз, или формы требуют сложного алгоритма заполнения), давайте разберем создание ВПФ, которая вызовет сразу несколько печатных форм.
Посмотрим на пример кода в процедуре Печать модуля внешней обработки. Наша задача — последовательно сформировать внешние печатные формы трудовых договоров, а затем добавить в общую коллекцию типовой приказ о приеме на работу.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Формируем первую внешнюю печатную форму - Трудовой договор (основной)
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "впфТрудовойДоговорОсновной");
Если ПечатнаяФорма <> Неопределено Тогда
ВПФ = СоздатьВПФ("впфТрудовойДоговорОсновной");
ВПФ.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'впф Трудовой договор (основной)'");
КонецЕсли;
// Формируем вторую внешнюю печатную форму - Договор о мат. ответственности
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "впфТрудовойДоговорМатериальнойОтветственности");
Если ПечатнаяФорма <> Неопределено Тогда
ВПФ = СоздатьВПФ("впфТрудовойДоговорМатериальнойОтветственности");
ВПФ.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'впф Трудовой договор (материальной ответственности)'");
КонецЕсли;
// Выводим типовую печатную форму приказа Т-1
ПараметрыПечати = Новый Структура;
ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Ложь);
ПараметрыПечати.Вставить("ТребуетсяЧтениеБезОграничений", Истина);
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ПриказОПриеме");
ПечатнаяФорма.ИмяВРЕГ = "ПФ_MXL_Т1";
// Обращение напрямую к менеджеру отчета (характерно для старых релизов)
Отчеты.ПечатнаяФормаТ1.Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Приказ о приеме (Т-1)'");
КонецПроцедуры
Проанализируем архитектуру представленного решения. Код успешно работает в релизах уровня 3.1.15, однако в современных конфигурациях (на базе БСП 3.1.9 и выше) подход к работе с объектом КоллекцияПечатныхФорм немного изменился.
Для корректного добавления форм в комплект мы рекомендуем учитывать следующие нюансы:
УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм.Отчеты.ПечатнаяФормаТ1.Печать лучше использовать универсальную функцию УправлениеПечатью.СформироватьПечатныеФормы. Ей можно передать массив строк с именами макетов, и система самостоятельно соберет их в единый пакет.ПараметрыПечати.Вставить("ДополнитьКомплектВнешнимиПечатнымиФормами", Истина) укажет системе на то, что текущий набор нужно склеить с другими внешними макетами.Используя данный подход, мы сможем сэкономить время кадровой службы, обеспечив формирование всего необходимого пакета документов одним кликом мыши.