При автоматизации розничной торговли часто возникает необходимость вывода дополнительной информации на чековую ленту фискального регистратора. Это могут быть ссылки на опросы, маркетинговые акции, промокоды или информация программ лояльности, представленная в виде QR-кода. Однако при попытке реализовать эту задачу на старых моделях оборудования «Штрих-М» разработчики сталкиваются с серьезной проблемой: используемые в конфигурациях старые обработки обслуживания (например, ShtrihMFiscalPrinters_v2.epf) работают через компоненту DrvFR1C, функционал которой крайне ограничен и не поддерживает печать двухмерных штрихкодов.
Попытка простой замены программного идентификатора (ProgID) на современный аналог приводит к тому, что система перестает «видеть» устройство, выдавая ошибки инициализации. В этой статье мы подробно разберем, как правильно переписать обработку обслуживания на работу с актуальной компонентой SMDrvFR1C (стандарты 1.7 и 2.0), корректно инициализировать подключение и вывести QR-код на печать двумя альтернативными способами.
Для понимания сути проблемы проанализируем эволюцию интеграционных стандартов «1С:Библиотека подключаемого оборудования» (БПО) для оборудования «Штрих-М»:
drvfr.dll. Метод Подключить() принимал два параметра: массив со всеми настройками (порт, скорость, пароли) и идентификатор устройства. Данный стандарт морально устарел и не имеет встроенных механизмов для работы с QR-кодами.SMDrvFR1CLib.dll (например, smDrvFR1CLib24.dll). В этих версиях кардинально изменен интерфейс подключения. Метод Подключить() теперь принимает только один параметр — ИДУстройства. Все свойства связи (скорость, таймаут, COM-порт) должны предварительно передаваться поочередно через вызов метода УстановитьПараметр().Именно из-за этого различия в интерфейсах при обычной замене ProgID в коде старой обработки программа выдает ошибку: старый код пытается передать массив настроек в метод, который этого не ожидает.
---
Выясним, как правильно загрузить актуальную библиотеку и инициализировать объект драйвера. Вместо старых попыток обращения к AddIn.SMDrvFR1C, которые могут быть не зарегистрированы в системе, задействуем явную загрузку библиотеки через платформенные механизмы 1С.
Рассмотрим пример кода для инициализации компоненты:
Попытка
// Загружаем актуальную библиотеку драйвера Штрих-М
ЗагрузитьВнешнююКомпоненту("smDrvFR1CLib24.dll");
ProgID = "AddIn.SMDrvFR1C22";
Драйвер = Новый (ProgID);
Исключение
Результат = мОшибкаЗагрузкиДрайвера;
ОписаниеОшибки = "Невозможно подключить внешнюю компоненту smDrvFR1CLib24.dll.
|Проверьте, что библиотека корректно зарегистрирована в операционной системе
|и ее версия соответствует требованиям обработки.";
КонецПопытки;
---
Поскольку новый драйвер требует поочередной передачи параметров, нам необходимо отказаться от передачи массива в метод Подключить(). Вместо этого мы сформируем структуру параметров, обойдем ее в цикле, вызывая метод УстановитьПараметр(), и только после этого выполним непосредственное подключение.
Разберем по шагам создание функции подключения:
Функция Подключить(Объект) Экспорт
Результат = мНетОшибки;
// 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. Вызываем метод подключения с одним параметром ИДУстройства
Попытка
Ответ = Объект.Драйвер.Подключить(Объект.ИДУстройства);
Если Не Ответ Тогда
КодОшибки = Объект.Драйвер.ПолучитьОшибку(Объект.ОписаниеОшибки);
Результат = мОшибкаНеизвестно;
Иначе
// Опционально: отменяем открытый чек, если это настроено в системе
Если Объект.Параметры.ОтменятьЧекПриПодключении Тогда
Объект.Драйвер.ОтменитьЧек(Объект.ИДУстройства);
КонецЕсли;
КонецЕсли;
Исключение
Результат = мОшибкаНеизвестно;
Объект.ОписаниеОшибки = "Ошибка вызова метода <ОбъектДрайвера.Подключить>: " + ОписаниеОшибки();
КонецПопытки;
Возврат Результат;
КонецФункции
---
После успешного перехода на новую компоненту у нас появляется техническая возможность вывода QR-кода. В зависимости от возраста вашего фискального регистратора и версии его внутреннего ПО (прошивки), вы можете использовать один из двух подходов.
Это наиболее современный и простой способ, рекомендуемый для фискальных регистраторов, модернизированных под онлайн-кассы (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-кода: " + ОписаниеОшибкиПечати);
КонецЕсли;
Если фискальный регистратор достаточно старый (например, классические «Штрих-ФР-К» или «Элвес-ФР-К» без модернизации платы), он не умеет налету обрабатывать 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-технологий.