Рады приветствовать вас, коллеги! Сегодня мы детально разберем одну из самых коварных и часто встречающихся проблем в администрировании торговых систем — порчу качества штрихкодов при печати из терминальной сессии 1С на локальный принтер этикеток (чаще всего с этим сталкиваются владельцы принтеров Zebra TLP 2824, LP 2824 Plus и аналогичных).
Ситуация выглядит следующим образом: локально с клиентского компьютера под управлением Windows штрихкоды печатаются идеально и отлично считываются любыми сканерами. Но стоит пользователю зайти в терминальную сессию 1С на сервере (например, Windows Server 2008 R2 / 2012 / 2016 / 2019) и отправить этикетку на печать через проброшенный принтер RDP, как визуально штрихкод кажется нормальным, но лазерные сканеры наотрез отказываются его распознавать. При детальном рассмотрении выясняется, что происходит микроискажение линий: теряются отдельные пиксели, размываются границы штрихов, черные полосы слипаются. Выясним причину этого поведения и разберем по шагам все возможные методы решения.
Главная причина кроется в технологии Remote Desktop Easy Print. По умолчанию при подключении к удаленному рабочему столу операционная система Windows использует универсальный драйвер Easy Print для перенаправления печати. Эта технология преобразует графические данные и текстовые документы в формат XPS на стороне сервера, передает их на клиентскую машину по виртуальному каналу RDP, а клиентский компьютер уже силами локального драйвера выводит документ на печать.
Для обычных офисных документов формата А4 это отличное решение, избавляющее администраторов от необходимости устанавливать сотни различных драйверов на сервер. Но для специализированных термопринтеров с физическим разрешением печати 203 DPI (dots per inch) такое промежуточное преобразование графики оказывается фатальным. Происходит интерполяция (масштабирование) картинки, из-за чего строго контрастные черные и белые линии штрихкода превращаются в размытые серые полутона, края штрихов становятся «рваными», а пропорции толщины линий нарушаются. Лазерный сканер, считывающий штрихкод по соотношению ширины черных и белых полос, выдает ошибку декодирования.
Рассмотрим подробнее эффективные способы решения этой проблемы — от простой настройки политик сервера до аппаратной печати.
Это классическое и наиболее правильное решение, которое помогает в 90% случаев. Мы заставим сервер использовать «родной» драйвер принтера Zebra вместо универсального Easy Print.
Шаг 1. Отключение Easy Print через групповые политики сервера:
Win + R, введите gpedit.msc и нажмите Enter.Шаг 2. Установка оригинального драйвера на сервер:
Если пользователи работают в локальной сети компании или связаны стабильным VPN-каналом с сервером, отличным решением будет отказаться от проброса портов RDP (маппинга) и подключить принтер напрямую к серверу как сетевой.
Проанализируем этот процесс:
Zebra2824.\\Имя_Компьютера_Клиента\Zebra2824) и установите для него драйверы на сервере.В этом сценарии отправка заданий печати из 1С идет по сетевому протоколу Windows напрямую в драйвер принтера, минуя какие-либо преобразования графики каналами RDP. Печать штрихкодов становится идеально четкой.
Когда штрихкод формируется в 1С (особенно через объект КомпонентаПечатиШтрихкодов), он передается на печать как графический объект. Драйвер принтера по умолчанию может пытаться сгладить резкие переходы цветов (применить дизеринг), чтобы картинка выглядела «мягче». Для текстовых принтеров этикеток это губительно.
Настроим параметры графики в драйвере принтера (настройку нужно выполнить как на локальном ПК, так и на сервере в свойствах принтера):
Если на компьютере пользователя установлена современная ОС (Windows 10/11) с высоким разрешением экрана (например, Full HD на маленьком ноутбуке), в системе часто включено масштабирование интерфейса (125% или 150%). При подключении по RDP сервер пытается смасштабировать графический поток под требования клиента, что приводит к физическому искажению сетки пикселей выводимого штрихкода.
Выясним, как это исправить:
mstsc.exe, выберите «Свойства» -> вкладка «Совместимость» -> «Изменить параметры высокого DPI» и установите галочку «Переопределите режим масштабирования...», выбрав режим «Приложение».Обратите внимание на то, как элемент управления штрихкодом расположен в самом макете конфигурации 1С. Если вы используете управляемые формы или обычные формы, поведение вывода графики может отличаться.
Посмотрим на свойства рисунка штрихкода в макете этикетки:
РисунокТабличногоДокумента), где генерируется штрихкод.Когда включен режим «Растянуть», платформа 1С пытается принудительно вписать сгенерированную картинку штрихкода в границы ячейки таблицы, сжимая или растягивая ее на доли миллиметра. На термопринтере это моментально дает нечитаемый результат из-за «слипания» соседних линий.
Самым надежным, профессиональным и безотказным решением при работе в облачных сервисах и терминалах является отказ от печати штрихкода как графики (картинки). Принтеры Zebra — это интеллектуальные устройства, имеющие встроенный процессор и собственный язык разметки этикеток (для старых моделей Zebra — EPL, для новых — ZPL).
Мы можем отправлять текстовые команды напрямую в порт принтера. Принтер сам, используя свои аппаратные алгоритмы, сгенерирует штрихкод идеальной четкости с учетом своего физического разрешения термоголовки.
Рассмотрим пример кода на языке 1С, который формирует текстовый поток команд EPL для принтера Zebra и отправляет его на печать. Для работы этого метода на сервере принтер устанавливается с использованием стандартного Windows-драйвера Generic / Text Only (Только текст):
// Пример формирования файла печати на языке EPL2 для Zebra TLP 2824
ТекстДляПринтера = Новый ТекстовыйДокумент;
// Очистить буфер принтера
ТекстДляПринтера.ДобавитьСтроку("N");
// Установка плотности (температуры) печати (значение от 0 до 15)
ТекстДляПринтера.ДобавитьСтроку("D10");
// Установка скорости печати (2 дюйма в секунду)
ТекстДляПринтера.ДобавитьСтроку("S2");
// Формирование штрихкода типа Code 128
// Синтаксис: B[X],[Y],[Rotation],[Type],[Narrow Bar],[Wide Bar],[Height],[Readable],"Data"
ТекстДляПринтера.ДобавитьСтроку("B50,50,0,1,2,4,80,B,""2000000012345""");
// Печать текстового поля под штрихкодом
ТекстДляПринтера.ДобавитьСтроку("A50,140,0,3,1,1,N,""Товар: Шампунь детский""");
// Команда печати 1 копии этикетки
ТекстДляПринтера.ДобавитьСтроку("P1");
// Запись во временный файл и отправка напрямую в порт принтера
ИмяФайла = ПолучитьИмяВременногоФайла("txt");
ТекстДляПринтера.Записать(ИмяФайла, КодировкаТекста.OEM);
// Отправляем файл на принтер (в реальном коде можно использовать копирование в порт или внешнюю компоненту)
КомандаСистемы("copy /b """ + ИмяФайла + """ ""\\ИмяСервера\Zebra2824""");
При таком подходе качество штрихкода всегда будет составлять 100%, независимо от настроек сессии RDP, масштабирования экрана клиента, используемой операционной системы или облачного провайдера.
Для быстрого устранения проблемы нечитаемых штрихкодов начните с отключения Easy Print в групповых политиках сервера и установки идентичных локальных драйверов Zebra на сервер. Если вы работаете в сложной облачной инфраструктуре, рассмотрите переход на прямую печать через EPL/ZPL команды, что навсегда избавит вас от проблем с графическими искажениями при передаче данных через RDP.