Почему принтер этикеток печатает нечитаемый штрихкод из 1С и как это исправить?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

Развертывание систем маркировки и штрихкодирования часто преподносит неприятные сюрпризы. Типичная ситуация: в компании много лет успешно печатали этикетки на листах самоклейки формата А4 с помощью обычного лазерного принтера. Но вот руководство решает оптимизировать процесс и приобретает специализированный бюджетный принтер этикеток (например, популярный китайский Xprinter-350B). Вы адаптируете макет под размер ленты (например, 50х40 мм), отправляете документ на печать, принтер выдает этикетку, но при попытке сканирования штрихкода сканер упорно молчит. При этом визуально линии штрихкода выглядят более толстыми, жирными или слегка размытыми.

В этой статье мы подробно проанализируем физические и программные причины этой проблемы и разберем по шагам все рабочие методы ее решения, начиная от простых настроек драйверов и заканчивая системным обходом ограничений RDP-протокола и использованием прямой печати командами принтера.

Причина 1: Сжатие графики службой RDP Easy Print

Если ваша база 1С (будь то историческая 1С 7.7 или современная 1С 8.3) работает в терминальном режиме (на сервере через Remote Desktop Connection), то основной причиной порчи штрихкода является технология Remote Desktop Easy Print. Она появилась в Windows Server 2008 и призвана упростить жизнь системным администраторам, избавляя их от необходимости устанавливать драйверы всех клиентских принтеров на сервер.

Рассмотрим, как работает эта схема и почему она ломает штрихкоды:

  1. Компонента печати штрихкодов (например, стандартная ActiveX-компонента ActiveBarcode) генерирует штрихкод в виде растрового изображения (обычно формата BMP) высокого разрешения.
  2. При отправке на печать через перенаправленный принтер служба Easy Print переводит документ в формат XPS (XML Paper Specification) для экономии трафика.
  3. Во время этого преобразования растровые картинки подвергаются сжатию с потерей качества (lossy compression) и принудительному уменьшению разрешения (даунсемплингу).
  4. Локальный компьютер принимает сжатый XPS-документ, распаковывает его и отправляет на принтер этикеток. В результате тонкие черные полосы и белые промежутки штрихкода сливаются, границы размываются, а сканер не может распознать закодированную последовательность.

Решение А: Подключение принтера «по старинке» в обход Easy Print

Чтобы исключить влияние сжатия графики RDP, мы можем настроить прямую печать на сетевой принтер клиента, минуя механизм перенаправления принтеров Easy Print. Выполним следующие шаги:

  1. На локальном компьютере (клиенте), где физически подключен принтер этикеток через USB, откройте раздел «Устройства и принтеры».
  2. Откройте свойства принтера, перейдите на вкладку «Доступ», установите галочку «Общий доступ к данному принтеру» и задайте сетевое имя без пробелов (например, Xprinter).
  3. На терминальном сервере добавьте этот принтер как локальное сетевое устройство. Для этого в мастере установки принтеров выберите «Добавить локальный или сетевой принтер с параметрами, заданными вручную».
  4. Создайте новый порт типа Local Port и в качестве имени порта введите сетевой путь к принтеру в формате: \\Имя_Клиентского_ПК\Xprinter.
  5. Установите на сервер оригинальный драйвер принтера (например, специализированный пакет Seagull Scientific для Xprinter).

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

Решение Б: Отключение Easy Print через групповые политики (GPO)

Если у вас нет возможности расшаривать принтеры по сети, можно заставить терминальный сервер отправлять данные напрямую на оригинальный драйвер клиента без XPS-конвертации. Для этого выполним настройку групповой политики:

  1. На сервере откройте редактор локальной групповой политики (команда gpedit.msc).
  2. Перейдите по пути: Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Перенаправление принтеров.
  3. Найдите параметр «Использовать в первую очередь драйвер принтера Easy Print» и переведите его в состояние «Отключено».
  4. Установите идентичные версии драйверов принтера этикеток (например, Seagull) как на клиентском ПК, так и на сервере. Теперь печать будет идти через «родной» драйвер напрямую.

Причина 2: Физика термопечати и калибровка драйвера

Обычный лазерный принтер имеет разрешение печати 600 или 1200 DPI (точек на дюйм), благодаря чему он легко прорисовывает тончайшие линии. Бюджетные термопринтеры этикеток начального уровня (такие как Xprinter-350B, TSC, начальные модели Zebra) работают с физическим разрешением всего 203 DPI (примерно 8 точек на миллиметр).

Поскольку термопринтер печатает путем нагрева термоголовкой специальной термочувствительной бумаги, физика процесса накладывает жесткие ограничения:

