Разработчики и системные администраторы 1С часто сталкиваются с крайне неприятной проблемой: штрихкод, который на экране компьютера выглядит идеально ровным и четким, после отправки на термопринтер этикеток (например, Argox, TSC или Zebra) печатается с явными искажениями. В результате линии штрихкода сливаются, их пропорции нарушаются, а сканер отказывается считывать информацию. При этом печать того же макета на обычном офисном лазерном принтере проходит без сбоев.
В этой статье мы подробно проанализируем причины возникновения этой проблемы при работе в терминальном режиме (RDP) и разберем по шагам наиболее эффективные методы ее решения.
Главным виновником искажения пропорций штрихкода является встроенная технология Microsoft для перенаправления печати в терминальных сессиях — TS Easy Print (EasyPrint). Она разработана для упрощения администрирования: сервер не требует установки драйверов под каждый локальный принтер пользователя, а использует универсальный виртуальный драйвер.
Служба Easy Print работает следующим образом: она преобразует отправленный из 1С документ в векторный графический формат (XPS или EMF), сжимает его для экономии пропускной способности сети (часто используя алгоритмы сжатия с потерями качества, схожие с JPEG) и отправляет на локальную машину. Для обычного текстового документа это сжатие незаметно. Однако для штрихкода, где критически важна ширина каждого штриха с точностью до сотых долей миллиметра, такое сжатие оказывается фатальным. Границы черных полос "размываются", пиксели округляются, и геометрия штрихкода безвозвратно нарушается.
Ниже рассмотрим подробные практические способы решения этой проблемы.
Это наиболее надежный и правильный системный подход. Мы заставим сервер терминалов использовать оригинальный драйвер принтера этикеток вместо универсального Easy Print, что исключит промежуточное сжатие графики.
Проанализируем шаги по настройке групповых политик сервера:
gpedit.msc и нажмите Enter.После переподключения пользователя к RDP-сессии сервер автоматически подтянет оригинальный драйвер, и макет этикетки будет отправляться на печать в исходном виде, без искажений.
Если изменить групповые политики на сервере невозможно, мы можем пойти другим путем — полностью исключить службу перенаправления печати RDP. Для этого настроим прямую сетевую печать:
Argox2300).\\IP-клиента\Argox2300.В этом случае данные отправляются на печать напрямую в порт принтера по сети, минуя виртуальные драйверы терминального сервера.
В крупных компаниях со сложной сетевой инфраструктурой стандартный функционал Windows по пробросу принтеров часто заменяют на специализированный софт. Рассмотрим наиболее популярные решения — TSPrint и ScrewDrivers.
Эти программы перехватывают поток печати на сервере терминалов и передают его на клиентскую машину в собственном оптимизированном формате, который гарантирует сохранение точного масштаба векторных элементов и шрифтов. Использование сторонних утилит полностью решает проблему "замыливания" штрихкодов без необходимости тонкой настройки политик операционной системы.
По умолчанию стандартная компонента 1С:Печать штрихкодов генерирует штрихкод как графическое изображение (картинку), которое внедряется в табличный документ. Картинки наиболее сильно подвержены искажениям при сжатии.
Мы можем обойти это ограничение, если перенастроим макет этикетки в 1С на использование специализированных шрифтов TrueType (например, Code128 или EanGnivc). В этом случае штрихкод формируется как обычная текстовая строка, буквы которой при отображении заменяются на соответствующие комбинации штрихов.
Поскольку текстовые данные при передаче по RDP не сжимаются и не растрируются, принтер получит команду на печать конкретного шрифта и выведет его с максимальным аппаратным разрешением (DPI) термоголовки.
Рассмотрим пример кода на встроенном языке 1С для программного управления параметрами вывода штрихкода в табличном документе:
// Отключаем автоматическое масштабирование табличного документа,
// чтобы избежать программного искажения размеров линий штрихкода
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.АвтоМасштаб = Ложь;
// Явно задаем реальный размер страницы, соответствующий размеру этикетки в мм
ТабДокумент.РазмерСтраницы = "Custom";
ТабДокумент.ШиринаСтраницы = 58;
ТабДокумент.ВысотаСтраницы = 40;
// Пример переопределения шрифта области штрихкода для исключения графического вывода
ОбластьМакета = Макет.ПолучитьОбласть("ОбластьШтрихкода");
ОбластьМакета.Области.Штрихкод.Шрифт = Новый Шрифт("Code128", 16, Ложь, Ложь);
Иногда искажение происходит еще до отправки в очередь печати RDP — на этапе формирования табличного документа в самой платформе 1С. Если в параметрах страницы установлен масштаб «По ширине листа» или включена опция АвтоМасштаб = Истина, платформа принудительно сжимает или растягивает макет, подгоняя его под размеры области печати драйвера.
Для предотвращения этой проблемы в настройках печати принтера на сервере и в параметрах страницы 1С всегда устанавливайте масштаб «Реальный размер» (или 100%). Категорически избегайте любых программных корректировок размеров макета.
В современных операционных системах (начиная с Windows Server 2016/2019) включенные по умолчанию технологии улучшения отображения текста (ClearType и Font Smoothing) могут негативно влиять на графический поток RDP, вызывая микроискажения на границах контрастных переходов штрихкода.
Рекомендуется отключить сглаживание шрифтов для терминальных сессий через групповые политики сервера в разделе «Среда удаленных сеансов», активировав параметр «Не разрешать сглаживание шрифтов» (Do not allow font smoothing). Это позволит передавать графические границы линий штрихкода максимально резко и без размытия соседних пикселей.