При интеграции торгового оборудования, в частности фискальных регистраторов компании «Штрих-М», разработчики часто сталкиваются с проблемой некорректного отображения QR-кодов. Типичная ситуация: код печатается, но выглядит «сплющенным» по вертикали или горизонтали, из-за чего сканеры и мобильные приложения не могут его распознать. В этой статье мы подробно разберем, почему это происходит и как правильно реализовать печать произвольного QR-кода, используя возможности драйвера DrvFR.
Рассмотрим стандартную ошибку, которую совершают многие программисты при попытке вывести 2D-код. Изначально для печати штрихкодов в драйверах «Штрих-М» использовался метод PrintBarcodeGraph(). Давайте проанализируем фрагмент кода, который приводит к некорректному результату:
FR.BarCode = "Проверка печати кода 123456789";
FR.BarcodeType = 3;
FR.BarWidth = 1;
FR.LineNumber = 130;
FR.PrintBarcodeText = 0;
FR.BarcodeAlignment = 0;
FR.Password = 30;
FR.PrintBarcodeGraph();
Выясним причину, по которой этот код выдает «сплющенную» картинку. Метод PrintBarcodeGraph() предназначен в первую очередь для линейных (одномерных) штрихкодов. При работе с ним драйвер пытается интерпретировать переданные данные как графический объект, основываясь на параметрах высоты строки и ширины модуля. Однако для QR-кода крайне важна строгая пропорция сторон (квадрат). Если прошивка ККТ или настройки драйвера имеют предустановленные значения высоты линии, которые не соответствуют ширине точки, изображение неизбежно искажается. Использование параметра BarWidth в данном контексте часто игнорируется или работает нелинейно, что и приводит к визуальному дефекту.
Для корректной работы с двумерными кодами (QR, PDF417 и др.) в современных версиях драйвера DrvFR (начиная с 4.13 и выше) реализован специализированный метод Print2DBarcode(). В отличие от графического вывода, этот метод передает текстовую строку непосредственно в процессор фискального регистратора, который сам формирует код согласно спецификации QR-стандарта. Это гарантирует идеальные пропорции и высокую читаемость.
Разберем по шагам, какие свойства объекта драйвера необходимо настроить перед вызовом этой команды:
30).2.3 или 4.Посмотрим на пример правильной реализации:
// Устанавливаем пароль для доступа к ФР
FR.Password = 30;
// Указываем тип кода (2 соответствует QR-коду)
FR.BarcodeType = 2;
// Текст, который будет зашифрован
FR.BarCode = "https://example.com/check/12345";
// Устанавливаем размер модуля (чтобы код был крупным и читаемым)
FR.BarSize = 3;
// Выравниваем по центру для эстетичного вида чека
FR.BarcodeAlignment = 1;
// Вызываем специализированный метод печати 2D-кода
FR.Print2DBarcode();
Проанализируем ситуацию, если метод Print2DBarcode() все равно не выдает ожидаемый результат или возвращает ошибку. Существует несколько технических нюансов, которые необходимо проверить:
1. Версия прошивки ККТ. Если при вызове метода устройство выдает ошибку «Команда не поддерживается в данной реализации», это означает, что прошивка вашего фискального регистратора устарела. Поддержка формирования QR-кодов на уровне «железа» стала обязательной с введением 54-ФЗ, поэтому на старых аппаратах (до 2016-2017 годов выпуска) может потребоваться обновление внутреннего ПО (прошивка центрального процессора).
2. Версия драйвера DrvFR. Убедитесь, что в системе зарегистрирована актуальная версия COM-объекта. Мы рекомендуем использовать версию не ниже 4.14. В старых версиях (например, 4.6 или 4.9) свойства для работы с 2D-кодами могли называться иначе или отсутствовать вовсе.
3. Состояние чека. Помните, что печать произвольного QR-кода обычно выполняется либо в открытом документе (текстовом чеке), либо вне рамок чека. Если вы пытаетесь напечатать код в момент, когда фискальный чек уже закрыт, но бумага еще не отрезана, убедитесь, что вы не нарушаете логику работы ФН (фискального накопителя).
В некоторых случаях нам может потребоваться более тонкая настройка. Для этого в драйвере существуют параметры BarcodeParameter1, BarcodeParameter2 и так далее. Для QR-кодов они обычно отвечают за:
В большинстве стандартных задач (например, печать ссылки на маркетинговую акцию) эти параметры можно оставлять равными 0, так как драйвер и прошивка автоматически подберут оптимальные значения исходя из длины строки.
Проанализировав вышеизложенное, мы видим, что проблема «сплющивания» — это следствие использования устаревшего графического метода. Переход на Print2DBarcode полностью устраняет геометрические искажения и делает код пригодным для сканирования любыми устройствами.