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