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

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

Мы часто сталкиваемся с задачами маркировки документов или товаров, где требуется использование двумерных штрихкодов. Если с QR-кодами большинство разработчиков уже набило руку, то стандарт PDF417 (часто используемый в алкогольной декларации, на билетах или в логистике) имеет свои специфические особенности. В этой статье мы подробно разберем ситуацию, когда визуально штрихкод формируется, но сканеры и терминалы сбора данных отказываются его считывать.

Давайте проанализируем типовую проблему: мы используем стандартную компоненту генерации штрихкода, задаем тип PDF417, выводим результат в табличный документ, но на выходе получаем "мертвую" картинку. Разберем по шагам, какие подводные камни существуют в этом процессе и как их обойти.

Анализ исходного кода и типичные ошибки

Для начала посмотрим на стандартный код, который обычно используется для генерации. Мы обращаемся к типовому механизму (часто это подсистема БСП или встроенная компонента):


ШиринаРисунка = ОбластьМакета.Рисунки.QRКодНомерПоДаннымКлиента.Ширина;
ВысотаРисунка = ОбластьМакета.Рисунки.QRКодНомерПоДаннымКлиента.Высота;

ПараметрыШтрихкода.Ширина = ШиринаРисунка;
ПараметрыШтрихкода.Высота = ВысотаРисунка;
ПараметрыШтрихкода.ТипКода = 6; // 6 соответствует PDF417
ПараметрыШтрихкода.Штрихкод = ШтрихКод;
ПараметрыШтрихкода.ПрозрачныйФон = Истина; // Часто здесь кроется проблема

РезультатОперации = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);

На первый взгляд, все логично: мы берем размеры из макета и передаем их в генератор. Однако именно в этом месте мы совершаем первую и самую главную ошибку, связанную с природой PDF417.

Проблема 1: Масштабирование и "размытие" (Aliasing)

Давайте разберемся, что такое PDF417. Это стековый (многорядный) линейный штрихкод. В отличие от QR-кода, который состоит из крупных квадратных модулей, PDF417 состоит из очень тонких вертикальных штрихов, сгруппированных в ряды.

Когда мы жестко задаем ширину и высоту генерации равной ширине и высоте рисунка в макете, а затем в свойствах рисунка в табличном документе (в конфигураторе) стоит свойство "Размер картинки" — "Реальный размер" или "Растянуть", происходит следующее:

  1. Компонента генерирует растровое изображение определенного разрешения.
  2. Платформа 1С пытается вписать это изображение в заданную область ячеек.
  3. Если пиксельная сетка картинки не совпадает идеально с физическим разрешением принтера или экрана, происходит интерполяция.

Для PDF417 это критично. Границы тонких штрихов становятся "серыми" и размытыми. Сканер, работающий по принципу контраста "черное-белое", не может распознать ширину штриха.

Решение:

В свойствах рисунка в макете табличного документа обязательно установите режим "Пропорционально". Это предотвратит искажение пропорций штрихов. Кроме того, рекомендуется генерировать картинку с заведомо большим разрешением (DPI), чем область печати, чтобы при уменьшении детализация сохранялась, а не терялась.

Проблема 2: Соотношение сторон (Aspect Ratio)

Мы часто забываем, что PDF417 — это очень гибкий стандарт. Одни и те же данные можно закодировать в высокий и узкий прямоугольник или в низкий и широкий. Это регулируется количеством столбцов данных (Data Columns) и рядов.

Компонента 1С при отсутствии явных указаний пытается подобрать "оптимальное" соотношение сторон (часто стремясь к пропорции 4:3 или близкой к квадрату). В то же время, онлайн-сервисы генерации часто делают код вытянутым по горизонтали.

Почему это важно?

Если код получается слишком "плотным" (много рядов, мало столбцов) или наоборот, слишком широким, сканер может физически не охватить его лучом или полем зрения камеры. Если вы видите, что онлайн-генератор создает более "широкий" код, который читается, значит, вашему оборудованию легче работать именно с такой геометрией.

