При формировании комплекта печатных форм часто возникает ситуация, когда часть документов (например, Счет на оплату и Товарная накладная) должна иметь книжную ориентацию (портрет), а другие (например, Счет-фактура или УПД) — альбомную (ландшафт). В процессе разработки многие сталкиваются с проблемой: если объединить все эти документы в один объект ТабличныйДокумент, то настройки страницы применяются ко всему документу сразу. Разберем подробно, почему это происходит и как правильно реализовать печать комплекта документов с разной ориентацией.
Проанализируем структуру объекта ТабличныйДокумент в платформе «1С:Предприятие 8». Этот объект спроектирован как единое полотно. Свойства печати, такие как ОриентацияСтраницы, Поля, МасштабПечати и ИмяПринтера, являются общими для всего экземпляра объекта.
Рассмотрим ситуацию: вы программно выводите сначала «Счет», устанавливая ОриентацияСтраницы.Портрет, а затем в этот же документ выводите «Счет-фактуру» и меняете свойство на ОриентацияСтраницы.Ландшафт. В результате весь документ станет альбомным. Платформа 1С не поддерживает «разрывы разделов» с индивидуальными настройками страницы внутри одного табличного документа. Таким образом, в рамках одного объекта ТабличныйДокумент реализовать разные ориентации невозможно.
Для решения задачи, когда нужно вывести пользователю единое окно с документами разного формата, в платформе предусмотрен специальный объект — ПакетОтображаемыхДокументов. Посмотрим, как он работает. Этот объект представляет собой коллекцию отдельных табличных документов, которые группируются в одном интерфейсном окне.
Разберем алгоритм реализации по шагам:
ТабличныйДокумент для каждой печатной формы.ПакетОтображаемыхДокументов.Рассмотрим пример кода, реализующий этот механизм:
// 1. Создаем первый документ (Книжный)
ТабДок1 = Новый ТабличныйДокумент;
ТабДок1.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;
// ... тут код заполнения ТабДок1 ...
// 2. Создаем второй документ (Альбомный)
ТабДок2 = Новый ТабличныйДокумент;
ТабДок2.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
// ... тут код заполнения ТабДок2 ...
// 3. Формируем пакет
Пакет = Новый ПакетОтображаемыхДокументов;
ЭлементПакета1 = Новый ЭлементПакетаОтображаемыхДокументов;
ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабДок1);
ЭлементПакета1.Наименование = "Счет на оплату";
Пакет.Состав.Добавить(ЭлементПакета1);
ЭлементПакета2 = Новый ЭлементПакетаОтображаемыхДокументов;
ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабДок2);
ЭлементПакета2.Наименование = "Счет-фактура";
Пакет.Состав.Добавить(ЭлементПакета2);
// 4. Показываем результат пользователю
Пакет.Показать("Печать комплекта документов");
При использовании метода Показать() пользователь увидит стандартную форму предварительного просмотра, где слева будет список документов, а справа — область просмотра. При отправке такого пакета на печать принтер получит корректные команды смены ориентации для каждого листа.
Если вы работаете в современной конфигурации (например, 1С:Бухгалтерия 3.0, УТ 11 или ERP), то задача печати комплектов уже автоматизирована в подсистеме «Печать». Выясним, как это устроено в БСП. Вместо ручного создания пакетов, вы можете использовать коллекцию печатных форм.
В модуле менеджера объекта в процедуре Печать формируется структура КоллекцияПечатныхФорм. Для каждой формы можно указать свой экземпляр ТабличныйДокумент. Подсистема печати самостоятельно проанализирует настройки каждого документа и выведет их в единую форму управления печатью, где пользователь сможет отметить галочками нужные пункты и отправить весь набор на принтер одним нажатием.
Важно проанализировать ситуацию с сохранением документов. Если вам необходимо сохранить результат в один файл PDF, то стандартный метод ТабличныйДокумент.Записать() вам не подойдет, так как он работает только с одним объектом.
При использовании ПакетОтображаемыхДокументов штатной возможности программно «склеить» документы в один PDF с сохранением разных ориентаций страниц без участия пользователя не существует. В таких случаях программисты обычно прибегают к использованию внешних компонент или виртуальных принтеров, которые умеют объединять несколько заданий печати в один файл.
Существует еще один, довольно редкий способ — визуальная имитация альбомного листа внутри книжного документа. Для этого используется свойство ячейки ОриентацияТекста, равное 90 градусов.
Однако этот метод крайне трудозатратен, так как вам придется:
Мы рекомендуем использовать этот метод только в исключительных случаях, когда по каким-то причинам невозможно использовать ПакетОтображаемыхДокументов.
Подведем итог: для реализации печати документов с разной ориентацией страниц в 1С 8.3 следует отказаться от идеи использования одного объекта ТабличныйДокумент в пользу ПакетОтображаемыхДокументов или стандартных механизмов печати БСП. Это обеспечит корректную работу принтера и удобство для пользователя.