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