Как масштабировать штрихкод в 1С без потери качества и сформировать его в векторном формате?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При печати этикеток и документов небольшого размера разработчики часто сталкиваются с проблемой нечитаемости штрихкодов сканерами. При уменьшении стандартного штрихкода из Библиотеки подключаемого оборудования (БПО) или при изменении масштаба документа линии смазываются, сливаются и теряют четкие границы. Разберем причины такого поведения платформы и рассмотрим практические способы получения качественного векторного или точно рассчитанного растрового штрихкода.

Почему стандартный штрихкод БПО теряет читаемость при масштабировании

Проанализируем механизм работы стандартной компоненты генерации штрихкодов:

  1. Растровый формат генерации. Компонента 1С формирует растровую картинку в формате PNG с фиксированным разрешением. Когда табличный документ выводится на печать с масштабированием или помещается в рамку с автоподгонкой, драйвер печати выполняет интерполяцию (сглаживание). Четкие черные и белые штрихи превращаются в градиентные серые полосы, из-за чего оптический сканер не может распознать точную толщину линий.
  2. Влияние прозрачности фона. По умолчанию в компоненте БПО может быть включено свойство ПрозрачныйФон = Истина. При выводе на термопринтер или монохромный лазерный принтер полупрозрачные пиксели передаются через дизеринг (растровую сетку из точек), что окончательно разрушает геометрию штрихов.

Способ 1. Тонкая настройка штатной компоненты 1С и расчет под DPI принтера

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

  1. Отключим прозрачность фона, установив параметр ПрозрачныйФон = Ложь. Фон должен быть строго белым, а штрихи — абсолютно черными.
  2. Рассчитаем размер штрихкода в пикселях строго под физическое разрешение целевого принтера (например, 203 DPI для большинства термопринтеров или 300/600 DPI для офисных устройств). Переведем миллиметры макета в точки принтера без дробных остатков.
  3. В свойствах ячейки или рисунка табличного документа установим параметр РазмерКартинки = РеальныйРазмер вместо пропорционального масштабирования.
  4. Для поворота штрихкода используем встроенное свойство компоненты УголПоворота, передавая значения 0, 90, 180 или 270 градусов, чтобы исключить искажения при программной трансформации картинки.

Способ 2. Генерация векторных SVG-штрихкодов с помощью утилиты Zint

Если требуется абсолютная независимость от масштабирования документа пользователем, перейдем на векторный формат SVG, который платформа 1С:Предприятие 8.3 поддерживает нативно. Для генерации векторных изображений отлично подходит консольная утилита Zint Barcode Generator.

Рассмотрим запуск утилиты из командной строки для получения векторного файла SVG:


КомандаЗапуска = "zint.exe -b 60 -d ""4601234567890"" -o ""C:\Temp\barcode.svg""";
ЗапуститьПриложение(КомандаЗапуска, , Истина);

В параметре -b указывается тип штрихкода (например, 60 для Code 128 или 34 для EAN-13), а в -o задается выходной файл с расширением .svg.

Разберем особенности ориентации SVG при работе с утилитой:

  1. Параметр утилиты --rotate= поддерживает значения 0, 90, 180, 270, однако для векторного вывода в некоторых версиях поворот требуется задавать на уровне разметки SVG.
  2. Для поворота полученного SVG-файла программно в 1С достаточно считать его как текстовый документ и добавить трансформацию в корневой узел или поменять местами атрибуты ширины и высоты (width и height), добавив атрибут transform="rotate(90)":

ТекстSVG = Новый ТекстовыйДокумент;
ТекстSVG.Прочитать("C:\Temp\barcode.svg", КодировкаТекста.UTF8);
Содержимое = ТекстSVG.ПолучитьТекст();
Содержимое = СтрЗаменить(Содержимое, "<svg ", "<svg transform=""rotate(90)"" ");
ТекстSVG.УстановитьТекст(Содержимое);
ТекстSVG.Записать("C:\Temp\barcode_rotated.svg", КодировкаТекста.UTF8);

Способ 3. Формирование SVG-разметки штрихкода на чистом BSL

Линейный штрихкод представляет собой чередование черных и белых полос фиксированной относительной ширины. Мы можем сформировать SVG-файл напрямую кодом 1С без вызова внешних исполняемых файлов:

  1. Рассчитаем битовую маску штрихкода (последовательность нулей и единиц) по алгоритму выбранного стандарта (например, Code 128 или EAN-13).
  2. Сформируем текстовую XML-структуру SVG, где каждая черная полоса описывается тегом <rect> с соответствующими координатами x, y, шириной width и высотой height.
  3. Загрузим полученный текст SVG в объект Картинка и поместим в табличный документ:

ДвоичныеДанныеSVG = ПолучитьДвоичныеДанныеИзСтроки(ТекстSVGXML, КодировкаТекста.UTF8);
ВекторныйШтрихкод = Новый Картинка(ДвоичныеДанныеSVG);

Такой штрихкод сохраняет математическую точность линий при любом коэффициенте масштабирования и изменении размера ячейки.

Способ 4. Использование специализированных шрифтов (TrueType Barcode Fonts)

Еще один надежный способ добиться идеальной векторной четкости — вывод штрихкода через шрифт (например, Code 128, EAN-13 или Code 39):

  1. Установим соответствующий TrueType-шрифт в операционную систему на сервере и рабочих станциях.
  2. Преобразуем исходную строку данных с помощью алгоритма кодирования (расчет контрольного символа, добавление стартовых и стоповых символов).
  3. Выведем полученную закодированную строку в обычную ячейку табличного документа с назначенным шрифтом штрихкода.
  4. Для поворота текста используем стандартное свойство ячейки табличного документа Ориентация, выбрав значение 90, 180 или 270 градусов.

Способ 5. Прямая отправка команд на принтер этикеток (ZPL, TSPL)

Если печать выполняется на специализированных принтерах этикеток (Zebra, TSC, Godex), наиболее стабильным решением является отказ от графической печати в пользу отправки команд на нативном языке принтера (ZPL или TSPL). В этом случае микроконтроллер принтера самостоятельно строит штрихкод с физической привязкой к нагревательным элементам термоголовки, что полностью исключает размытие и проблемы с масштабированием.

← На главную