При выводе документов на двустороннюю печать (дуплекс) в системе «1С:Предприятие 8.3» разработчики и пользователи часто сталкиваются с неприятным поведением принтера: текстовые колонтитулы начинают «зеркалироваться». Например, если на первой (нечетной) странице внизу слева выводится надпись «Исполнитель», а справа — «Потребитель», то на второй (четной) странице они меняются местами. На предварительном просмотре в 1С все может выглядеть идеально, но при отправке на физическое устройство печати макет искажается.
В этой статье мы подробно разберем, почему возникает этот конфликт между платформой 1С, операционной системой Windows и драйверами принтера (особенно часто это происходит с устройствами Kyocera), а также рассмотрим четыре практических способа решения этой проблемы — от быстрого программного «костыля» до правильной системной настройки печати.
Для того чтобы эффективно решить проблему, нам необходимо проанализировать, как взаимодействуют механизмы платформы 1С и системные драйверы печати. В свойствах табличного документа 1С есть два ключевых параметра, отвечающих за геометрию двустороннего листа:
ДвусторонняяПечать — управляет типом переворота листа (ПереворотВлево, ПереворотВверх, ИспользоватьНастройкиПринтера или Нет).ЧередованиеРасположенияСтраниц — определяет, нужно ли системе сдвигать поля документа на четных и нечетных страницах под подшивку (принимает значения Авто, Использовать или НеИспользовать).По умолчанию, когда мы программно или интерактивно включаем двустороннюю печать, свойство ЧередованиеРасположенияСтраниц переходит в режим Авто. В этом режиме платформа автоматически включает зеркальное отображение полей документа (чтобы слева на четных страницах оставался отступ под дырокол или скрепку). Но одновременно с полями платформа принудительно меняет местами левый и правый колонтитулы на четных страницах.
Если мы пытаемся исправить это в коде, жестко прописав:
ТабДок.ЧередованиеРасположенияСтраниц = ЧередованиеРасположенияСтраниц.НеИспользовать;
то во встроенном предварительном просмотре 1С колонтитулы действительно перестают зеркалиться. Однако при отправке на печать на принтеры некоторых марок (особенно Kyocera с драйверами семейства KX) печатная форма все равно выходит искаженной. Это происходит потому, что драйвер принтера, перехватив управление печатью, видит флаг двусторонней печати и аппаратно «переворачивает» макет страницы на уровне своего процессора растрирования, полностью игнорируя указания 1С о запрете чередования.
---
Если у вас нет доступа к настройкам операционной системы на компьютерах пользователей или запрещено менять драйверы принтеров в корпоративной сети, самым быстрым и надежным решением станет изменение структуры вывода колонтитулов.
Вместо использования раздельных свойств ТекстСлева и ТекстСправа, мы объединим всю информацию в один центральный колонтитул с помощью свойства ТекстЦентр. Поскольку этот колонтитул является единым целым и привязан к центру страницы, драйвер принтера не сможет поменять его части местами при дуплексном перевороте.
Рассмотрим пример реализации исходного (проблемного) кода:
// Исходный проблемный код
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
ТабДок.ЧередованиеРасположенияСтраниц = ЧередованиеРасположенияСтраниц.НеИспользовать;
ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.ТекстСлева = "Исполнитель _________________";
ТабДок.НижнийКолонтитул.ТекстСправа = "Потребитель _________________";
А теперь преобразуем его, объединив строки. Мы рассчитаем примерное количество пробелов между левой и правой частью, чтобы визуально разнести их по краям страницы:
// Исправленный безопасный код
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
ТабДок.ЧередованиеРасположенияСтраниц = ЧередованиеРасположенияСтраниц.НеИспользовать;
ТабДок.НижнийКолонтитул.Выводить = Истина;
// Очищаем левый и правый каналы вывода
ТабДок.НижнийКолонтитул.ТекстСлева = "";
ТабДок.НижнийКолонтитул.ТекстСправа = "";
// Задаем объединенный текст в центр. Количество пробелов подбирается экспериментально
// под ширину вашего листа и размер шрифта колонтитула.
ТабДок.НижнийКолонтитул.ТекстЦентр = "Исполнитель _________________ Потребитель _________________";
Этот способ гарантирует, что при любой двусторонней печати надписи останутся строго на своих физических местах относительно левого и правого краев листа.
---
Если проблема регулярно воспроизводится на принтерах Kyocera (например, Kyocera FS-3550, M2040dn и др.), это связано со спецификой их фирменного драйвера Kyocera KX Driver. Этот драйвер использует собственный язык описания страниц и часто конфликтует со спулером печати Windows при обработке графических метафайлов (GDI), приходящих из 1С.
Чтобы решить эту проблему раз и навсегда на системном уровне, выполним следующие шаги по замене драйвера:
Классические драйверы и PostScript-драйверы транслируют макет из 1С «как есть», не пытаясь самостоятельно переопределять положение элементов разметки. Зеркалирование колонтитулов прекратится.
---
Если вам необходимо сохранить именно раздельные колонтитулы (левый и правый) и вы не хотите подбирать пробелы в коде, можно полностью исключить вмешательство 1С в процесс настройки двусторонней печати. Пусть платформа думает, что документ печатается в обычном одностороннем режиме, а физическим переворотом страниц займется сама операционная система.
Реализуем этот метод по шагам:
Шаг 1. Настройка кода в 1С. Укажем платформе, что мы не управляем двусторонней печатью из кода, а отдаем эту роль внешним настройкам:
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ИспользоватьНастройкиПринтера;
ТабДок.ЧередованиеРасположенияСтраниц = ЧередованиеРасположенияСтраниц.НеИспользовать;
ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.ТекстСлева = "Исполнитель _________________";
ТабДок.НижнийКолонтитул.ТекстСправа = "Потребитель _________________";
Шаг 2. Создание копии принтера в Windows. Чтобы пользователю не приходилось каждый раз вручную включать двустороннюю печать в свойствах принтера при отправке договора, мы создадим для него выделенный виртуальный принтер:
Теперь при печати договора из 1С достаточно направить печать на этот выделенный принтер. Платформа 1С сформирует идеально ровный односторонний документ с корректным расположением левого и правого колонтитулов, а драйвер операционной системы безболезненно напечатает его с двух сторон.
---
Если вы вынуждены использовать стандартный драйвер Kyocera KX и не можете установить KPDL, можно попробовать изменить внутренний режим обработки шрифтов и графики в самом драйвере. Это заставит принтер корректно обрабатывать координаты элементов, передаваемые из Windows Spooler.
Проанализируем этот процесс:
Этот параметр заставит драйвер обрабатывать координаты вывода текста силами графической подсистемы Windows, предотвращая аппаратные сдвиги и «самостоятельное» зеркалирование текстовых блоков.