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