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