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