Как вывести две копии табличного документа на один лист при печати в 1С

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

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

Проанализируем типовую ситуацию: разработчик формирует табличный документ, выводит первую копию, затем использует метод ВывестиГоризонтальныйРазделительСтраниц(), заполняет вторую копию и задает параметр ТабДок.ЭкземпляровНаСтранице = 2. При открытии документа в режиме предварительного просмотра каждая копия оказывается на отдельном листе. Выясним причину такого поведения платформы.

Особенности предварительного просмотра и свойства ЭкземпляровНаСтранице

Встроенный предпросмотр в платформе 1С отображает логические страницы документа. Когда вызывается метод ТабДок.ВывестиГоризонтальныйРазделительСтраниц(), табличный документ принудительно делится на две логические страницы. Свойство ЭкземпляровНаСтранице = 2 не склеивает страницы на экране, а передается в виде инструкции драйверу принтера при отправке документа на физическую печать. Поэтому в окне предварительного просмотра страницы видны раздельно, но на физический лист А4 они будут отправлены вместе (по 2 логические страницы на 1 физический лист).

Также важно учитывать ориентацию листа:

  1. Если задана ориентация ОриентацияСтраницы.Портрет, лист формата А4 делится по горизонтали (один документ располагается сверху, второй — снизу).
  2. Если необходимо расположить два вертикальных документа формата А5 рядом друг с другом, ориентацию табличного документа следует установить в ОриентацияСтраницы.Ландшафт.

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

Способ 1. Использование логических страниц и параметров печати

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


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

// 1. Формируем и выводим первую копию
СформироватьДокумент(ТабДок, ДанныеПервойКопии);

// 2. Вставляем разделитель страниц
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();

// 3. Формируем и выводим вторую копию
СформироватьДокумент(ТабДок, ДанныеВторойКопии);

// 4. Задаем параметры размещения на листе
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; // или Портрет в зависимости от компоновки
ТабДок.РазмерСтраницы = "A4";
ТабДок.ЭкземпляровНаСтранице = 2;
ТабДок.АвтоМасштаб = Истина;

// Настройка полей во избежание сжатия
ТабДок.ПолеСлева = 5;
ТабДок.ПолеСправа = 5;
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;

ТабДок.Показать("Печать 2 копии на лист");

Обратите внимание: отправка такого документа на реальный принтер или экспорт через драйвер виртуального принтера скомпонует обе логические страницы на одном листе А4.

Способ 2. Вывод единого макета с разделительной секцией

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


Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьРазделитель = Макет.ПолучитьОбласть("ЛинияОтреза");

// Выводим первый экземпляр
ТабДок.Вывести(ОбластьШапка);
Для Каждого Стр Из Данные.Товары Цикл
    ОбластьСтрока.Параметры.Заполнить(Стр);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

// Выводим линию отреза
ТабДок.Вывести(ОбластьРазделитель);

// Выводим второй экземпляр
ТабДок.Вывести(ОбластьШапка);
Для Каждого Стр Из Данные.Товары Цикл
    ОбластьСтрока.Параметры.Заполнить(Стр);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

ТабДок.АвтоМасштаб = Истина;
ТабДок.Показать();

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

Способ 3. Параллельный вывод макетов через метод Присоединить

Если две копии должны располагаться строго слева и справа на одном альбомном листе, можно использовать комбинацию методов Вывести() и Присоединить().

Посмотрим на пример реализации:


Макет = ПолучитьМакет("Макет");

ОбластьЛевоШапка = Макет.ПолучитьОбласть("Шапка|ЛеваяКолонка");
ОбластьПравоШапка = Макет.ПолучитьОбласть("Шапка|ПраваяКолонка");

ОбластьЛевоСтрока = Макет.ПолучитьОбласть("Строка|ЛеваяКолонка");
ОбластьПравоСтрока = Макет.ПолучитьОбласть("Строка|ПраваяКолонка");

// Выводим шапки обеих колонок
ТабДок.Вывести(ОбластьЛевоШапка);
ТабДок.Присоединить(ОбластьПравоШапка);

// Выводим строки параллельно
Для Каждого Стр Из ТаблицаДанных Цикл
    ОбластьЛевоСтрока.Параметры.Заполнить(Стр);
    ТабДок.Вывести(ОбластьЛевоСтрока);
    
    ОбластьПравоСтрока.Параметры.Заполнить(Стр);
    ТабДок.Присоединить(ОбластьПравоСтрока);
КонецЦикла;

ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.АвтоМасштаб = Истина;
ТабДок.Показать();

Выбор конкретного метода зависит от задачи: для простой отправки на печать достаточно использовать свойство ЭкземпляровНаСтранице, а для визуального контроля и гарантированного расположения элементов на одном листе лучше формировать единую область макета.

← На главную