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

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

При автоматизации розничной торговли часто возникает необходимость вывода дополнительной информации на чековую ленту фискального регистратора. Это могут быть ссылки на опросы, маркетинговые акции, промокоды или информация программ лояльности, представленная в виде QR-кода. Однако при попытке реализовать эту задачу на старых моделях оборудования «Штрих-М» разработчики сталкиваются с серьезной проблемой: используемые в конфигурациях старые обработки обслуживания (например, ShtrihMFiscalPrinters_v2.epf) работают через компоненту DrvFR1C, функционал которой крайне ограничен и не поддерживает печать двухмерных штрихкодов.

Попытка простой замены программного идентификатора (ProgID) на современный аналог приводит к тому, что система перестает «видеть» устройство, выдавая ошибки инициализации. В этой статье мы подробно разберем, как правильно переписать обработку обслуживания на работу с актуальной компонентой SMDrvFR1C (стандарты 1.7 и 2.0), корректно инициализировать подключение и вывести QR-код на печать двумя альтернативными способами.

В чем разница между DrvFR1C и SMDrvFR1C?

Для понимания сути проблемы проанализируем эволюцию интеграционных стандартов «1С:Библиотека подключаемого оборудования» (БПО) для оборудования «Штрих-М»:

  1. Стандарт 1.0 (компонента DrvFR1C): Использовал библиотеку drvfr.dll. Метод Подключить() принимал два параметра: массив со всеми настройками (порт, скорость, пароли) и идентификатор устройства. Данный стандарт морально устарел и не имеет встроенных механизмов для работы с QR-кодами.
  2. Стандарты 1.7 и 2.0 (компоненты SMDrvFR1C / SMDrvFR1C20 / SMDrvFR1C22): Работают через современные библиотеки семейства SMDrvFR1CLib.dll (например, smDrvFR1CLib24.dll). В этих версиях кардинально изменен интерфейс подключения. Метод Подключить() теперь принимает только один параметр — ИДУстройства. Все свойства связи (скорость, таймаут, COM-порт) должны предварительно передаваться поочередно через вызов метода УстановитьПараметр().

Именно из-за этого различия в интерфейсах при обычной замене ProgID в коде старой обработки программа выдает ошибку: старый код пытается передать массив настроек в метод, который этого не ожидает.

---

Шаг 1. Подключение внешней компоненты нового драйвера

Выясним, как правильно загрузить актуальную библиотеку и инициализировать объект драйвера. Вместо старых попыток обращения к AddIn.SMDrvFR1C, которые могут быть не зарегистрированы в системе, задействуем явную загрузку библиотеки через платформенные механизмы 1С.

Рассмотрим пример кода для инициализации компоненты:


Попытка
    // Загружаем актуальную библиотеку драйвера Штрих-М
    ЗагрузитьВнешнююКомпоненту("smDrvFR1CLib24.dll");
    ProgID = "AddIn.SMDrvFR1C22";
    Драйвер = Новый (ProgID);
Исключение
    Результат = мОшибкаЗагрузкиДрайвера;
    ОписаниеОшибки = "Невозможно подключить внешнюю компоненту smDrvFR1CLib24.dll. 
                      |Проверьте, что библиотека корректно зарегистрирована в операционной системе 
                      |и ее версия соответствует требованиям обработки.";
КонецПопытки;

---

Шаг 2. Реализация нового алгоритма подключения устройства

Поскольку новый драйвер требует поочередной передачи параметров, нам необходимо отказаться от передачи массива в метод Подключить(). Вместо этого мы сформируем структуру параметров, обойдем ее в цикле, вызывая метод УстановитьПараметр(), и только после этого выполним непосредственное подключение.

Разберем по шагам создание функции подключения:


Функция Подключить(Объект) Экспорт
    Результат = мНетОшибки;
    
    // 1. Формируем структуру параметров подключения
    ПараметрыИнтерфейса = Новый Структура;
    ПараметрыИнтерфейса.Вставить("P_AdminPassword",             Объект.Параметры.ПарольАдминистратора);
    ПараметрыИнтерфейса.Вставить("P_Baudrate",                  Объект.Параметры.Скорость);
    ПараметрыИнтерфейса.Вставить("P_Port",                      Объект.Параметры.Порт);
    ПараметрыИнтерфейса.Вставить("P_Timeout",                   Объект.Параметры.Таймаут);
    ПараметрыИнтерфейса.Вставить("P_IPAddress",                 Объект.Параметры.IPАдрес);
    ПараметрыИнтерфейса.Вставить("P_TCPPort",                   Объект.Параметры.TCPПорт);
    ПараметрыИнтерфейса.Вставить("P_ConnectionType",           Объект.Параметры.ТипПодключения); // 0 - COM, 1 - TCP
    ПараметрыИнтерфейса.Вставить("P_ComputerName",              ИмяКомпьютера());
    ПараметрыИнтерфейса.Вставить("P_EnableLog",                 Объект.Параметры.ЖурналОперацийДрайвера);
    ПараметрыИнтерфейса.Вставить("P_QRCodeDotWidth",            5); // Ширина точки QR-кода (рекомендуется от 3 до 5)
    ПараметрыИнтерфейса.Вставить("P_PayName1",                  Объект.Параметры.НаименованиеОплаты1);
    ПараметрыИнтерфейса.Вставить("P_PayName2",                  Объект.Параметры.НаименованиеОплаты2);
    
    // 2. Устанавливаем параметры в драйвер
    Для Каждого Параметр Из ПараметрыИнтерфейса Цикл
        Объект.Драйвер.УстановитьПараметр(Параметр.Ключ, Параметр.Значение);
    КонецЦикла;
    
    // 3. Вызываем метод подключения с одним параметром ИДУстройства
    Попытка
        Ответ = Объект.Драйвер.Подключить(Объект.ИДУстройства);
        Если Не Ответ Тогда
            КодОшибки = Объект.Драйвер.ПолучитьОшибку(Объект.ОписаниеОшибки);
            Результат = мОшибкаНеизвестно;
        Иначе
            // Опционально: отменяем открытый чек, если это настроено в системе
            Если Объект.Параметры.ОтменятьЧекПриПодключении Тогда
                Объект.Драйвер.ОтменитьЧек(Объект.ИДУстройства);
            КонецЕсли;
        КонецЕсли;
    Исключение
        Результат = мОшибкаНеизвестно;
        Объект.ОписаниеОшибки = "Ошибка вызова метода <ОбъектДрайвера.Подключить>: " + ОписаниеОшибки();
    КонецПопытки;
    
    Возврат Результат;
