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