При автоматизации торговых точек часто возникает необходимость вывода графической информации на чековую ленту. Это может быть как обязательный QR-код чека по 54-ФЗ, так и произвольный маркетинговый QR-код в рекламном поле (например, ссылка на сайт, купон на скидку или участие в программе лояльности). В этой статье мы подробно рассмотрим, как правильно сформировать XML-пакет для печати QR-кода через интеграционную компоненту 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, переведет текстовую строку в графическую матрицу и отправит команду на термоголовку принтера.
Выясним, как поступить, если ваша конфигурация написана на обычных формах (например, старая "Управление торговлей 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(), который задействует встроенные вычислительные мощности принтера ККТ для более быстрой генерации изображения.
Часто программисты сталкиваются со следующей проблемой: QR-код успешно распечатался, но при попытке отсканировать его камерой смартфона (особенно на устройствах под управлением Android) вместо русских букв отображается нечитаемый набор символов ("кракозябры").
Выясним причину этой проблемы. По умолчанию операционная система Windows передает в драйвер ККТ текстовые строки в кодировке Windows-1251 (CP1251). Мобильные сканеры и алгоритмы распознавания QR-кодов по умолчанию ожидают кодировку UTF-8.
Чтобы решить эту проблему, необходимо настроить внутренние таблицы самого фискального регистратора. Сделать это можно через утилиту «Тест драйвера ФР»:
При включении этого параметра процессор кассы будет автоматически перекодировать получаемую от 1С строку Windows-1251 в стандарт UTF-8 непосредственно перед формированием графического изображения QR-кода. После этого любые мобильные устройства будут корректно считывать кириллический текст.
Если вам требуется изменить физический размер напечатанного QR-кода (сделать его крупнее для надежного считывания или, наоборот, компактнее для экономии чековой ленты), регулировать это параметрами из кода 1С не всегда эффективно. Надежнее использовать аппаратные настройки кассы в той же Таблице № 11:
3 до 8 точек термоголовки. Увеличение этого значения пропорционально увеличивает ширину и высоту QR-кода на чеке. Оптимальным для считывания считается значение 4 или 5.0 до 3). Более высокий уровень избыточности делает код более плотным по структуре, но позволяет считать его даже при сильном замятии или разрыве чека.Если при попытке печати касса выдает ошибку FFFFFFF8h ("Ошибка печати штрихкода" или "Тип штрихкода не поддерживается"), это означает, что центральный процессор вашей модели ККТ (например, старых дореформенных аппаратов, модернизированных под онлайн-кассы) на аппаратном уровне не умеет генерировать QR-коды.
В такой ситуации у вас есть два пути решения проблемы:
PrintPrintableImage() или аналогичной командой печати графики.Применяя данные подходы, вы сможете легко интегрировать печать любых QR-кодов в чеки ваших клиентов, обеспечив при этом высокую скорость печати и гарантированное распознавание информации любыми сканирующими устройствами.