При реализации требований заказчика к маркировке документов и товаров нередко возникает задача размещения дополнительной текстовой информации (например, реквизитов контрагента или параметров заказа) внутри двумерного штрихкода PDF417. Однако при использовании стандартных механизмов и компонент 1С разработчики часто сталкиваются с двумя проблемами: некорректным отображением кириллических символов и нежелательной вытянутой («акцизной») формой результирующего штрихкода вместо компактного прямоугольника или квадрата.
Проанализируем причины такого поведения, разберем по шагам правильное кодирование кириллицы и способы управления геометрией штрихкода в 1С.
Штрихкод 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 колонки) и размещать весь объем информации в виде множества горизонтальных строк. В результате штрихкод приобретает вид длинной узкой полосы, аналогичной акцизной марке.
Для получения более пропорционального («квадратного») вида штрихкода рассмотрим следующие подходы:
Ширина и Высота. Важно контролировать флаги масштабирования и сохранения пропорций, чтобы компонента равномерно распределяла сетку колонок и строк по заданной области.Даже если штрихкод сформирован корректно, при считывании кириллицы сканером могут возникнуть проблемы с отображением символов («крякозябры»). Выясним причину этой проблемы:
Большинство 2D-сканеров «из коробки» работают в режиме эмуляции клавиатуры (HID Keyboard). При декодировании байтового режима UTF-8 сканер пытается передать полученные байты как нажатия клавиш клавиатуры, что приводит к искажению русских символов из-за несоответствия текущей раскладки Windows или отсутствия поддержки передачи через системные Alt-коды.
Для корректного считывания штрихкодов с кириллицей выполним следующие действия:
USB-COM / CDC Virtual COM) с помощью сервисных настроечных штрихкодов из руководства к сканеру.Если возможностей встроенной компоненты 1С недостаточно для гибкого управления геометрией PDF417 (например, требуется жестко зафиксировать точное количество колонок данных от 4 до 8), рассмотрим альтернативные варианты генерации:
ЗапуститьПриложение() с явным указанием типа кода, количества колонок, уровня коррекции и пути сохранения результирующего PNG-файла. Полученный файл картинки затем загружается в табличный документ через объект Картинка.