Как вывести на печать два разных экземпляра документа на одну страницу в 1С?

Программист IT и автоматизация бизнеса
← На главную

Рассмотрим частую задачу при разработке в 1С: необходимо вывести печатную форму документа в двух экземплярах на одном физическом листе А4, но при этом на одном из экземпляров нужно вывести отличительный текст (например, указать, чей это экземпляр: «Экземпляр клиента» и «Экземпляр исполнителя»).

Разберем по шагам, почему типовые свойства табличного документа не подходят для этой задачи и проанализируем работающие способы решения.

Почему не работает свойство ЭкземпляровНаСтранице?

Многие разработчики изначально пытаются решить проблему, устанавливая свойства ТабДокумент.ЭкземпляровНаСтранице = 2 и ТабДокумент.КоличествоЭкземпляров = 2, а также настраивая вывод колонтитулов для конкретных страниц. Однако выясним причину, по которой этот подход терпит неудачу при попытке задать разный текст.

Дело в архитектурных ограничениях платформы 1С. Свойства количества экземпляров не управляют логикой программного формирования табличного документа. Они работают на уровне драйвера принтера и настроек печати. Платформа сначала полностью формирует и отрисовывает одну страницу, а затем дает команду размножить готовый «снимок». Изменить текст или колонтитул только на одной из копий через эти свойства физически невозможно — экземпляры всегда будут абсолютно идентичными.

Посмотрим на альтернативные и проверенные решения этой задачи.

Решение 1: Программное объединение двух табличных документов

Один из самых надежных способов — сформировать два разных табличных документа (или две области), заполнить их нужными разными параметрами и затем объединить в один итоговый документ.

Рассмотрим пример кода, который формирует два экземпляра и выводит их рядом друг с другом (горизонтальное размещение):


// Создаем основной результирующий документ
ТабДок = Новый ТабличныйДокумент;

// Получаем макет и область для вывода
Макет = ПолучитьМакет("НашМакет");
ОбластьЧей = Макет.ПолучитьОбласть("Шапка");

// Заполняем и выводим первый экземпляр (вертикально)
ОбластьЧей.Параметры.Инфо = "Экземпляр клиента";
ТабДок.Вывести(ОбластьЧей);

// Заполняем второй экземпляр и присоединяем его справа (горизонтально)
ОбластьЧей.Параметры.Инфо = "Экземпляр исполнителя";
ТабДок.Присоединить(ОбластьЧей);

Важное ограничение метода Присоединить(): При горизонтальном размещении документов в альбомной ориентации табличный документ 1С не поддерживает разную высоту ячеек, находящихся в одной строке. Если у вас динамическое количество строк в табличной части (например, длинное наименование услуги перенесется на вторую строку в левой копии), то смежная ячейка в правой копии тоже неизбежно растянется по высоте. Макет может «разъехаться», если ширина колонок не будет идеально подогнана.

Если документы не широкие или имеют фиксированное количество строк без переносов, этот способ сработает отлично.

Решение 2: Вертикальный вывод с автомасштабированием

Если горизонтальное объединение не подходит из-за динамического количества строк, выведем области последовательно одну под другой в вертикальной ориентации. Чтобы оба экземпляра гарантированно поместились на один физический лист, используем встроенные инструменты масштабирования табличного документа.

Оберните процесс вывода строк в проверку с помощью метода ПроверитьВывод(). По завершении формирования документа установите свойство АвтоМасштаб:


ТабДок.АвтоМасштаб = Истина;
// Или жестко задаем масштаб в процентах
ТабДок.МасштабПечати = 75;

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

Решение 3: Разделение на страницы и настройки драйвера принтера

Самый надежный способ уместить два независимых экземпляра с непредсказуемым количеством строк на один лист — делегировать компоновку принтеру, разделив вывод в коде.

Проанализируем алгоритм действий:

  1. Сформируйте первый экземпляр документа с нужным параметром («Экземпляр №1»).
  2. Вызовите метод ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц(). Это даст команду платформе начать новую страницу.
  3. Поменяйте параметр на «Экземпляр №2» и полностью выведите второй экземпляр.
  4. При отправке на печать (в штатном диалоге 1С или настройках принтера) пользователю необходимо выбрать опцию «2 страницы на листе» (2 pages per sheet).

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

Решение 4: Использование типового механизма «Печать комплектов»

Если вы работаете в современной типовой конфигурации (например, 1С:ERP, 1С:УТ, 1С:КА), воспользуйтесь встроенным механизмом менеджера печати.

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

← На главную