Как реализовать печать QR-кода на фискальных регистраторах Штрих-М из 1С?

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

При автоматизации торговых точек часто возникает необходимость вывода графической информации на чековую ленту. Это может быть как обязательный QR-код чека по 54-ФЗ, так и произвольный маркетинговый QR-код в рекламном поле (например, ссылка на сайт, купон на скидку или участие в программе лояльности). В этой статье мы подробно рассмотрим, как правильно сформировать XML-пакет для печати QR-кода через интеграционную компоненту 1С, как настроить таблицы самого фискального регистратора (ККТ) и как избежать типичных ошибок с кодировкой символов.

Способ 1. Печать QR-кода через XML-пакет (Стандарт Требований 1С)

Современные конфигурации 1С взаимодействуют с торговым оборудованием посредством XML-пакетов. Если вы используете сертифицированный драйвер (например, компоненту SMDrvFR1CLib20.dll с идентификатором AddIn.SMDrvFR1C20), ККТ ожидает готовую XML-структуру документа.

Для вывода QR-кода в XML-пакете используется узел Barcode. Основная ошибка разработчиков заключается в передаче числовых кодов типов штрихкодов из старых инструкций к драйверу. В стандарте 1С для вывода QR-кода достаточно передать текстовое значение "QR" в атрибут типа штрихкода.

Проанализируем пример кода на языке 1С, формирующего XML-документ для печати чека с произвольным QR-кодом:


// Создаем объект записи XML для формирования структуры чека
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();

ЗаписьXML.ЗаписатьНачалоЭлемента("Document");
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions");

// Выводим произвольный рекламный текст перед кодом
ЗаписьXML.ЗаписатьНачалоЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "АКЦИЯ! Сканируйте для скидки:");
ЗаписьXML.ЗаписатьКонецЭлемента();

// Формируем узел штрихкода. 
// КРИТИЧЕСКИ ВАЖНО: для BarcodeType указываем строковое значение "QR"
ЗаписьXML.ЗаписатьНачалоЭлемента("Barcode");
ЗаписьXML.ЗаписатьАтрибут("BarcodeType", "QR");
ЗаписьXML.ЗаписатьАтрибут("Barcode", "https://www.example.com/promo2026");
ЗаписьXML.ЗаписатьКонецЭлемента();

ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем узел Positions
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем узел Document

// Получаем готовый XML-текст для отправки в драйвер
XMLПакет = ЗаписьXML.Закрыть();

После формирования этого пакета он передается стандартному методу БСП или интеграционной компоненты кассы. Драйвер самостоятельно распознает тип QR, переведет текстовую строку в графическую матрицу и отправит команду на термоголовку принтера.

Способ 2. Прямая печать через COM-объект драйвера (для старых систем)

Выясним, как поступить, если ваша конфигурация написана на обычных формах (например, старая "Управление торговлей 10.3") или использует прямое COM-подключение к драйверу DrvFR.dll (идентификатор AddIn.DrvFR). В этом случае XML-пакеты не используются, а управление происходит через свойства и методы COM-объекта.

Рассмотрим по шагам программную печать QR-кода через низкоуровневые команды драйвера:


// Инициализируем COM-объект драйвера Штрих-М
Попытка
    ФР = Новый COMОбъект("AddIn.DRVFR");
Исключение
    ВызватьИсключение "Не удалось подключить драйвер Штрих-М. Проверьте регистрацию DLL в системе.";
КонецПопытки;

// Задаем параметры связи и авторизуемся под паролем системного администратора (по умолчанию - 30)
ФР.Password = 30;

// Устанавливаем свойства штрихкода
// Значение "3" в свойстве BarcodeType для ККТ Штрих-М определяет тип QR-кода
ФР.BarcodeType = 3; 
ФР.BarCode = "https://www.example.com/promo2026";
ФР.LineNumber = 120; // Высота штрихкода в точках (размер матрицы на чеке)
ФР.FirstLineNumber = 0; 
ФР.PrintBarcodeText = 0; // 0 - не печатать текстовое представление под кодом

// Вызываем метод печати графического штрихкода
ФР.PrintBarcodeGraph();

Обратите внимание, что метод PrintBarcodeGraph() используется для старых моделей аппаратов. Современные онлайн-кассы также поддерживают метод PrintBarcodeUsingPrinter(), который задействует встроенные вычислительные мощности принтера ККТ для более быстрой генерации изображения.

Решение проблемы с кодировкой кириллицы (UTF-8)

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

Выясним причину этой проблемы. По умолчанию операционная система Windows передает в драйвер ККТ текстовые строки в кодировке Windows-1251 (CP1251). Мобильные сканеры и алгоритмы распознавания QR-кодов по умолчанию ожидают кодировку UTF-8.

Чтобы решить эту проблему, необходимо настроить внутренние таблицы самого фискального регистратора. Сделать это можно через утилиту «Тест драйвера ФР»:

  1. Запустите «Тест драйвера ФР» и выполните подключение к вашей кассе.
  2. Перейдите в раздел «Настройка свойств» -> «Таблицы».
  3. Найдите и откройте Таблицу № 11 «Параметры кодирования QR-кодов».
  4. Обратите внимание на Ряд 1, Поле 1 («Кодировать текст в UTF-8»). Установите значение этого поля равным 1.
  5. Сохраните изменения в таблице ККТ.

При включении этого параметра процессор кассы будет автоматически перекодировать получаемую от 1С строку Windows-1251 в стандарт UTF-8 непосредственно перед формированием графического изображения QR-кода. После этого любые мобильные устройства будут корректно считывать кириллический текст.

Настройка размера и избыточности QR-кода на чеке

Если вам требуется изменить физический размер напечатанного QR-кода (сделать его крупнее для надежного считывания или, наоборот, компактнее для экономии чековой ленты), регулировать это параметрами из кода 1С не всегда эффективно. Надежнее использовать аппаратные настройки кассы в той же Таблице № 11:

Устранение ошибки «Тип штрихкода не поддерживается» (FFFFFFF8h)

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

В такой ситуации у вас есть два пути решения проблемы:

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

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

← На главную