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

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

При разработке печатных форм в системе 1С:Предприятие часто возникает задача экономии бумаги или оптимизации документооборота, когда необходимо разместить два экземпляра одного и того же документа на одном листе формата А4. На первый взгляд, платформа предоставляет для этого штатные механизмы, такие как свойства табличного документа. Однако при массовой печати (когда нужно вывести сразу 50 или 100 разных документов) разработчики сталкиваются с тем, что копии перемешиваются или уходят на разные страницы. В этой статье мы подробно разберем, почему так происходит, и рассмотрим наиболее надежные способы решения этой задачи. В качестве основы для создания такого алгоритма подойдет шаблон внешней печатной формы на БСП 3.1.

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

В объекте ТабличныйДокумент существуют встроенные свойства, предназначенные для управления компоновкой при печати. Проанализируем типичный подход, который часто не срабатывает при пакетном выводе:


ТабДок.КоличествоЭкземпляров = 2;
ТабДок.ЭкземпляровНаСтранице = 2;
ТабДок.РазборПоКопиям = Ложь;

Рассмотрим ситуацию: нам нужно напечатать 100 разных накладных. Если мы просто установим эти параметры и отправим документы на принтер в одном задании, платформа может сформировать очередь печати следующим образом: сначала пойдут первые экземпляры всех 100 документов, а затем вторые экземпляры этих же документов. В результате на первом листе вы напечатаете первый экземпляр Документа №1 и первый экземпляр Документа №2. Это в корне неверно, так как цель — получить две копии Документа №1 на одном листе.

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

Способ 1. Использование промежуточного «контейнера» (Наиболее надежный)

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

Рассмотрим пример кода, реализующего этот алгоритм:


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

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

Результат.Показать("Печать двух экземпляров");

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

Способ 2. Проверка вывода и динамическое масштабирование

Иногда высота печатной формы может варьироваться (например, в зависимости от количества строк в табличной части). В таких случаях две копии могут просто не влезть на один лист А4. Чтобы программа не разрывала документ некорректно, проанализируем ситуацию с помощью метода ПроверитьВывод.

Посмотрим на пример логики с проверкой:


// Массив для проверки: текущий состав листа + новый экземпляр
МассивДляПроверки = Новый Массив;
МассивДляПроверки.Добавить(ОбластьДокумента);
МассивДляПроверки.Добавить(ОбластьРазделитель);
МассивДляПроверки.Добавить(ОбластьДокумента);

Если Не Результат.ПроверитьВывод(МассивДляПроверки) Тогда
    // Если три области вместе не влезают, значит нужно уменьшить масштаб 
    // или выводить по одному экземпляру. 
    // Но чаще всего достаточно установить АвтоМасштаб = Истина
КонецЕсли;

Важный технический момент: Чтобы две области А5 гарантированно поместились на А4, необходимо обратить внимание на поля страницы. По умолчанию в 1С установлены поля (левое, правое, верхнее, нижнее) по 10 мм. При печати "два в одном" эти отступы суммируются, что может привести к переносу части документа на второй лист.

Рекомендуем устанавливать минимальные поля для результирующего документа:


Результат.ПолеСверху = 5;
Результат.ПолеСнизу  = 5;
Результат.ПолеСлева  = 10;
Результат.ПолеСправа = 5;

Способ 3. Работа со свойством «Разбор по копиям»

Если вы все же решили использовать системное свойство ЭкземпляровНаСтранице, обратите внимание на параметр РазборПоКопиям. Рассмотрим, как он влияет на результат:

Однако на практике поведение сильно зависит от драйвера конкретного принтера (HP, Kyocera, Canon ведут себя по-разному). Поэтому программный метод (Способ 1) считается "золотым стандартом" среди разработчиков 1С.

Рекомендации по оформлению макета

Для того чтобы печатная форма выглядела профессионально при размещении двух экземпляров, придерживайтесь следующих правил:

  1. Создайте в макете специальную область Разделитель. Она может содержать тонкую пунктирную линию или иконку ножниц. Это подскажет пользователю, где нужно разрезать лист.
  2. Используйте метод Присоединить(), если вам нужно расположить экземпляры не друг под другом (вертикально), а рядом (горизонтально, для формата А5 ландшафт).
  3. Всегда устанавливайте АвтоМасштаб = Истина. Платформа сама немного "ужмет" документ, если он на пару миллиметров превышает границы печатной области из-за непечатаемых зон принтера.

Подведем итог: использование прямого дублирования вывода в цикле с последующей вставкой разделителя страниц — это самый надежный способ получить предсказуемый результат при печати двух экземпляров на одном листе. Это исключает зависимость от настроек драйвера принтера и гарантирует правильный порядок документов в больших пачках.

← На главную