Как решить проблему с зеркалированием колонтитулов при двусторонней печати в 1С

Программист 1С v8.3 (Управляемые формы)
← На главную

При выводе документов на двустороннюю печать (дуплекс) в системе «1С:Предприятие 8.3» разработчики и пользователи часто сталкиваются с неприятным поведением принтера: текстовые колонтитулы начинают «зеркалироваться». Например, если на первой (нечетной) странице внизу слева выводится надпись «Исполнитель», а справа — «Потребитель», то на второй (четной) странице они меняются местами. На предварительном просмотре в 1С все может выглядеть идеально, но при отправке на физическое устройство печати макет искажается.

В этой статье мы подробно разберем, почему возникает этот конфликт между платформой 1С, операционной системой Windows и драйверами принтера (особенно часто это происходит с устройствами Kyocera), а также рассмотрим четыре практических способа решения этой проблемы — от быстрого программного «костыля» до правильной системной настройки печати.

Выясняем причину: почему ломается логика отображения колонтитулов?

Для того чтобы эффективно решить проблему, нам необходимо проанализировать, как взаимодействуют механизмы платформы 1С и системные драйверы печати. В свойствах табличного документа 1С есть два ключевых параметра, отвечающих за геометрию двустороннего листа:

  1. ДвусторонняяПечать — управляет типом переворота листа (ПереворотВлево, ПереворотВверх, ИспользоватьНастройкиПринтера или Нет).
  2. ЧередованиеРасположенияСтраниц — определяет, нужно ли системе сдвигать поля документа на четных и нечетных страницах под подшивку (принимает значения Авто, Использовать или НеИспользовать).

По умолчанию, когда мы программно или интерактивно включаем двустороннюю печать, свойство ЧередованиеРасположенияСтраниц переходит в режим Авто. В этом режиме платформа автоматически включает зеркальное отображение полей документа (чтобы слева на четных страницах оставался отступ под дырокол или скрепку). Но одновременно с полями платформа принудительно меняет местами левый и правый колонтитулы на четных страницах.

Если мы пытаемся исправить это в коде, жестко прописав:


ТабДок.ЧередованиеРасположенияСтраниц = ЧередованиеРасположенияСтраниц.НеИспользовать;

то во встроенном предварительном просмотре 1С колонтитулы действительно перестают зеркалиться. Однако при отправке на печать на принтеры некоторых марок (особенно Kyocera с драйверами семейства KX) печатная форма все равно выходит искаженной. Это происходит потому, что драйвер принтера, перехватив управление печатью, видит флаг двусторонней печати и аппаратно «переворачивает» макет страницы на уровне своего процессора растрирования, полностью игнорируя указания 1С о запрете чередования.

---

Способ 1. Программный обходной путь (быстрое решение в коде)

Если у вас нет доступа к настройкам операционной системы на компьютерах пользователей или запрещено менять драйверы принтеров в корпоративной сети, самым быстрым и надежным решением станет изменение структуры вывода колонтитулов.

Вместо использования раздельных свойств ТекстСлева и ТекстСправа, мы объединим всю информацию в один центральный колонтитул с помощью свойства ТекстЦентр. Поскольку этот колонтитул является единым целым и привязан к центру страницы, драйвер принтера не сможет поменять его части местами при дуплексном перевороте.

Рассмотрим пример реализации исходного (проблемного) кода:


// Исходный проблемный код
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
ТабДок.ЧередованиеРасположенияСтраниц = ЧередованиеРасположенияСтраниц.НеИспользовать;

ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.ТекстСлева = "Исполнитель _________________";
ТабДок.НижнийКолонтитул.ТекстСправа = "Потребитель _________________";

А теперь преобразуем его, объединив строки. Мы рассчитаем примерное количество пробелов между левой и правой частью, чтобы визуально разнести их по краям страницы:


// Исправленный безопасный код
ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ПереворотВлево;
ТабДок.ЧередованиеРасположенияСтраниц = ЧередованиеРасположенияСтраниц.НеИспользовать;

ТабДок.НижнийКолонтитул.Выводить = Истина;
// Очищаем левый и правый каналы вывода
ТабДок.НижнийКолонтитул.ТекстСлева = "";
ТабДок.НижнийКолонтитул.ТекстСправа = "";

// Задаем объединенный текст в центр. Количество пробелов подбирается экспериментально 
// под ширину вашего листа и размер шрифта колонтитула.
ТабДок.НижнийКолонтитул.ТекстЦентр = "Исполнитель _________________                                                  Потребитель _________________";

Этот способ гарантирует, что при любой двусторонней печати надписи останутся строго на своих физических местах относительно левого и правого краев листа.

