Как вывести два макета в одной внешней печатной форме 1С

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

При разработке внешних печатных форм программисты часто сталкиваются с задачей: необходимо, чтобы при нажатии одной кнопки «Печать» пользователю выдавалось сразу несколько документов (например, Счет-фактура и ТОРГ-12). Типичная проблема заключается в том, что при попытке вывести второй макет он либо замещает первый, либо открывается в отдельном окне, что неудобно для пользователя. Разберем пошагово, как правильно объединить макеты, используя механизмы Библиотеки стандартных подсистем (БСП) и платформенные возможности ТабличногоДокумента.

Причина возникновения проблемы: почему макеты замещают друг друга

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

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

Решение 1: Объединение в один табличный документ

Этот метод подходит, если вам нужно, чтобы оба документа выводились «единым полотном» или печатались один за другим в одном задании печати. Основная идея заключается в том, чтобы создать один объект ТабличныйДокумент, последовательно заполнить его данными из разных функций и вставить между ними разделитель страниц.

Рассмотрим пример реализации в процедуре Печать модуля обработки:


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

Обратите внимание на метод ВывестиГоризонтальныйРазделительСтраниц(). Это метод объекта ТабличныйДокумент, который принудительно разрывает страницу. Без него второй документ начнется сразу под первым, что может привести к «наползанию» таблиц друг на друга.

Решение 2: Вывод макетов на разные вкладки в одном окне печати

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

Проанализируем пример кода для реализации вкладок:


// В процедуре ДобавитьКомандыПечати должны быть зарегистрированы оба идентификатора
// ...

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

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

Важный нюанс: чтобы этот код сработал, в функции СведенияОВнешнейОбработке (в случае внешней печатной формы) или в процедуре ДобавитьКомандыПечати модуля менеджера объекта, имена макетов должны быть перечислены через запятую или добавлены как отдельные команды.

Сложные случаи: разные настройки масштаба и ориентации

Как справедливо замечено в сообщении №24, если мы объединяем документы методом Вывести() в один ТабличныйДокумент, мы ограничены общими настройками печати (масштаб, ориентация страницы, поля) для всего документа целиком. Если один макет должен иметь масштаб 100, а другой — 101, или один должен быть «Портрет», а другой «Ландшафт», обычная склейка не поможет.

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

Разберем пример создания пакета для прямой печати (без вывода на экран):


Пакет = Новый ПакетОтображаемыхДокументов;

// Добавляем первый документ
Элемент1 = Пакет.Состав.Добавить();
Таб1 = СформироватьПечатнуюФорму1();
Таб1.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
Элемент1.Данные = ПоместитьВоВременноеХранилище(Таб1);

// Добавляем второй документ
Элемент2 = Пакет.Состав.Добавить();
Таб2 = СформироватьПечатнуюФорму2();
Таб2.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
Элемент2.Данные = ПоместитьВоВременноеХранилище(Таб2);

// Печать всего пакета как одного задания
Пакет.Напечатать();

Рекомендации по верстке объединенных макетов

При объединении разных макетов в один ТабличныйДокумент часто возникает проблема «расползания» колонок. Если у первого макета 5 широких колонок, а у второго — 15 узких, то при использовании метода Вывести() колонки второго макета будут подстраиваться под ширину колонок первого.

Чтобы этого избежать, придерживайтесь следующих правил:

  1. Используйте метод ТабличныйДокумент.Вывести() только для тех макетов, которые имеют схожую структуру колонок.
  2. Если структуры разные, используйте в макетах функционал «Создать формат строк». В конфигураторе это делается через контекстное меню строки (Свойства -> Ширина колонок -> Создать формат строк). Это позволит разным строкам одного табличного документа иметь независимую сетку колонок.
  3. Проверяйте наличие данных перед выводом разделителя страниц. Если вывести разделитель в конце документа, на принтере может выйти лишний пустой лист.

Подводя итог, можно сказать: для простого объединения макетов достаточно использовать один общий ТабличныйДокумент и метод ВывестиГоризонтальныйРазделительСтраниц(). Для разделения по вкладкам используйте разные идентификаторы в КоллекцияПечатныхФорм, а для сложного управления настройками печати — ПакетОтображаемыхДокументов.

← На главную