Проанализируем необходимые настройки в свойствах принтера (вкладка «Настройка печати» / «Параметры страницы» в драйвере Seagull):

  1. Режим полутонов (Dither / Дизеринг): По умолчанию драйвер может пытаться имитировать градиенты серого цвета с помощью мелких точек. Для штрихкодов это губительно. Обязательно установите этот параметр в значение «Нет» (None) или «Порог» (Line Art / Черно-белое). Штрихкод должен состоять исключительно из глубокого черного и чистого белого цветов.
  2. Интенсивность нагрева (Darkness / Температура): Снижайте этот параметр экспериментально. Начните с минимальных значений (например, 2 или 4) и постепенно увеличивайте до тех пор, пока штрихкод не станет отчетливо черным, но без малейшего расширения линий.
  3. Скорость печати (Print Speed): Установите минимально возможную скорость печати (например, 50.8 мм/сек или 2.0 дюйма/сек). Это даст термоголовке время на качественное остывание между штрихами.
  4. Ориентация штрихкода: Располагайте штрихкод на этикетке так, чтобы его линии шли по ходу движения ленты (вертикально). При поперечном расположении линий инерция нагрева термоголовки гарантированно приведет к смазыванию границ штрихов.

Причина 3: Несоответствие физической сетке пикселей (Grid Fitting)

Вернемся к физическому разрешению 203 DPI. При 8 точках на миллиметр ширина одной физической точки принтера составляет ровно 0.125 мм. Штрихкод состоит из чередующихся линий разной ширины, где каждый штрих должен быть кратен базовому модулю.

Если в макете 1С вы произвольно растянули объект штрихкода мышкой «за угол», его линии могут потребовать, например, 1.4 или 2.6 физических точек принтера для вывода. Драйвер принтера будет вынужден округлять эти значения на лету: одну полосу он напечатает шириной в 1 точку, а следующую такую же — в 2 точки. Математические пропорции штрихкода будут безвозвратно нарушены, и сканер не сможет декодировать информацию.

Правило разработки макетов: Избегайте произвольного масштабирования картинок штрихкода в табличных документах 1С. Размеры штрихкода (высота, ширина, размер шрифта) должны подбираться строго дискретно. Для ActiveBarcode подбирайте размер шрифта и свойства границ экспериментально (например, как указано в Сообщении 11, используя свойства Borderwidth - 0 и Borderheight - 0).

Причина 4: Использование специализированных шрифтов (EAN13.ttf, Code39.ttf)

Превосходной альтернативой использованию нестабильных ActiveX-компонент (таких как barcode.ocx) является вывод штрихкодов с помощью векторных TrueType-шрифтов. Векторные шрифты рендерятся операционной системой с максимальным качеством под физическое разрешение конкретного принтера и не подвергаются жесткому сжатию при передаче по RDP.

Разберем по шагам, как реализовать этот подход в 1С:

  1. Установите в операционную систему сервера и клиентов шрифт штрихкода (например, файл EAN13.ttf или Code39.ttf).
  2. В ячейке табличного документа 1С укажите установленный шрифт штрихкода и задайте ему достаточный размер (например, от 18 до 26 пунктов).
  3. Поскольку шрифт просто заменяет обычные символы на штрихи, мы не можем просто вывести туда строку "4820017662154". Нам необходимо программно рассчитать контрольный символ, а также перевести цифры в специальные стартовые, промежуточные и стоповые символы шрифта согласно спецификации EAN-13.

Рассмотрим пример функции на встроенном языке 1С 7.7 для преобразования строки штрихкода в последовательность символов для шрифта штрихкода:


// Пример функции подготовки строки для вывода шрифтом штрихкода
Функция СформироватьСтрокуДляШрифта(ИсходныйШК) Экспорт
    // Алгоритм преобразует цифровой код в символы шрифта.
    // Например, для штрихкода EAN-13 "4820017662154"
    // на выходе мы должны получить строку вида "C22154251550<;00065032542548@"
    // где каждый символ отвечает за конкретную комбинацию штрихов и разделителей.
    
    Перем Результат, СимволРазделителя;
    
    // Выполняем математический расчет контрольного числа и конвертацию символов...
    // [Здесь размещается ваш алгоритм преобразования согласно спецификации шрифта]
    
    Результат = ПреобразоватьПоСпецификацииШрифта(ИсходныйШК);
    Возврат Результат;
КонецФункции

В макете этикетки для ячейки со штрихкодом мы прописываем выражение: СформироватьСтрокуДляШрифта(ТекущийШК). На печать уходит чистый векторный текст, который идеально считывается любым сканером даже при печати на дешевом оборудовании.

Причина 5: Прямая печать командами принтера (TSPL/ZPL)

Самым надежным, быстрым и профессиональным методом работы с принтерами этикеток является прямая отправка текстовых команд разметки в порт устройства в обход графической системы 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

Проанализируем ключевые команды этого кода:

Этот файл отправляется напрямую в порт принтера (например, LPT, USB или сетевой путь \\localhost\Xprinter). Скорость печати при таком подходе мгновенная, а качество штрихкода всегда остается безупречным и легко считывается сканером с первого раза.

← На главную