КонецФункции

---

Шаг 3. Печать QR-кода на фискальном регистраторе

После успешного перехода на новую компоненту у нас появляется техническая возможность вывода QR-кода. В зависимости от возраста вашего фискального регистратора и версии его внутреннего ПО (прошивки), вы можете использовать один из двух подходов.

Способ А. Печать через XML-пакет (метод PrintTextDocument)

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

Для этого используется метод НапечататьТекстовыйДокумент() (в англоязычном варианте — PrintTextDocument). Вторым параметром в него передается сформированная строка XML.

Проанализируем пример формирования XML-пакета для печати:


// Формируем XML-структуру текстового документа с QR-кодом
ДанныеДляПечати = 
"<?xml version=""1.0"" encoding=""UTF-8""?>
|<Document>
|    <Positions>
|        <TextString Text=""=================================""/>
|        <TextString Text=""СПАСИБО ЗА ПОКУПКУ!" "/>
|        <TextString Text=""Участвуйте в нашей акции""/>
|        <TextString Text=""Сканируйте код для регистрации:""/>
|        <Barcode BarcodeType=""QR"" Barcode=""https://site.ru/promo?id=12345""/>
|        <TextString Text=""=================================""/>
|    </Positions>
|</Document>";

// Отправляем сформированный XML на печать через объект драйвера
Идустройства = Объект.ИДУстройства;
РезультатПечати = Объект.Драйвер.НапечататьТекстовыйДокумент(Идустройства, ДанныеДляПечати);

Если Не РезультатПечати Тогда
    ОписаниеОшибкиПечати = "";
    Объект.Драйвер.ПолучитьОшибку(ОписаниеОшибкиПечати);
    Сообщить("Ошибка печати QR-кода: " + ОписаниеОшибкиПечати);
КонецЕсли;

Способ Б. Низкоуровневая печать графикой (метод PrintBarcodeGraph)

Если фискальный регистратор достаточно старый (например, классические «Штрих-ФР-К» или «Элвес-ФР-К» без модернизации платы), он не умеет налету обрабатывать XML-теги и самостоятельно строить по ним QR-код. В этом случае мы должны обратиться напрямую к свойствам низкоуровневого драйвера ККТ и заставить его напечатать QR-код графическим методом.

Для реализации этого сценария используется метод PrintBarcodeGraph() (ПечатьШтрихкодаГрафикой). Разберем, как передать параметры генерации графики в драйвер напрямую:


Процедура НапечататьQRКодГрафикой(Объект, ТекстСсылки)
    
    // Переходим к прямому управлению свойствами COM-объекта драйвера Штрих-М
    ДрайверККМ = Объект.Драйвер;
    
    // Устанавливаем тип штрихкода (значение 3 соответствует типу QR-код)
    ДрайверККМ.BarcodeType = 3; 
    
    // Указываем начальную позицию печати (0 - от левого края ленты)
    ДрайверККМ.FirstLineNumber = 0; 
    
    // Задаем высоту (разрешение) штрихкода в точках. 
    // Значение подбирается экспериментально под ширину ленты (обычно в пределах 150 - 260)
    ДрайверККМ.LineNumber = 200; 
    
    // Записываем текстовые данные, которые будут закодированы в QR-код
    ДрайверККМ.Barcode = ТекстСсылки;
    
    // Вызываем метод печати графического штрихкода
    ДрайверККМ.PrintBarcodeGraph();
    
    // Обязательно очищаем свойство Barcode после завершения операции во избежание утечки буфера
    ДрайверККМ.Barcode = "";
    
КонецПроцедуры

---

Возможные аппаратные ограничения и пути их решения

Если вы внедрили указанный выше программный код, подключение проходит успешно, но принтер вместо QR-кода печатает пустую область, обрезает его или выводит текстовое представление ссылки, проанализируем возможные аппаратные причины:

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

← На главную