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