Почему внешняя печатная форма 1С печатает только одну копию вместо нескольких?

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

Часто разработчики сталкиваются с ситуацией, когда созданная внешняя печатная форма ведет себя по-разному в зависимости от способа вывода на печать. Например, при вызове «Предварительного просмотра» мы видим все три настроенные копии документа (допустим, 6 листов), но при нажатии кнопки «Печать» на принтер уходит только одна копия (2 листа). Разберем, почему так происходит и как это исправить.

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

Почему предварительный просмотр и прямая печать работают по-разному

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

  1. Предварительный просмотр. В этом режиме платформа формирует и показывает табличный документ в точности так, как это описано в коде вашей печатной формы. Если вы установили свойство КоличествоЭкземпляров = 3, то в окне просмотра будут показаны страницы для всех трех экземпляров. Система просто визуализирует объект ТабличныйДокумент со всеми его свойствами.
  2. Прямая печать (по кнопке). При нажатии на кнопку «Печать», особенно в типовых конфигурациях, управление часто передается стандартным механизмам печати платформы или операционной системы. Эти механизмы могут игнорировать свойство КоличествоЭкземпляров табличного документа и вместо этого использовать настройки, заданные в системном диалоге печати или в настройках принтера по умолчанию (где обычно стоит 1 копия). В результате на печать отправляется только один экземпляр.

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

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

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

Рассмотрим по шагам, как это реализовать.

1. Создание итогового табличного документа

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


// Итоговый документ, который будет отправлен на печать
ИтоговыйТабДок = Новый ТабличныйДокумент;

2. Формирование копий в цикле

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

Посмотрим на пример кода, который формирует 3 одинаковые копии:


// Предположим, у вас есть функция, которая возвращает готовую печатную форму
// Функция СформироватьОдинЭкземплярПФ() возвращает ТабличныйДокумент

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

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

// Возвращаем или печатаем единый документ со всеми копиями
Возврат ИтоговыйТабДок;

В результате ИтоговыйТабДок будет содержать все страницы всех трех копий. При отправке такого документа на печать (например, методом Напечатать()) принтер получит одно задание и напечатает все листы.

3. Настройка разных копий (например, со штрихкодом и без)

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

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

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

Сначала доработаем функцию формирования одного экземпляра, чтобы она принимала параметры:


Функция СформироватьОдинЭкземплярПФ(ПараметрыПечати)
    
    // ... здесь основной код формирования ПФ ...
    
    // Проверяем параметр и выводим штрихкод только при необходимости
    Если ПараметрыПечати.Свойство("ПечататьШтрихкод") И ПараметрыПечати.ПечататьШтрихкод Тогда
        // ... код для вывода области макета со штрихкодом ...
    КонецЕсли;
    
    // ...
    Возврат ТабДок;
    
КонецФункции

Теперь основной код вывода на печать будет выглядеть так:


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

// 1. Формируем первую копию СО штрихкодом
ПараметрыПервойКопии = Новый Структура("ПечататьШтрихкод", Истина);
ПервыйЭкземпляр = СформироватьОдинЭкземплярПФ(ПараметрыПервойКопии);
ИтоговыйТабДок.Вывести(ПервыйЭкземпляр);

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

// Возвращаем готовый документ для печати или предпросмотра
Возврат ИтоговыйТабДок;

Этот подход решает сразу две задачи:

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

← На главную