Как реализовать печать комплекта документов в одной внешней печатной форме 1С?

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

При разработке внешних печатных форм (ВПФ) программисты часто сталкиваются с задачей вывода не одного документа, а целого пакета (комплекта). Например, при оформлении отпуска сотрудника может потребоваться одновременно распечатать приказ по форме Т-6, справку-расчет и заявление. Особую сложность добавляет ситуация, когда часть документов должна быть в книжной ориентации (портрет), а часть — в альбомной (ландшафт).

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

Анализ проблемы: почему не стоит подключать ВПФ внутри другой ВПФ

Рассмотрим ситуацию, с которой столкнулся автор темы. Изначально была предпринята попытка создать три отдельные обработки: две для конкретных форм и третью как «контейнер». В коде контейнера использовался метод ВнешниеОбработки.Подключить().

Проанализируем, почему этот путь тупиковый:

  1. Безопасность: Если ваша база работает в модели сервиса (например, 1С:Фреш) или используются профили безопасности, сервер заблокирует попытку программного подключения внешней обработки из кода другой обработки.
  2. Производительность: Каждый вызов Создать() для внешней обработки заставляет систему заново считывать двоичные данные из справочника, помещать их во временное хранилище и компилировать модуль. При печати комплекта для 50 сотрудников это приведет к значительным задержкам.
  3. Сложность поддержки: Вам приходится следить за актуальностью трех разных файлов вместо одного.

Правильное решение — объединить все макеты и логику формирования в одной внешней обработке. БСП позволяет регистрировать несколько команд печати или одну команду, которая формирует несколько табличных документов одновременно.

Шаг 1. Правильная регистрация комплекта в СведенияОВнешнейОбработке

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

Рассмотрим пример кода регистрации:


Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
	
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма;
	ПараметрыРегистрации.Наименование = "Комплект документов по отпуску (Т-6а + Приложение)";
	ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
	ПараметрыРегистрации.Вставить("Версия", "1.1");
	
	МассивНазначений = Новый Массив;
	МассивНазначений.Добавить("Документ.ОтпускаСотрудников");
	ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
	
	// Добавляем команду для печати комплекта
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление = "Комплект документов (Т-6а и справка)";
	// Важный момент: можно указать список имен через запятую
	НоваяКоманда.Идентификатор = "ФормаТ6а,СправкаРасчет"; 
	НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода;
	НоваяКоманда.Модификатор = "ПечатьMXL";
	
	Возврат ПараметрыРегистрации;
	
КонецФункции

Шаг 2. Реализация процедуры Печать и работа с коллекцией

Теперь разберем, как сформировать табличные документы так, чтобы они попали в общую очередь печати 1С. Основная ошибка новичков заключается в попытке вручную манипулировать коллекцией через УправлениеПечатью.СведенияОПечатнойФорме, что часто приводит к ошибке несоответствия параметров в разных версиях БСП.

Вместо этого мы будем использовать стандартный механизм: заполним ТабличныйДокумент для каждой части комплекта и выведем их в КоллекцияПечатныхФорм с помощью вспомогательных методов.


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

Шаг 3. Управление ориентацией страниц и групповая печать

Рассмотрим подробнее ситуацию, когда один ТабличныйДокумент должен содержать разные ориентации. Важно помнить: в 1С один объект ТабличныйДокумент имеет единую настройку ориентации для всех своих страниц. Если вы попытаетесь объединить «портрет» и «ландшафт» в один ТабличныйДокумент через метод Вывести(), вся итоговая форма примет ориентацию последнего выведенного листа или настройки по умолчанию.

Решение задачи разделения ориентаций:

Также проанализируем важный аспект — групповую печать. Если пользователь выделил в списке 10 документов и нажал «Печать», ваш код в функциях Сформировать... должен обходить МассивОбъектов в цикле. При этом для корректной работы навигации по страницам обязательно используйте метод ЗадатьОбластьПечатиДокумента.


Функция СформироватьПриказТ6а(МассивОбъектов, ОбъектыПечати)
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Т6а";
	
	ПервыйДокумент = Истина;
	
	Для Каждого СсылкаИзМассива Из МассивОбъектов Цикл
		
		Если Не ПервыйДокумент Тогда
			ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		
		НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
		
		// ... логика заполнения данных из макета ...
		// Макет = ПолучитьМакет("МакетТ6а");
		// Область = Макет.ПолучитьОбласть("Заголовок");
		// ТабличныйДокумент.Вывести(Область);
		
		// Фиксируем область для корректного отображения в окне печати
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, 
			НомерСтрокиНачало, ОбъектыПечати, СсылкаИзМассива);
		
		ПервыйДокумент = Ложь;
		
	КонецЦикла;
	
	Возврат ТабличныйДокумент;
	
КонецФункции

Как избежать ошибки «Слишком много фактических параметров»?

Разберем причину ошибки, возникшей у автора вопроса в строке: УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ВПФ").

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

Рекомендации по исправлению:

  1. Используйте отладчик: зайдите внутрь функции УправлениеПечатью.СведенияОПечатнойФорме и посмотрите ее определение (сигнатуру).
  2. В современных версиях БСП для поиска уже добавленной формы в коллекции лучше использовать метод КоллекцияПечатныхФорм.Найти(Идентификатор, "Имя").
  3. Но самый правильный способ — вообще не использовать поиск в коллекции, а следовать паттерну из Шага 2, используя УправлениеПечатью.НужноПечататьМакет. Это гарантирует совместимость с будущими обновлениями 1С.

Итоги

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

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

← На главную