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

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

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

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

Причина проблемы: почему сбрасываются программные настройки при печати?

Рассмотрим ситуацию, с которой часто сталкиваются разработчики на обычных формах. При формировании печатной формы в коде модуля объекта или обработки прописываются стандартные свойства табличного документа:


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

Если сразу после этого вызвать метод ТабДокумент.Показать(), то при отправке на принтер документ действительно напечатается в двух экземплярах на одном листе. Однако в большинстве типовых конфигураций сформированный табличный документ не выводится напрямую. Он передается во вспомогательную общую форму (например, ФормаПечати), которая предоставляет пользователю удобный интерфейс предварительного просмотра, выбора принтера и отправки на печать.

В момент передачи объекта ТабличныйДокумент в форму печати его свойства могут быть проигнорированы элементом управления на форме (полем табличного документа). В результате при нажатии на кнопку «Печать» настройки сбрасываются, и принтер выдает каждый экземпляр на отдельном листе.

Решение для обычных форм (исправление общей формы печати)

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

В коде общей формы печати (например, в процедуре ПриОткрытии или при установке табличного документа) найдем место, где инициализируется поле документа формы, и свяжем свойства. Добавим следующую строку кода:


ЭлементыФормы.ПолеДокумента.ЭкземпляровНаСтранице = ПечатныйДокумент.ЭкземпляровНаСтранице;

Здесь ЭлементыФормы.ПолеДокумента — это имя элемента управления типа «Поле табличного документа» на общей форме просмотра, а ПечатныйДокумент — это входящий объект табличного документа, содержащий наши настройки. Такое простое присвоение гарантирует, что установленные программно параметры печати будут применены в диалоге вывода.

Интерактивная настройка параметров печати пользователем

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

Разберем по шагам, как настроить печать двух экземпляров на одной странице интерактивно:

  1. Сформируйте необходимый документ (например, Акт) и выведите его печатную форму на экран.
  2. Перейдите в главное меню программы и выберите пункт Файл — Параметры страницы.
  3. В открывшемся диалоговом окне настроек найдите раздел, отвечающий за масштаб и размещение.
  4. В поле Экземпляров на странице установите значение 2.
  5. Для того чтобы принтер напечатал именно две копии, в стандартном диалоге печати (вызывается по кнопке «Печать» или сочетанием клавиш Ctrl+P) в поле Количество копий (экземпляров) укажите значение 2.

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

Реализация в управляемых формах на базе БСП

В современных конфигурациях 1С (таких как Бухгалтерия предприятия 3.0, ERP, Управление торговлей 11 и других), разработанных на управляемых формах и использующих БСП, за печать отвечает общая подсистема «Печать». Вносить изменения в общие формы БСП крайне не рекомендуется, чтобы не усложнять последующие обновления системы.

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


Функция СформироватьПечатнуюФормуАкта(МассивОбъектов, ОбъектыПечати) Экспорт

    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_АктОбОказанииУслуг_ДваЭкз";
    
    // Настройки для экономии бумаги: 2 копии на 1 листе
    ТабличныйДокумент.КоличествоЭкземпляров = 2;
    ТабличныйДокумент.ЭкземпляровНаСтранице = 2;
    ТабличныйДокумент.АвтоМасштаб = Истина; // Обязательно для автоматического сжатия под размер А4
    
    // Код заполнения табличного документа из макета...
    // ...
    
    Возврат ТабличныйДокумент;

КонецФункции

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

Альтернативный надежный метод: Программное дублирование макета

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

Посмотрим на более надежный, «железный» способ, гарантирующий вывод двух экземпляров на одном листе вне зависимости от настроек принтера. Суть метода заключается в ручном программном выводе макета дважды в один табличный документ с добавлением визуального разделителя (линии отреза).

Проанализируем пример такого алгоритма:


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

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

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

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

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

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

Вывод экземпляров со своим порядковым номером

Иногда возникает специфическая задача: нужно распечатать несколько копий документа на одном листе, но каждая копия должна содержать свой уникальный номер (например, «Экземпляр №1», «Экземпляр №2» или порядковый номер наклейки). Свойствами принтера этого сделать нельзя, так как принтер просто дублирует одно и то же изображение.

Выясним, как решить эту задачу. Здесь нам поможет только программное дублирование вывода в цикле. Мы будем использовать параметр макета для передачи текущего номера копии.

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


ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетКопии");
ОбластьДокумента = Макет.ПолучитьОбласть("ТелоДокумента");

КоличествоКопийНаСтраницу = 2;

