Как настроить печать QR-кода ЕГАИС на фискальных регистраторах Штрих-М и АТОЛ в 1С:Рознице и УТ 10.3?

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

При интеграции с системой ЕГАИС в конфигурациях «1С:Розница» (редакции 1.0 и 2.2) и «1С:Управление торговлей 10.3» часто возникает ситуация, когда вместо графического двухмерного штрихкода (QR-кода) на фискальном чеке или слип-чеке печатается обычная текстовая ссылка вида http://check.egais.ru.... Проанализируем причины такого поведения оборудования и подробно разберем все способы настройки печати двухмерных кодов для устройств Штрих-М и АТОЛ.

Причины отсутствия печати графического QR-кода

Выделим ключевые факторы, из-за которых QR-код не выводится на печать:

  1. Устаревшая внешняя компонента 1С: старые типовые обработки обслуживания торгового оборудования (например, ShtrihMFiscalPrinters_v2.epf или ATOLFiscalPrinters_v2.epf) обращаются к устаревшим программным идентификаторам (ProgID AddIn.DrvFR1C или AddIn.ATOL_KKM_1C), которые не поддерживают функции передачи и генерации двумерных штрихкодов.
  2. Версия драйвера фискального регистратора: для корректной работы с новыми стандартами требуются драйверы «Штрих-М» версии не ниже 4.12.457 (в частности, 4.12.481) или драйвер ККМ АТОЛ версии 8.9.0.0 и выше.
  3. Настройки таблиц ККТ: в энергонезависимой памяти фискального регистратора может стоять аппаратный запрет печати графики или отключен протокол ККТ 2.0.

Решение 1. Перевод обработки Штрих-М на новую компоненту AddIn.SMDrvFR1C

Для конфигураций на обычных формах (Розница 1.0, УТ 10.3, КА 1.1) основным методом решения является адаптация типовой обработки обслуживания под обновленную библиотеку smDrvFR1CLib.dll.

Разберем изменения по шагам:

  1. Установим свежий драйвер «Штрих-М: Драйвер фискальных регистраторов» (версии 4.12.457 или выше) и зарегистрируем библиотеку smDrvFR1CLib.dll в операционной системе.
  2. В модуле обработки обслуживания заменим программный идентификатор создания объекта драйвера:

Функция СоздатьОбъектДрайвера(Объект, Модель, Параметры) Экспорт
    Результат = мНетОшибки;
    Попытка
        ПрогИД = "AddIn.SMDrvFR1C";
        ПодключитьВнешнююКомпоненту(ПрогИД);
        Объект.Драйвер = Новый (ПрогИД);
    Исключение
        Результат = мОшибкаЗагрузкиДрайвера;
        ОписаниеОшибки = "Невозможно подключить внешнюю компоненту AddIn.SMDrvFR1C. "
                       + "Проверьте корректность установки и регистрации библиотеки.";
        Возврат Результат;
    КонецПопытки;
    Возврат Результат;
КонецФункции

Обратим внимание на передаваемые параметры подключения. В новой компоненте AddIn.SMDrvFR1C изменились наименования свойств:

  1. Параметр скорости обмена называется Baudrate, а не Speed (передается числовой код скорости или явное значение, согласно спецификации).
  2. Появились обязательные параметры размера штрихкода (BarcodeHeight, BarcoceFirstLine). Без их инициализации команда генерации QR-кода может игнорироваться устройством.

Посмотрим на пример правильной процедуры подключения:


Функция Подключить(Объект) Экспорт
    Результат = мНетОшибки;

    Объект.Драйвер.УстановитьПараметр("ConnectionType", 0);
    Объект.Драйвер.УстановитьПараметр("ProtocolType", 0);
    Объект.Драйвер.УстановитьПараметр("Port", Объект.Параметры.Порт);
    Объект.Драйвер.УстановитьПараметр("Baudrate", 115200);
    Объект.Драйвер.УстановитьПараметр("UserPassword", "1");
    Объект.Драйвер.УстановитьПараметр("AdminPassword", "30");
    Объект.Драйвер.УстановитьПараметр("TimeOut", 100);
    Объект.Драйвер.УстановитьПараметр("BarcodeHeight", 3);
    Объект.Драйвер.УстановитьПараметр("BarcoceFirstLine", 1);

    Если Не Объект.Драйвер.Подключить(Объект.ИДУстройства) Тогда
        КодОшибки = Объект.Драйвер.ПолучитьОшибку(Объект.ОписаниеОшибки);
        Результат = мОшибкаНеизвестно;
    КонецЕсли;

    Возврат Результат;
КонецФункции

Также проанализируем изменения в вызовах методов новой компоненты:

  1. Методы ПроверитьСостояниеПечати() и ПродолжитьПечать() удалены из спецификации SMDrvFR1C. Их вызовы в обработке необходимо исключить или заключить в безопасный блок.
  2. Метод ЗакрытьЧек() получил дополнительный пятый параметр (тип оплаты/округление): Объект.Драйвер.ЗакрытьЧек(Объект.ИДУстройства, СуммаНал, СуммаБезнал, 0, 0).
  3. Метод ОткрытьСмену() теперь принимает идентификатор устройства: Объект.Драйвер.ОткрытьСмену(Объект.ИДУстройства).

Решение 2. Печать QR-кода на фискальниках Штрих-М через прямой COM-драйвер

