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

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

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

Почему нельзя использовать один ТабличныйДокумент

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

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

Решение 1: Использование ПакетаОтображаемыхДокументов

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


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

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

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

// Записываем результат в PDF
Пакет.Записать("C:\Temp\Result.pdf", ТипФайлаПакетаОтображаемыхДокументов.PDF);

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

Решение 2: Использование комплекта документов в БСП

Если ваша конфигурация построена на БСП (что характерно для большинства современных решений, таких как ERP, КА, УТ 11 или БП 3.0), наиболее правильным способом будет использование механизма комплектов документов. Мы можем вернуть из процедуры печати не один, а два раздельных документа. Рассмотрим, как это реализовать в менеджере печати:

  1. Создадим две отдельные печатные формы (или два макета).
  2. В процедуре печати добавим оба документа в КоллекцияПечатныхФорм.

Проанализируем пример формирования коллекции в модуле менеджера или в обработке внешней печатной формы:


Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

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

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

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

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

Решение 3: Программное объединение через внешние инструменты (для продвинутых)

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

Рассмотрим алгоритм работы через COM-объединение PDF:

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

Выбирая метод решения, ориентируйтесь на следующие критерии:

  1. Если нужна интерактивная печать: Используйте Решение 2 (БСП и раздельные формы в коллекции). Это позволит пользователю управлять процессом и использовать стандартные кнопки печати.
  2. Если нужно программное формирование файла: Используйте Решение 1 (ПакетОтображаемыхДокументов). Это современный способ работы платформы 8.3, который корректно инкапсулирует разные документы в один пакет.
  3. Настройка макета: Не забывайте устанавливать свойство АвтоМасштаб = Истина. Для ландшафтных страниц это критично, так как они часто содержат широкие таблицы, которые без масштабирования могут не поместиться на лист даже в альбомной ориентации.

Посмотрим еще раз на важную деталь при работе с пакетами: запись пакета должна происходить непосредственно в том контексте, где он был сформирован, чтобы избежать потери временных хранилищ, в которые помещены табличные документы. Если вы передаете пакет между сервером и клиентом, убедитесь, что данные во временном хранилище еще живы.

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

← На главную