Разработка внешних печатных форм (ВПФ) для конфигурации «1С:Зарплата и управление персоналом 3.1» (ЗУП) часто вызывает вопросы у программистов, особенно когда дело касается унифицированных форм, таких как Приказ о переводе (Т-5). В отличие от простых документов в других конфигурациях, в ЗУП 3.1 печать кадровых приказов тесно интегрирована с библиотекой стандартных подсистем (БСП) и механизмами общих форм печати. В этой статье мы подробно разберем, как преодолеть технические сложности и создать полноценную ВПФ с возможностью редактирования макета.
Прежде чем приступать к кодингу, проанализируем ситуацию. В типовой конфигурации ЗУП 3.1 форма Т-5 формируется не напрямую из модуля менеджера документа КадровыйПеревод. Система использует универсальный механизм: данные собираются программно, а затем выводятся через общую форму ПечатьОбщихФорм. Макет при этом часто является общим (находится в ветке конфигурации «Общие макеты») или скрыт внутри специализированных обработок печати.
Для создания ВПФ нам необходимо выполнить три глобальные задачи:
Создадим новую внешнюю обработку. В модуле объекта нам необходимо разместить экспортную функцию СведенияОВнешнейОбработке. Без неё система не сможет распознать файл как печатную форму.
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Назначение.Добавить("Документ.КадровыйПеревод");
ПараметрыРегистрации.Наименование = "Приказ о переводе (Т-5) внешняя";
ПараметрыРегистрации.Идентификатор = "ПФ_MXL_Т5_Внешняя";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Версия = "1.0";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Приказ о переводе (Т-5) (измененный)";
НоваяКоманда.Идентификатор = "Т5_Внешняя";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.Модификатор = "ПечатьMXL";
Возврат ПараметрыРегистрации;
КонецФункции
Обратим внимание на Модификатор. Значение ПечатьMXL сообщает системе, что результатом работы будет табличный документ, который нужно вывести в стандартное окно предпросмотра.
Основная точка входа для БСП — процедура Печать. Именно здесь мы будем управлять процессом формирования документа. Разберем её структуру:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "Т5_Внешняя");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати);
ПечатнаяФорма.СинонимМакета = "Приказ о переводе (Т-5)";
ПечатнаяФорма.ПолныйПутьКМакету = ""; // Оставляем пустым для ВПФ
КонецЕсли;
КонецПроцедуры
Выясним причину, почему нельзя просто вызвать типовой метод. Если мы вызовем типовую функцию из модуля менеджера документа КадровыйПеревод, она обратится к общему макету конфигурации. Наша цель — использовать макет, который лежит внутри внешней обработки. Поэтому нам придется скопировать код формирования данных в модуль обработки.
Найдем в конфигурации (модуль менеджера документа КадровыйПеревод или модуль обработки ПечатьПриказов) функцию, отвечающую за Т-5. Обычно она называется СформироватьПечатныеФормыПриказовОПереводе. Проанализируем её содержимое и скопируем в нашу обработку под именем СформироватьПечатнуюФорму.
Важный нюанс: В ЗУП 3.1 данные для печати собираются через сложные запросы к виртуальным таблицам и срезам последних. Убедимся, что все вспомогательные функции (например, склонение ФИО через СклонениеФИО.Просклонять) доступны. Если какие-то методы не являются экспортными в типовой конфигурации, их логику также придется перенести в ВПФ.
Теперь разберем, как заставить код брать макет из файла обработки. В типовом коде вы встретите строку вида:
Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_Т5");
Нам необходимо изменить её на получение макета из текущего объекта. Рассмотрим пример кода:
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_КадровыйПеревод_Т5";
// Получаем макет из состава внешней обработки
Макет = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_Т5");
// Здесь идет логика заполнения областей макета
// Например:
// ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
// ДанныеПечати = ПолучитьДанныеДляПечати(МассивОбъектов);
// ... заполнение параметров ...
// ТабличныйДокумент.Вывести(ОбластьЗаголовок);
Возврат ТабличныйДокумент;
КонецФункции
Не забудьте скопировать сам макет ПФ_MXL_Т5 из конфигурации в состав вашей внешней обработки и внести в него необходимые правки (например, изменить логотип, добавить дополнительные подписи или изменить формулировки).
Поскольку ЗУП 3.1 использует механизм «Печать общих форм», ваша ВПФ автоматически получит все преимущества типового интерфейса:
Для этого важно, чтобы процедура Печать корректно заполняла КоллекцияПечатныхФорм. Если вы хотите, чтобы форма сразу открывалась на экране, убедитесь, что в регистрации команды указан правильный тип вызова.
Проанализируем ситуации, в которых ВПФ может работать некорректно:
Подвал или Строка), программный код, который обращается к ней через Макет.ПолучитьОбласть(), вызовет исключение. Будьте осторожны при визуальном редактировании.Таким образом, создание ВПФ для Приказа Т-5 в ЗУП 3.1 — это процесс не столько создания нового с нуля, сколько грамотного «отпочкования» типового функционала в изолированную внешнюю обработку с перенаправлением ссылок на локальные ресурсы (макеты).