Как во внешней печатной форме ЗУП подменить макет, если печать реализована через СКД

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В конфигурации 1С:Зарплата и управление персоналом 3.1 многие печатные формы (например, Т-1, Т-5, Т-6) реализованы не через классические макеты в модуле менеджера документа, а через специализированные отчеты на базе Системы компоновки данных (СКД). Это создает определенные трудности, когда необходимо создать внешнюю печатную форму (ВПФ) и подменить в ней только визуальную часть (макет), сохранив всю сложную логику сбора данных типового отчета.

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

Анализ механизмов печати в ЗУП

Для начала проанализируем ситуацию. Когда мы нажимаем кнопку «Печать» в документе «Отпуск», система обращается к объекту Отчет.ПечатнаяФормаТ6. Этот отчет использует схему компоновки данных для формирования дерева данных, которое затем передается в общий модуль для вывода в табличный документ. Наша задача в рамках ВПФ — программно выполнить этот отчет, получить данные и «подсунуть» системе наш собственный макет из внешней обработки.

Основная ошибка многих разработчиков заключается в попытке использовать метод УправлениеПечатьюКлиент.ВыполнитьКомандуПечати. Этот метод жестко ищет макет в метаданных указанного объекта, и подставить туда макет из внешней обработки напрямую не получится.

Шаг 1. Подготовка модуля менеджера ВПФ

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

Проанализируем структуру процедуры:


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

Шаг 2. Программное получение данных из СКД

Теперь выясним, как получить данные. Мы создадим экземпляр типового отчета и вызовем его внутренние методы. В ЗУП за это часто отвечает экспортная функция внутри объекта отчета или специализированные функции в общих модулях, таких как КадровыйУчет.

Рассмотрим подробнее программное формирование на примере Т-6:

  1. Создаем объект отчета Отчеты.ПечатнаяФормаТ6.Создать().
  2. Устанавливаем необходимые параметры компоновки (ссылки на документы из МассивОбъектов).
  3. Вызываем компоновку данных.

Однако в ЗУП есть более элегантный путь через использование функций общего модуля, которые возвращают уже подготовленные структуры данных.

Шаг 3. Использование общего модуля КадровыйУчет

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


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

Почему это работает?

Мы проанализировали внутреннее устройство типового отчета ПечатнаяФормаТ6. Он отделяет логику получения данных (через СКД) от логики вывода в ТабличныйДокумент. Метод РезультатКомпоновки собирает данные в дерево значений или структуру, а процедура КадровыйУчет.ВывестиНаПечатьТ6 занимается обходом этого дерева и заполнением областей макета.

Передавая в эту процедуру МакетВПФ, прочитанный из нашей обработки, мы заставляем систему искать области (такие как Заголовок, Подвал, Строка) в нашем файле, а не в типовом. Важно: имена областей и параметров в вашем макете должны совпадать с типовыми, иначе возникнет ошибка при заполнении.

Нюансы реализации

При использовании данного подхода следует учитывать несколько важных моментов:

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

← На главную