Проблема нечитаемости штрихкодов при печати из старых версий 1С (особенно 7.7) в современных ИТ-инфраструктурах — это классическая ситуация, с которой сталкиваются многие системные администраторы и программисты. На первый взгляд этикетка выглядит безупречно: линии четкие, текст понятен, расположение элементов соответствует макету. Однако сканер упорно игнорирует код. В этой статье мы подробно разберем причины этой проблемы, проанализируем влияние терминальных сессий и выясним, как добиться идеальной печати.
Наиболее вероятная причина искажения штрихкода при работе на сервере — это использование стандартного механизма перенаправления принтеров Remote Desktop Easy Print. Рассмотрим, как это работает. Когда вы подключаетесь к терминальному серверу, Windows пытается «пробросить» ваш локальный принтер в сессию. Если на сервере не установлен точный драйвер принтера, используется универсальный драйвер EasyPrint.
Проанализируем ситуацию: EasyPrint передает задание на печать в виде графического метафайла (XPS). В процессе передачи и преобразования происходит микро-масштабирование. Для обычного текста это незаметно, но для штрихкода типа EAN-13 или Code128 изменение ширины одной черной полоски или белого промежутка всего на 1 пиксель делает код невалидным. Контрольная сумма не сходится, и сканер «молчит».
Решение:
\\имя_компьютера\имя_принтера.Штрихкод в 1С 7.7 часто выводится как картинка или через объект ActiveX (например, 1CBarCoder.dll). Драйвер принтера при получении такой «картинки» может применить алгоритм сглаживания или дизеринга (имитация оттенков серого точками). Вместо сплошной черной линии сканер «видит» сетку из мелких точек. Глазу это кажется серым или темно-серым, а для лазера это разрыв линии.
Разберем по шагам, как настроить драйвер:
Выясним причину, связанную с разрешением. Принтеры этикеток обычно имеют разрешение 203 DPI (реже 300 или 600). Windows Server по умолчанию работает с логическим разрешением 96 DPI. При попытке отрисовать штрихкод, созданный в 1С 7.7, происходит математическое округление координат линий.
Если в системе включено масштабирование интерфейса (например, 125% или 150%), проблема усугубляется. Проанализируем это: 1С передает команду нарисовать линию шириной 1 мм. При 203 DPI это примерно 8 точек. При пересчете через разные разрешения и коэффициенты масштабирования драйвер может решить напечатать 7 или 9 точек. Пропорции штрихкода нарушаются.
Что мы можем сделать:
Посмотрим на физическую сторону вопроса. Если штрихкод выглядит «расплывчатым», возможно, установлена слишком высокая температура (Darkness) в настройках принтера. Термобумага «пережаривается», и черные штрихи становятся толще, «съедая» белые промежутки. Это называется «растеканием точки».
Напротив, если термоголовка изношена или загрязнена, на штрихкоде могут появиться белые горизонтальные полосы (битые пиксели). Рассмотрим два типа расположения штрихкода:
Совет: Если вы столкнулись с полосами, попробуйте повернуть штрихкод в макете 1С на 90 градусов. Также рекомендуем регулярно протирать термоголовку этиловым спиртом.
Проанализируем самый надежный, но технически сложный способ решения проблемы. Проблема 1С 7.7 в том, что она печатает через графический движок Windows (GDI). Однако профессиональные принтеры штрихкодов имеют встроенные команды для отрисовки кода. Например, команда B в языке EPL2 заставляет принтер сам сформировать идеальный штрихкод, исходя из его физического разрешения.
Вместо использования стандартной печатной формы 1С, мы можем сформировать текстовый файл с командами и отправить его напрямую в порт принтера. Рассмотрим пример логики:
// Пример формирования команды на языке EPL2 для Citizen/Zebra
ТекстКоманды = "N" + Симв(10); // Очистка буфера
ТекстКоманды = ТекстКоманды + "B50,50,0,1,2,2,100,B,""123456789012""" + Симв(10); // Печать EAN13
ТекстКоманды = ТекстКоманды + "P1" + Симв(10); // Печать одной этикетки
// Отправка напрямую в порт принтера через FileSystemObject
FSO = СоздатьОбъект("Scripting.FileSystemObject");
ПринтерПорт = FSO.CreateTextFile("\\Server\Citizen521");
ПринтерПорт.Write(ТекстКоманды);
ПринтерПорт.Close();
Этот метод полностью исключает влияние драйверов, настроек RDP, дизеринга и масштабирования. Штрихкод всегда будет идеально четким, так как его генерирует сам процессор принтера.
Если ваш штрихкод не читается, пройдите по следующим шагам:
Следуя этим рекомендациям, мы сможем гарантировать стабильную работу складского оборудования и высокую скорость обработки товаров, исключив ручной ввод кодов из-за ошибок печати.