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

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

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

Вариант 1. Использование механизма комплектов печатных форм БСП

Типовой механизм БСП умеет формировать «пакет» печатных форм. Это самый правильный и архитектурно верный путь, если мы работаем в современной конфигурации. Посмотрим на шаги по его настройке.

  1. Регистрация команды: В функции СведенияОВнешнейОбработке при добавлении команды печати в поле «Идентификатор» необходимо указать имена нужных макетов через запятую. Например: "СчетНаОплату,АктВыполненныхРабот". Это даст сигнал подсистеме печати, что ожидается комплект.
  2. Заполнение коллекции: В процедуре Печать модуля объекта внешней обработки нам передается таблица значений КоллекцияПечатныхФорм. Наша задача — добавить в нее записи для каждого идентификатора.

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

Пример логики в процедуре печати:


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

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

КонецПроцедуры

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

Вариант 2. Склеивание форм в один табличный документ

Если задача заключается в том, чтобы просто вывести разные данные на одном принтере подряд, мы можем объединить макеты в один результирующий табличный документ, разделив их принудительным разрывом страницы.

Посмотрим на пример кода для склеивания:


Макет1 = ПолучитьМакет("МакетПервый");
Макет2 = ПолучитьМакет("МакетВторой");

ОбластьМакета1 = Макет1.ПолучитьОбласть("Шапка");
ОбластьМакета2 = Макет2.ПолучитьОбласть("Шапка");

ТабДок = Новый ТабличныйДокумент;

// Выводим первую форму
ТабДок.Вывести(ОбластьМакета1);

// Выводим разделитель страниц
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();

// Выводим вторую форму
ТабДок.Вывести(ОбластьМакета2);

Возврат ТабДок;

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

Вариант 3. Вывод в независимые окна на клиенте

Рассмотрим ситуацию, когда заказчик строго требует, чтобы открывались два независимых окна табличных документов. Механизм БСП для этого не подходит, так как он агрегирует всё в одну форму предпросмотра.

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


&НаКлиенте
Процедура ПечатьКомплекта(Команда)
    
    ТабДок1 = СформироватьФормуНаСервере("Макет1");
    ТабДок2 = СформироватьФормуНаСервере("Макет2");
    
    ТабДок1.Показать("Печатная форма: Документ 1");
    ТабДок2.Показать("Печатная форма: Документ 2");
    
КонецПроцедуры

Важно: Проанализируем ограничения этого метода. При работе в веб-клиенте или тонком клиенте множественный вызов метода Показать() может блокироваться встроенными защитами браузера (как всплывающие окна) или вызывать неудобство для пользователя. Именно поэтому разработчики платформы и БСП рекомендуют использовать первый вариант с коллекцией печатных форм.

Резюме и рекомендации

Если данные второй печатной формы зависят от первой (например, результаты сложных расчетов), рекомендуется использовать структуру ДополнительныеПараметры. Это позволит рассчитать данные один раз и применить их к обоим макетам без повторных запросов к базе данных.

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

← На главную