Развертывание систем маркировки и штрихкодирования часто преподносит неприятные сюрпризы. Типичная ситуация: в компании много лет успешно печатали этикетки на листах самоклейки формата А4 с помощью обычного лазерного принтера. Но вот руководство решает оптимизировать процесс и приобретает специализированный бюджетный принтер этикеток (например, популярный китайский Xprinter-350B). Вы адаптируете макет под размер ленты (например, 50х40 мм), отправляете документ на печать, принтер выдает этикетку, но при попытке сканирования штрихкода сканер упорно молчит. При этом визуально линии штрихкода выглядят более толстыми, жирными или слегка размытыми.
В этой статье мы подробно проанализируем физические и программные причины этой проблемы и разберем по шагам все рабочие методы ее решения, начиная от простых настроек драйверов и заканчивая системным обходом ограничений RDP-протокола и использованием прямой печати командами принтера.
Если ваша база 1С (будь то историческая 1С 7.7 или современная 1С 8.3) работает в терминальном режиме (на сервере через Remote Desktop Connection), то основной причиной порчи штрихкода является технология Remote Desktop Easy Print. Она появилась в Windows Server 2008 и призвана упростить жизнь системным администраторам, избавляя их от необходимости устанавливать драйверы всех клиентских принтеров на сервер.
Рассмотрим, как работает эта схема и почему она ломает штрихкоды:
ActiveBarcode) генерирует штрихкод в виде растрового изображения (обычно формата BMP) высокого разрешения.Решение А: Подключение принтера «по старинке» в обход Easy Print
Чтобы исключить влияние сжатия графики RDP, мы можем настроить прямую печать на сетевой принтер клиента, минуя механизм перенаправления принтеров Easy Print. Выполним следующие шаги:
Xprinter).\\Имя_Клиентского_ПК\Xprinter.При таком подходе сервер отправляет задание печати напрямую на сетевой ресурс по протоколу SMB, сохраняя исходную графику без искажений RDP.
Решение Б: Отключение Easy Print через групповые политики (GPO)
Если у вас нет возможности расшаривать принтеры по сети, можно заставить терминальный сервер отправлять данные напрямую на оригинальный драйвер клиента без XPS-конвертации. Для этого выполним настройку групповой политики:
gpedit.msc).Обычный лазерный принтер имеет разрешение печати 600 или 1200 DPI (точек на дюйм), благодаря чему он легко прорисовывает тончайшие линии. Бюджетные термопринтеры этикеток начального уровня (такие как Xprinter-350B, TSC, начальные модели Zebra) работают с физическим разрешением всего 203 DPI (примерно 8 точек на миллиметр).
Поскольку термопринтер печатает путем нагрева термоголовкой специальной термочувствительной бумаги, физика процесса накладывает жесткие ограничения:
Проанализируем необходимые настройки в свойствах принтера (вкладка «Настройка печати» / «Параметры страницы» в драйвере Seagull):
Вернемся к физическому разрешению 203 DPI. При 8 точках на миллиметр ширина одной физической точки принтера составляет ровно 0.125 мм. Штрихкод состоит из чередующихся линий разной ширины, где каждый штрих должен быть кратен базовому модулю.
Если в макете 1С вы произвольно растянули объект штрихкода мышкой «за угол», его линии могут потребовать, например, 1.4 или 2.6 физических точек принтера для вывода. Драйвер принтера будет вынужден округлять эти значения на лету: одну полосу он напечатает шириной в 1 точку, а следующую такую же — в 2 точки. Математические пропорции штрихкода будут безвозвратно нарушены, и сканер не сможет декодировать информацию.
Правило разработки макетов: Избегайте произвольного масштабирования картинок штрихкода в табличных документах 1С. Размеры штрихкода (высота, ширина, размер шрифта) должны подбираться строго дискретно. Для ActiveBarcode подбирайте размер шрифта и свойства границ экспериментально (например, как указано в Сообщении 11, используя свойства Borderwidth - 0 и Borderheight - 0).
Превосходной альтернативой использованию нестабильных ActiveX-компонент (таких как barcode.ocx) является вывод штрихкодов с помощью векторных TrueType-шрифтов. Векторные шрифты рендерятся операционной системой с максимальным качеством под физическое разрешение конкретного принтера и не подвергаются жесткому сжатию при передаче по RDP.
Разберем по шагам, как реализовать этот подход в 1С:
EAN13.ttf или Code39.ttf).Рассмотрим пример функции на встроенном языке 1С 7.7 для преобразования строки штрихкода в последовательность символов для шрифта штрихкода:
// Пример функции подготовки строки для вывода шрифтом штрихкода
Функция СформироватьСтрокуДляШрифта(ИсходныйШК) Экспорт
// Алгоритм преобразует цифровой код в символы шрифта.
// Например, для штрихкода EAN-13 "4820017662154"
// на выходе мы должны получить строку вида "C22154251550<;00065032542548@"
// где каждый символ отвечает за конкретную комбинацию штрихов и разделителей.
Перем Результат, СимволРазделителя;
// Выполняем математический расчет контрольного числа и конвертацию символов...
// [Здесь размещается ваш алгоритм преобразования согласно спецификации шрифта]
Результат = ПреобразоватьПоСпецификацииШрифта(ИсходныйШК);
Возврат Результат;
КонецФункции
В макете этикетки для ячейки со штрихкодом мы прописываем выражение: СформироватьСтрокуДляШрифта(ТекущийШК). На печать уходит чистый векторный текст, который идеально считывается любым сканером даже при печати на дешевом оборудовании.
Самым надежным, быстрым и профессиональным методом работы с принтерами этикеток является прямая отправка текстовых команд разметки в порт устройства в обход графической системы Windows (GDI). Это полностью исключает проблемы с RDP, масштабированием, драйверами и качеством картинок.
Почти все принтеры Xprinter поддерживают язык разметки TSPL (Zebra поддерживает ZPL/EPL). Мы можем сформировать текстовый файл с командами и отправить его напрямую в принтер с помощью компоненты работы с портами (например, стандартной v7plus.dll или через объект ЗаписьТекста в 1С 8).
Разберем пример TSPL-кода для печати этикетки размером 50х40 мм со штрихкодом EAN-13:
SIZE 50 mm, 40 mm
GAP 2 mm, 0 mm
DIRECTION 1
CLS
TEXT 50,20,"ROMAN.TTF",0,1,1,"OOO 'Наша Компания'"
BARCODE 50,60,"EAN13",80,1,0,2,4,"4820017662154"
PRINT 1,1
Проанализируем ключевые команды этого кода:
SIZE 50 mm, 40 mm — задает физический размер этикетки.GAP 2 mm, 0 mm — указывает размер подложки (зазора) между этикетками.CLS — очищает буфер принтера перед формированием нового кадра.TEXT — выводит текстовую строку (например, название компании или номенклатуры) со встроенным масштабируемым шрифтом принтера.BARCODE X, Y, "Тип", Высота, Читаемость_Текста, Угол, Узкий_Штрих, Широкий_Штрих, "Данные" — аппаратная команда принтеру сгенерировать штрихкод. Принтер сам, на уровне своего процессора, отрисует штрихкод с идеальной точностью пиксель в пиксель для своего разрешения в 203 DPI.PRINT 1,1 — отправляет команду на печать одной копии этикетки.Этот файл отправляется напрямую в порт принтера (например, LPT, USB или сетевой путь \\localhost\Xprinter). Скорость печати при таком подходе мгновенная, а качество штрихкода всегда остается безупречным и легко считывается сканером с первого раза.