Для Счетчик = 1 По КоличествоКопийНаСтраницу Цикл
    
    // Заполняем параметр номера экземпляра в области макета
    ОбластьДокумента.Параметры.НомерЭкземпляра = "Экземпляр №" + Счетчик;
    
    // Заполняем остальные данные документа
    ОбластьДокумента.Параметры.Данные = "Данные документа...";
    
    // Выводим заполненную область
    Если Счетчик = 1 Тогда
        ТабДокумент.Вывести(ОбластьДокумента);
    Иначе
        // Перед выводом второго экземпляра можно вывести разделитель
        ТабДокумент.Вывести(Макет.ПолучитьОбласть("ЛинияОтреза"));
        ТабДокумент.Вывести(ОбластьДокумента);
    КонецЕсли;
    
КонецЦикла;

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

Групповая пакетная печать больших объемов документов

Рассмотрим более сложную архитектурную задачу: пользователям требуется распечатать комплекты документов сразу для большого количества клиентов (например, 3000+ контрагентов). Для каждого клиента комплект состоит из двух экземпляров акта (на одном листе) и одного экземпляра счета-фактуры (на отдельном листе).

Если решать эту задачу «в лоб» — отправлять на печать каждый документ последовательно из сеанса пользователя, то система неизбежно зависнет. Диспетчер печати Windows (Print Spooler) переполнится, а объем оперативной памяти, потребляемый процессом 1С, превысит допустимые лимиты.

Проанализируем основные правила и рекомендации для реализации таких масштабных задач:

  1. Пакетное разделение: Не пытайтесь сформировать один табличный документ на 9000 страниц. Разделите массив клиентов на пакеты (например, по 100-200 клиентов в одной пачке) и обрабатывайте их последовательно.
  2. Фоновые задания: Выполняйте генерацию тяжелых печатных форм на сервере в фоновом режиме. Пользователь должен видеть прогресс-бар выполнения задачи, при этом интерфейс программы не будет заблокирован.
  3. Объединение в PDF: На сервере сформированные документы можно конвертировать и сохранять в PDF-файлы пакетами, после чего отправлять готовые PDF в операционную систему для печати. Это существенно снижает нагрузку на платформу 1С.
  4. Использование БСП: Используйте встроенный объект ПакетТабличныхДокументов. Он позволяет объединять разные табличные документы с разными настройками печати (двусторонняя печать, разные принтеры, разные лотки бумаги) в одно задание для принтера.

Заполнение листа штрихкодами (печать этикеток сеткой)

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

Для создания такой сетки (плитки) мы используем комбинацию методов табличного документа Вывести() (перенос на новую строку) и Присоединить() (добавление колонки справа в текущей строке).

Рассмотрим пошагово шаблон кода для генерации сетки штрихкодов:


ТабДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетЭтикетки");
ОбластьЭтикетки = Макет.ПолучитьОбласть("ЯчейкаШтрихкода");

// Задаем параметры сетки
КоличествоКолонокНаЛисте = 4;
ВсегоЭтикеток = 20;

КолонкаСчетчик = 0;

Для Индекс = 1 По ВсегоЭтикеток Цикл
    
    // Генерируем штрихкод в область (например, через картинку или шрифт)
    ОбластьЭтикетки.Параметры.ЗначениеШтрихкода = "123456789012" + Индекс;
    
    КолонкаСчетчик = КолонкаСчетчик + 1;
    
    Если КолонкаСчетчик = 1 Тогда
        // Первый элемент в строке выводим стандартным методом (переход на новую строку)
        ТабДокумент.Вывести(ОбластьЭтикетки);
    Иначе
        // Последующие элементы прижимаем справа к предыдущему
        ТабДокумент.Присоединить(ОбластьЭтикетки);
    КонецЕсли;
    
    // Если заполнили текущую строку, сбрасываем счетчик колонок
    Если КолонкаСчетчик = КоличествоКолонокНаЛисте Тогда
        КолонкаСчетчик = 0;
    КонецЕсли;
    
КонецЦикла;

ТабДокумент.Показать("Печать этикеток со штрихкодами");

Этот простой алгоритм позволяет динамически формировать ровную сетку документов на одном листе. Вы можете легко управлять количеством колонок и строк, изменяя параметры макета и переменную КоличествоКолонокНаЛисте.

В современных конфигурациях 1С (Управление торговлей, УНФ, Розница) для выполнения подобных задач уже встроена обработка «Печать этикеток и ценников». Мы рекомендуем использовать этот типовой инструмент, так как он позволяет пользователям визуально настраивать размеры ячеек и выводимые поля без привлечения программиста.

← На главную