---

Способ 2. Замена драйвера принтера Kyocera (системное решение)

Если проблема регулярно воспроизводится на принтерах Kyocera (например, Kyocera FS-3550, M2040dn и др.), это связано со спецификой их фирменного драйвера Kyocera KX Driver. Этот драйвер использует собственный язык описания страниц и часто конфликтует со спулером печати Windows при обработке графических метафайлов (GDI), приходящих из 1С.

Чтобы решить эту проблему раз и навсегда на системном уровне, выполним следующие шаги по замене драйвера:

  1. Скачайте с официального сайта Kyocera альтернативный драйвер класса KPDL (это фирменная реализация языка PostScript от Kyocera) или Classic PCL6 Driver.
  2. Перейдите в панель управления Windows: «Устройства и принтеры».
  3. Кликните правой кнопкой мыши по вашему принтеру и выберите «Свойства принтера» (не «Настройка печати»).
  4. Перейдите на вкладку «Дополнительно» и нажмите кнопку «Сменить» (или «Новый драйвер»).
  5. Укажите путь к распакованному скачанному драйверу KPDL или Classic PCL и завершите установку.

Классические драйверы и PostScript-драйверы транслируют макет из 1С «как есть», не пытаясь самостоятельно переопределять положение элементов разметки. Зеркалирование колонтитулов прекратится.

---

Способ 3. Использование виртуального принтера (разделение логики)

Если вам необходимо сохранить именно раздельные колонтитулы (левый и правый) и вы не хотите подбирать пробелы в коде, можно полностью исключить вмешательство 1С в процесс настройки двусторонней печати. Пусть платформа думает, что документ печатается в обычном одностороннем режиме, а физическим переворотом страниц займется сама операционная система.

Реализуем этот метод по шагам:

Шаг 1. Настройка кода в 1С. Укажем платформе, что мы не управляем двусторонней печатью из кода, а отдаем эту роль внешним настройкам:


ТабДок.ДвусторонняяПечать = ТипДвустороннейПечати.ИспользоватьНастройкиПринтера;
ТабДок.ЧередованиеРасположенияСтраниц = ЧередованиеРасположенияСтраниц.НеИспользовать;
ТабДок.НижнийКолонтитул.Выводить = Истина;
ТабДок.НижнийКолонтитул.ТекстСлева = "Исполнитель _________________";
ТабДок.НижнийКолонтитул.ТекстСправа = "Потребитель _________________";

Шаг 2. Создание копии принтера в Windows. Чтобы пользователю не приходилось каждый раз вручную включать двустороннюю печать в свойствах принтера при отправке договора, мы создадим для него выделенный виртуальный принтер:

  1. Откройте «Устройства и принтеры» в Windows.
  2. Установите еще одну копию вашего принтера Kyocera (через «Добавление принтера» на тот же порт USB или IP-адрес).
  3. Назовите эту копию, например, «Kyocera 3550 — ДВУСТОРОННИЙ».
  4. Нажмите на этот принтер правой кнопкой мыши, выберите «Настройка печати».
  5. В параметрах принтера на вкладке «Быстрая печать» или «Макет» жестко включите Двустороннюю печать (Дуплекс) по умолчанию и сохраните настройки.

Теперь при печати договора из 1С достаточно направить печать на этот выделенный принтер. Платформа 1С сформирует идеально ровный односторонний документ с корректным расположением левого и правого колонтитулов, а драйвер операционной системы безболезненно напечатает его с двух сторон.

---

Способ 4. Включение режима совместимости с GDI в настройках принтера

Если вы вынуждены использовать стандартный драйвер Kyocera KX и не можете установить KPDL, можно попробовать изменить внутренний режим обработки шрифтов и графики в самом драйвере. Это заставит принтер корректно обрабатывать координаты элементов, передаваемые из Windows Spooler.

Проанализируем этот процесс:

  1. Зайдите в раздел «Параметры устройства» в свойствах вашего принтера Kyocera в Windows.
  2. Найдите кнопку «Совместимость» (в некоторых версиях драйвера эта кнопка может называться «Параметры PDL» или находиться внутри вкладки «Параметры драйвера»).
  3. Найдите и установите флажок напротив пункта «Совместимость с GDI» (GDI compatibility) или отключите оптимизацию работы с буфером обмена принтера.
  4. Примените изменения и перезапустите сеанс работы с 1С.

Этот параметр заставит драйвер обрабатывать координаты вывода текста силами графической подсистемы Windows, предотвращая аппаратные сдвиги и «самостоятельное» зеркалирование текстовых блоков.

← На главную