Мы рекомендуем экспериментировать с параметрами ширины и высоты, передаваемыми в функцию ИзображениеШтрихкода. Попробуйте задать ширину в 2-3 раза больше высоты, чтобы принудить компоненту сформировать меньше рядов.

Проблема 3: Прозрачный фон и "Тихие зоны"

В коде примера мы видим:

ПараметрыШтрихкода.ПрозрачныйФон = Истина;

Это опасная настройка для плотных штрихкодов. Стандарт ISO/IEC для штрихкодов требует наличия так называемых Quiet Zones — белых пустых полей вокруг самого кода.

Если фон прозрачный, а в макете 1С рядом с рисунком есть границы ячеек, текст или цветная заливка, сканер не сможет определить, где начинается и где заканчивается код.

Решение:

Всегда используйте ПараметрыШтрихкода.ПрозрачныйФон = Ложь (или явно задавайте белый цвет фона). Убедитесь, что вокруг штрихкода в макете есть отступ хотя бы в 2-3 мм.

Проблема 4: Уровень коррекции ошибок (ECC)

В обсуждении была затронута важная тема коррекции ошибок. PDF417 использует алгоритм Рида-Соломона. Это позволяет восстановить данные, даже если часть этикетки повреждена.

Однако здесь есть нюанс в параметрах 1С. Для QR-кода параметр УровеньКоррекции принимает значения от 0 до 3 (L, M, Q, H). Для PDF417 шкала другая — от 0 до 8.

Обычно компонента 1С в автоматическом режиме выбирает уровень от 2 до 5 в зависимости от объема данных. Если вы вручную передаете параметры, убедитесь, что вы не завышаете требования к коррекции без необходимости.

Проблема 5: Кодировка данных (Compaction Mode)

Обратим внимание на тип данных. Автор кодирует строку цифр: 1234567890....

PDF417 имеет три основных режима уплотнения:

  1. Text — для букв и цифр.
  2. Numeric — только для цифр (самый компактный).
  3. Byte/Binary — для любых данных, включая кириллицу (самый объемный).

Если мы передаем данные как простую строку, и в системе (или компоненте) по умолчанию стоит кодировка UTF-8 или Windows-1251, генератор может использовать Binary режим, чтобы гарантировать сохранность данных. Это делает код физически больше и сложнее для чтения.

Сторонние сервисы часто "умнее" и автоматически переключаются в режим Numeric, если видят только цифры. В 1С это не всегда происходит автоматически. Если ваш штрихкод содержит только цифры, попробуйте проверить настройки компоненты (если используете внешнюю) или убедитесь, что данные передаются именно как строка ASCII, без лишних спецсимволов.

Диагностика и отладка

Как понять, что именно пошло не так? Мы рекомендуем следующий алгоритм действий, предложенный в обсуждении:

Шаг 1. Исключите влияние макета.

Вместо вывода в табличный документ, сохраните полученные двоичные данные в файл на диск.


РезультатОперации = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);
Если РезультатОперации.Свойство("ДвоичныеДанные", ДанныеQRКода) Тогда
    Картинка = Новый Картинка(ДанныеQRКода);
    Картинка.Записать("C:\Temp\test_barcode.png");
КонецЕсли;

Откройте этот файл в просмотрщике изображений и попробуйте отсканировать его с экрана монитора. Если читается — проблема исключительно в масштабировании внутри макета 1С (см. Проблему 1).

Шаг 2. Проверьте содержимое.

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

Шаг 3. Используйте разные сканеры.

Не забывайте, что смартфон — это не профессиональный сканер. Камеры телефонов имеют высокое разрешение, но программное обеспечение может плохо поддерживать PDF417. Проверяйте на том оборудовании, которое будет использоваться в реальной работе (ТСД, ручные 2D-сканеры).

Итоговое резюме

Чтобы PDF417 из 1С читался стабильно, выполните следующие требования:

  1. Установите в макете для картинки свойство "Пропорционально".
  2. Отключите прозрачный фон.
  3. Генерируйте картинку с запасом по разрешению.
  4. Следите за соотношением сторон: если код получается слишком квадратным, принудительно увеличьте ширину в параметрах.
  5. Убедитесь, что вокруг кода есть белые поля ("тихая зона").
← На главную