При формировании печатных форм нередко возникает задача разместить на одном листе бумаги формата А4 сразу две копии одного документа (например, экземпляр поставщика и экземпляр покупателя) либо две разные части единой формы с разделителем. Разберем по шагам, почему стандартный предпросмотр 1С может вводить в заблуждение и какими способами можно реализовать вывод двух экземпляров на одну страницу.
Проанализируем типовую ситуацию: разработчик формирует табличный документ, выводит первую копию, затем использует метод ВывестиГоризонтальныйРазделительСтраниц(), заполняет вторую копию и задает параметр ТабДок.ЭкземпляровНаСтранице = 2. При открытии документа в режиме предварительного просмотра каждая копия оказывается на отдельном листе. Выясним причину такого поведения платформы.
Встроенный предпросмотр в платформе 1С отображает логические страницы документа. Когда вызывается метод ТабДок.ВывестиГоризонтальныйРазделительСтраниц(), табличный документ принудительно делится на две логические страницы. Свойство ЭкземпляровНаСтранице = 2 не склеивает страницы на экране, а передается в виде инструкции драйверу принтера при отправке документа на физическую печать. Поэтому в окне предварительного просмотра страницы видны раздельно, но на физический лист А4 они будут отправлены вместе (по 2 логические страницы на 1 физический лист).
Также важно учитывать ориентацию листа:
ОриентацияСтраницы.Портрет, лист формата А4 делится по горизонтали (один документ располагается сверху, второй — снизу).ОриентацияСтраницы.Ландшафт.Рассмотрим подробнее три основных способа решения задачи в зависимости от требований к макету.
Этот способ оптимален, если макеты должны формироваться как полноценные самостоятельные документы с собственными колонтитулами или структурой. Мы последовательно выводим части документа, разделяя их разделителем, и настраиваем параметры печати табличного документа.
// Создаем итоговый табличный документ
ТабДок = Новый ТабличныйДокумент;
// 1. Формируем и выводим первую копию
СформироватьДокумент(ТабДок, ДанныеПервойКопии);
// 2. Вставляем разделитель страниц
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
// 3. Формируем и выводим вторую копию
СформироватьДокумент(ТабДок, ДанныеВторойКопии);
// 4. Задаем параметры размещения на листе
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; // или Портрет в зависимости от компоновки
ТабДок.РазмерСтраницы = "A4";
ТабДок.ЭкземпляровНаСтранице = 2;
ТабДок.АвтоМасштаб = Истина;
// Настройка полей во избежание сжатия
ТабДок.ПолеСлева = 5;
ТабДок.ПолеСправа = 5;
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;
ТабДок.Показать("Печать 2 копии на лист");
Обратите внимание: отправка такого документа на реальный принтер или экспорт через драйвер виртуального принтера скомпонует обе логические страницы на одном листе А4.
Если требуется строго контролировать внешний вид документа на экране без зависимости от драйвера принтера, обе копии формируются в рамках одной страницы. Между ними выводится специальная область макета — линия отреза.
Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьРазделитель = Макет.ПолучитьОбласть("ЛинияОтреза");
// Выводим первый экземпляр
ТабДок.Вывести(ОбластьШапка);
Для Каждого Стр Из Данные.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(Стр);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
// Выводим линию отреза
ТабДок.Вывести(ОбластьРазделитель);
// Выводим второй экземпляр
ТабДок.Вывести(ОбластьШапка);
Для Каждого Стр Из Данные.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(Стр);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
ТабДок.АвтоМасштаб = Истина;
ТабДок.Показать();
При таком подходе и в окне 1С, и на печати документ будет выглядеть одинаково. Однако, если количество строк в табличной части велико, необходимо следить за высотой строк, чтобы документ не перескочил на второй лист.
Если две копии должны располагаться строго слева и справа на одном альбомном листе, можно использовать комбинацию методов Вывести() и Присоединить().
Посмотрим на пример реализации:
Макет = ПолучитьМакет("Макет");
ОбластьЛевоШапка = Макет.ПолучитьОбласть("Шапка|ЛеваяКолонка");
ОбластьПравоШапка = Макет.ПолучитьОбласть("Шапка|ПраваяКолонка");
ОбластьЛевоСтрока = Макет.ПолучитьОбласть("Строка|ЛеваяКолонка");
ОбластьПравоСтрока = Макет.ПолучитьОбласть("Строка|ПраваяКолонка");
// Выводим шапки обеих колонок
ТабДок.Вывести(ОбластьЛевоШапка);
ТабДок.Присоединить(ОбластьПравоШапка);
// Выводим строки параллельно
Для Каждого Стр Из ТаблицаДанных Цикл
ОбластьЛевоСтрока.Параметры.Заполнить(Стр);
ТабДок.Вывести(ОбластьЛевоСтрока);
ОбластьПравоСтрока.Параметры.Заполнить(Стр);
ТабДок.Присоединить(ОбластьПравоСтрока);
КонецЦикла;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.АвтоМасштаб = Истина;
ТабДок.Показать();
Выбор конкретного метода зависит от задачи: для простой отправки на печать достаточно использовать свойство ЭкземпляровНаСтранице, а для визуального контроля и гарантированного расположения элементов на одном листе лучше формировать единую область макета.