При массовой печати документов в «1С:Бухгалтерия 3.0» (например, счетов-фактур или актов) пользователи часто сталкиваются с неприятной особенностью: при включении режима двухсторонней печати (дуплекса) документы «наползают» друг на друга. Если первый документ состоит из одной страницы, то второй документ печатается на обороте того же листа. Это вынуждает бухгалтеров вручную разделять пачки или печатать каждый документ по отдельности, что крайне неэффективно.
В этой статье мы подробно проанализируем, почему так происходит, и рассмотрим возможные пути решения этой задачи — от настройки параметров принтера до программных методов с использованием современных инструментов платформы 1С.
Для начала разберем внутренний механизм формирования печатных форм. В типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) при выборе нескольких документов в списке и нажатии кнопки «Печать» система чаще всего формирует один-единственный объект типа ТабличныйДокумент.
Проанализируем ситуацию: программа в цикле перебирает выбранные документы, формирует для каждого макет и добавляет его в общий итоговый документ, вставляя между ними метод ВывестиГоризонтальныйРазделительСтраниц(). Для принтера такой результат выглядит как одна длинная книга. Если в этой «книге» первая страница закончилась разделителем, принтер, работающий в режиме двухсторонней печати, воспринимает вторую страницу как логическое продолжение и печатает её на обороте первого листа.
Выясним причину: принтер «не знает», где заканчивается один юридический документ и начинается другой. Он просто видит поток страниц одного задания. Чтобы решить эту проблему, нужно либо передавать документы в очередь печати по отдельности, либо заставлять систему добавлять пустые страницы там, где это необходимо.
Начиная с современных версий платформы 8.3, в арсенале разработчика появился мощный инструмент — ПакетОтображаемыхДокументов. В отличие от обычного табличного документа, пакет позволяет объединить несколько разных табличных документов в одно задание на печать, сохраняя при этом их автономность.
Рассмотрим пример кода, который позволяет реализовать правильную пакетную печать:
// Создаем объект пакета
Пакет = Новый ПакетОтображаемыхДокументов;
// В цикле по выбранным объектам формируем отдельные табдоки
Для Каждого СсылкаИзСписка Из МассивСсылок Цикл
ТабДок = СформироватьПечатнуюФорму(СсылкаИзСписка);
// Указываем настройки двухсторонней печати для каждого документа
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
// Добавляем документ в пакет
ЭлементПакета = Пакет.Состав.Добавить();
ЭлементПакета.Данные = ПоместитьВоВременноеХранилище(ТабДок);
КонецЦикла;
// Отправляем пакет на принтер
Пакет.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
При использовании ПакетОтображаемыхДокументов платформа передает драйверу принтера информацию о том, что каждый элемент состава пакета является отдельной логической сущностью. В современных драйверах это инициирует сброс листа, и новый документ начинается с чистой страницы.
Если ваша версия платформы или конфигурации (как в случае с 8.3.11) не позволяет эффективно использовать пакеты, можно применить классический метод: программный анализ количества страниц в каждом документе. Если документ содержит нечетное количество страниц, мы принудительно добавляем еще одну пустую страницу перед началом следующего документа.
Разберем алгоритм реализации этого метода:
ТабличныйДокумент для текущего объекта.КоличествоСтраниц(), чтобы определить, сколько листов занимает документ.КоличествоСтраниц % 2 <> 0 (остаток от деления на 2 не равен нулю), добавьте в конец документа разделитель и пустую область.Посмотрим на пример реализации этой логики:
ИтоговыйТабДок = Новый ТабличныйДокумент;
Для Каждого ДокументОбъект Из СписокДокументов Цикл
ТекущийТабДок = СформироватьПечатнуюФорму(ДокументОбъект);
// Проверяем количество страниц
Если ТекущийТабДок.КоличествоСтраниц() % 2 <> 0 Тогда
// Добавляем разделитель и пустую строку для создания пустой страницы
ТекущийТабДок.ВывестиГоризонтальныйРазделительСтраниц();
// Можно вывести пустую область, чтобы страница физически создалась
ПустаяОбласть = ТекущийТабДок.ПолучитьОбласть("Пусто");
ТекущийТабДок.Вывести(ПустаяОбласть);
КонецЕсли;
// Объединяем с общим документом
ИтоговыйТабДок.Вывести(ТекущийТабДок);
ИтоговыйТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЦикла;
Важный нюанс: Метод КоличествоСтраниц() работает корректно только в том случае, если для табличного документа задан конкретный принтер или установлены параметры страницы (размер бумаги, поля), иначе расчет может быть неверным.
Иногда проблему можно решить без изменения программного кода, используя штатные настройки 1С и драйвера принтера. Рассмотрим, как это сделать:
Если стандартная настройка 1С не помогает, проанализируем настройки самого принтера. В свойствах профессиональных офисных МФУ (Kyocera, HP, Konica Minolta) существует функция «Разделение заданий» (Job Separation) или «Разделительный лист». Если в настройках драйвера включена опция «Начинать каждое задание с нового листа», а 1С отправляет документы не одним «склеенным» файлом, а через пакетную печать, принтер будет сам вставлять разрывы.
Проанализировав различные подходы, можно выделить несколько критических моментов:
ПакетОтображаемыхДокументов. Если есть возможность, обновите платформу до актуальной (8.3.22 и выше).Подводя итог, можно сказать, что «стандартной галочкой» в интерфейсе пользователя эта проблема в старых версиях не решается. Однако программное добавление пустых страниц в цикле формирования или переход на использование ПакетОтображаемыхДокументов полностью закрывают этот вопрос, обеспечивая комфортную работу бухгалтерии.