Как сформировать и напечатать штрихкод PDF417 с поддержкой русских букв в 1С?

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

При реализации требований заказчика к маркировке документов и товаров нередко возникает задача размещения дополнительной текстовой информации (например, реквизитов контрагента или параметров заказа) внутри двумерного штрихкода PDF417. Однако при использовании стандартных механизмов и компонент 1С разработчики часто сталкиваются с двумя проблемами: некорректным отображением кириллических символов и нежелательной вытянутой («акцизной») формой результирующего штрихкода вместо компактного прямоугольника или квадрата.

Проанализируем причины такого поведения, разберем по шагам правильное кодирование кириллицы и способы управления геометрией штрихкода в 1С.

Особенности кодирования кириллицы в стандарте PDF417

Штрихкод PDF417 поддерживает несколько режимов уплотнения данных: текстовый, числовой и байтовый. В стандартном текстовом режиме кодируются только символы ASCII. Для записи русских букв генератор обязан переключаться в байтовый режим уплотнения (Byte Compaction Mode).

В ранних версиях компоненты генерации штрихкодов от 1С присутствовала ошибка (зарегистрированная под номером 30006371), из-за которой строки с кириллицей формировались некорректно. В обновленных версиях компоненты и Библиотеки подключаемого оборудования (БПО) ошибка была исправлена: кириллические символы записываются в байтовом режиме в кодировке UTF-8. При этом каждый русский символ занимает по 2 байта, что увеличивает объем данных и плотность штрихкода по сравнению с латиницей.

Для гарантированной передачи данных без искажений при вызове внешней Native-компоненты рекомендуется использовать режим передачи через Base64. Разберем пример подготовки строки на встроенном языке 1С:


// Подготовка строки с кириллицей для передачи в компоненту
ТекстШтрихкода = "Заказ: 12345; Контрагент: ООО Тест";

// Получаем двоичные данные в кодировке UTF-8
ДвоичныеДанныеТекста = ПолучитьДвоичныеДанныеИзСтроки(ТекстШтрихкода, КодировкаТекста.UTF8, Ложь);

// Преобразуем в строку Base64 для безопасной передачи в генератор
СтрокаBase64 = Base64Строка(ДвоичныеДанныеТекста);

При формировании параметров генерации штрихкода через БПО необходимо указать тип входных данных как Base64 (параметр ТипВходныхДанных = 1), что исключит нежелательные преобразования кодовых страниц внутри компоненты.

Почему штрихкод формируется в виде узкой ленты («акциза»)?

Штрихкод PDF417 представляет собой матрицу, состоящую из вертикальных колонок данных и горизонтальных строк. По умолчанию стандартная компонента 1С может вычислять минимально допустимое количество колонок данных (например, 1 или 2 колонки) и размещать весь объем информации в виде множества горизонтальных строк. В результате штрихкод приобретает вид длинной узкой полосы, аналогичной акцизной марке.

Для получения более пропорционального («квадратного») вида штрихкода рассмотрим следующие подходы:

  1. Управление параметрами области вывода в табличном документе: при формировании ячейки или рисунка в табличном документе задаются параметры Ширина и Высота. Важно контролировать флаги масштабирования и сохранения пропорций, чтобы компонента равномерно распределяла сетку колонок и строк по заданной области.
  2. Настройка уровня коррекции ошибок (Error Correction Level): увеличение уровня коррекции ошибок (от 0 до 8) добавляет дополнительные контрольные кодовые слова, что позволяет распределить данные по большему числу колонок и сделать геометрию более сбалансированной.

Настройка сканера для считывания кириллицы из PDF417

Даже если штрихкод сформирован корректно, при считывании кириллицы сканером могут возникнуть проблемы с отображением символов («крякозябры»). Выясним причину этой проблемы:

Большинство 2D-сканеров «из коробки» работают в режиме эмуляции клавиатуры (HID Keyboard). При декодировании байтового режима UTF-8 сканер пытается передать полученные байты как нажатия клавиш клавиатуры, что приводит к искажению русских символов из-за несоответствия текущей раскладки Windows или отсутствия поддержки передачи через системные Alt-коды.

Для корректного считывания штрихкодов с кириллицей выполним следующие действия:

  1. Переведем 2D-сканер в режим эмуляции виртуального COM-порта (USB-COM / CDC Virtual COM) с помощью сервисных настроечных штрихкодов из руководства к сканеру.
  2. В конфигурации 1С подключим сканер через стандартный драйвер «1С:Сканеры штрихкода» (в составе БПО). В режиме COM-порта драйвер получает исходный массив байтов напрямую, корректно преобразуя кодировку UTF-8 в строку 1С без влияния языковой раскладки операционной системы.

Альтернативные способы формирования штрихкода

Если возможностей встроенной компоненты 1С недостаточно для гибкого управления геометрией PDF417 (например, требуется жестко зафиксировать точное количество колонок данных от 4 до 8), рассмотрим альтернативные варианты генерации:

  1. Использование консольной утилиты Zint: бесплатный генератор штрихкодов запускается из 1С через команду ЗапуститьПриложение() с явным указанием типа кода, количества колонок, уровня коррекции и пути сохранения результирующего PNG-файла. Полученный файл картинки затем загружается в табличный документ через объект Картинка.
  2. Генерация через внешние библиотеки или сборки: подключение библиотек на базе ZXing через COM-соединение или внешние компоненты, позволяющие напрямую управлять параметрами геометрии (соотношением сторон и числом колонок).
  3. Использование QR-кода: если формат штрихкода жестко не регламентирован отраслевыми стандартами, имеет смысл согласовать с заказчиком замену PDF417 на QR-код. QR-код изначально имеет квадратную форму, нативно поддерживает UTF-8 и обрабатывается большинством сканеров и мобильных устройств без дополнительных геометрических настроек.
← На главную