Если нет возможности полностью переписывать обработку торгового оборудования, можно вызывать печать двухмерного кода напрямую через базовый COM-объект драйвера Штрих-М (AddIn.DrvFR) с использованием функции LoadAndPrint2DBarcode.

Рассмотрим пример кода:


Процедура НапечататьQRШтрихМ(СсылкаЕГАИС)
    Попытка
        ПрогИД = "AddIn.DrvFR";
        ПодключитьВнешнююКомпоненту(ПрогИД);
        ДрайверШтрих = Новый (ПрогИД);
    Исключение
        Сообщить("Ошибка загрузки AddIn.DrvFR: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    ДрайверШтрих.Password = 30; // Пароль системного администратора
    ДрайверШтрих.BarCode = СокрЛП(СсылкаЕГАИС);
    ДрайверШтрих.BarcodeType = 3; // Тип штрихкода: QR-код
    
    // Аппаратная загрузка и печать 2D штрихкода
    ДрайверШтрих.LoadAndPrint2DBarcode();
КонецПроцедуры

Решение 3. Реализация печати QR-кода на фискальных регистраторах АТОЛ

Для фискальных регистраторов АТОЛ (серии FPrint / ПТК) в конфигурациях на обычных формах встроенная компонента AddIn.ATOL_KKM_1C не умеет работать с двухмерными штрихкодами. Решением является прямое обращение к объекту AddIn.FPrnM8 (драйвер АТОЛ ККМ v.8.9+).

Разберем процедуру печати слип-чека с встроенным QR-кодом для устройств АТОЛ:


Функция НапечататьСтрокиFPrint(Объект, МассивСтрок) Экспорт
    Результат = мНетОшибки;
    
    Попытка
        ПрогИДFPrnM8 = "AddIn.FPrnM8";
        ПодключитьВнешнююКомпоненту(ПрогИДFPrnM8);
        ДрайверFPrnM8 = Новый (ПрогИДFPrnM8);
    Исключение
        Результат = мОшибкаЗагрузкиДрайвера;
        Возврат Результат;
    КонецПопытки;

    ДрайверFPrnM8.AddDevice();
    ДрайверFPrnM8.PortNumber = Объект.Параметры.Порт;
    ДрайверFPrnM8.BaudRate = Объект.Параметры.Скорость;
    ДрайверFPrnM8.DeviceEnabled = 1;
    ДрайверFPrnM8.Password = Объект.Параметры.ПарольПользователя;
    ДрайверFPrnM8.Mode = 1;
    ДрайверFPrnM8.SetMode();

    ДрайверFPrnM8.SlipDocCharLineLength = 40;
    ДрайверFPrnM8.SlipDocTopMargin = 2;
    ДрайверFPrnM8.SlipDocLeftMargin = 1;
    ДрайверFPrnM8.SlipDocOrientation = 0;
    
    ДрайверFPrnM8.BeginDocument();

    Для Каждого СтрокаТекста Из МассивСтрок Цикл
        // Проверяем наличие URL-ссылки ЕГАИС для вывода QR-кода
        Если Врег(Лев(СокрЛП(СтрокаТекста), 4)) = "HTTP" Тогда
            ДрайверFPrnM8.Barcode = СтрокаТекста;
            ДрайверFPrnM8.BarcodeType = 84; // QR-код
            ДрайверFPrnM8.Height = 50;
            ДрайверFPrnM8.AutoSize = "True";
            ДрайверFPrnM8.Alignment = 1;    // По центру
            ДрайверFPrnM8.Scale = 300;
            ДрайверFPrnM8.BarcodeControlCode = "False";
            ДрайверFPrnM8.PrintBarcodeText = "False";
            ДрайверFPrnM8.PrintPurpose = 1;
            ДрайверFPrnM8.PrintBarcode();
        КонецЕсли;

        ДрайверFPrnM8.Caption = СтрокаТекста;
        ДрайверFPrnM8.TextWrap = 2;
        ДрайверFPrnM8.PrintString();
    КонецЦикла;

    ДрайверFPrnM8.EndDocument();
    ДрайверFPrnM8.DeviceEnabled = 0;
    ДрайверFPrnM8.DeleteDevice();

    Возврат Результат;
КонецФункции

Особенности работы с двумя фискальными регистраторами на одном рабочем месте

При совместной работе двух фискальных регистраторов на одном ПК (например, один ФР для алкогольной продукции на ООО, второй — для немаркированного товара на ИП) часто возникает ошибка направления всех чеков на один аппарат.

Разберем причины и способы устранения:

  1. Перезапись параметров сеанса: внешняя компонента драйвера может сохранять глобальные параметры COM-порта в рамках одного процесса 1С. Перед отправкой чека на конкретный ФР необходимо явно выполнять отключение предыдущего аппарата (Отключить() / DeviceEnabled = 0) и заново передавать порт и скорость для целевого устройства.
  2. Разделение по библиотекам: стабильным решением является подключение нефискального/неалкогольного аппарата через старую версию компоненты (AddIn.DrvFR1C), а алкогольного фискального регистратора — через обновленную AddIn.SMDrvFR1C.
  3. Разрядность платформы: внешние компоненты драйверов ККТ поставляются в 32-разрядном исполнении (x86). Сеанс «1С:Предприятие» должен быть запущен в 32-битном клиенте для корректного вызова COM-объектов.
← На главную