Печать QR из УТ 10.3 Fprint ЕГАИС


На чековой ленте теперь необходимо печатать QR со ссылкой на чек в системе ЕГАИС. Стандартная обработка работы с фискальными регистраторами АТОЛ в УТ 10.3 этого делать не умеет.
Не умеет — научим, не захочет — заставим.
В статье приведен весь исходный код.

 

В интернете, на тематических форумах (в том числе и на форуме Infostart) эта проблема обсуждалась, и программисты приводят свои наработки.

К приведенным кодам (по крайней мере, касающихся драйвера Атола) у меня одно нарекание : выложенного ЦЕЛИКОМ я не увидел не одного. В общем, алгоритм верный приведен, но дьявол кроется в деталях.

Итак, имеем:

  1. последние драйвера Атола (в моем случае это были DTO_8_09_00_00_Full);
  2. фискальный регистратор FPrint 11 ПТК (скорее всего, подойдет и к другим моделям, лишь бы умели печатать QR-код);
  3. необходимость печатать QR на чеке с алкогольной продукцией;
  4. УТ 10.3.36 (37).

 

Начать лучше с тестовой обработки, которую мы запустим в УТ 10.3 (не в интерфейсе кассира, чтобы устройство FPrint не было занято).

Обработка на "обычных" формах, с кнопкой Выполнить, весь код на форме (ничего в модуле объекта нет).

Перем Драйвер,мОшибкаЗагрузкиДрайвера;

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

Процедура ПриОткрытии()
ИнициализацияФР();
Отрезать = 1;
КонецПроцедуры

Процедура КнопкаВыполнитьНажатие(Кнопка)
Драйвер.AddDevice();
Драйвер.PortNumber = 3;//Объект.Параметры.Порт;
Драйвер.BaudRate = 3;//Объект.Параметры.Скорость;
// параметры выше (порт, скорость) можно вычитать в файле логов
// FprnM1C.log или FprnM1C82.log, в папке C:UsersuserAppDataRoamingATOLDRIVERS
// например - сначала сделав тест устройства из 1С (появятся записи в логах, вы увидите все значения полей
// в последних строках файла логов )
Драйвер.DeviceEnabled = 1;
Драйвер.Password = 30;//Объект.Параметры.ПарольПользователя;
Драйвер.Mode = 1;
Драйвер.SetMode();
Драйвер.BeginDocument();
Стр = "http://check.egais.ru/?id=f0f6aea9-9cb6-4767-84f5-9a8a93fb8600&dt=0505160000&cn=020000190447";
Драйвер.currentdeviceindex=0;
Драйвер.Barcode = стр;
Драйвер.BarcodeType = 84;
Драйвер.Height = 50;
Драйвер.AutoSize = "True";
Драйвер.Alignment = 1;
Драйвер.Scale = 300;
//глФР.BarcodeControlCode = "True";
Драйвер.BarcodeControlCode = "False";
Драйвер.PrintBarcodeText = "False";
Драйвер.PrintPurpose = 1;
Драйвер.PrintBarcode();
Драйвер.EndDocument();
Драйвер.DeviceEnabled = 0; //на последние строки драйвер атола ругался на
Драйвер.DeleteDevice();    //последовательность команд (но только в логах, юзер этого не видит)
сообщить(стр + " с ошибкой нигде не выпало, конец печати");
КонецПроцедуры

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

!!! ВАЖНО

Если печати не произошло — возможно, ваша модель ФР печатает QR только "как картинку", для этого используется команда

Объект.PrintBitmapFromFile();

Кроме того,можете попробовать обновить драйвера АТОЛ до самых новых: они обещали "научить" драйвер распознавать, как передать QR на печать (то есть преобразовывать в bitmap самостоятельно)

В Общем модуле "ИнтеграцияЕГАИСКлиент" (в 10.3.36 он назывался "ИнтеграцияЕГАИСКлиентПереопределяемый") правим фунцию Функция ПечатьСлипЧека

Результат.РезультатПечатиЧека = ПолучитьСерверТО().ПечатьТекста(ИдентификаторУстройства, МассивСтрокСлипЧека, ШиринаСтроки); // после этой строки
АдресЧекаДляПечати=СокрЛП(ПараметрыЧекаЕГАИС.Адрес);//добавляем эту
//!!! начиная с 10.3.37.5 используется не "ПараметрыЧекаЕГАИС.Адрес", а "ПараметрыЧекаЕГАИС.АдресЧека"
Результат.РезультатПечатиЧека = ПолучитьСерверТО().ПечатьКубика(ИдентификаторУстройства, АдресЧекаДляПечати, ШиринаСтроки);//и эту

В обработке ТОСервер добавляем:

Функция ПечатьКубика(Идентификатор, АдресЧекаДляПечати, ШиринаЧека) Экспорт
Обработка = Неопределено;
Объект    = Неопределено;
Результат = ПолучитьОбъектДрайвера(Идентификатор, Обработка, Объект);
Если НЕ ЗначениеЗаполнено(Результат) Тогда
Результат = Обработка.НапечататьКубик(Объект, АдресЧекаДляПечати, ШиринаЧека);
мОписаниеОшибки = Объект.ОписаниеОшибки;
Иначе
мОписаниеОшибки = ПолучитьТекстОшибкиПодключенияТО("ФР");
КонецЕсли;
Возврат Результат;
КонецФункции
 

Во внешней обработке  ATOLFiscalPrinters_v2.epf добавляем

Функция НапечататьКубик(Объект, АдресЧека, Ширина) Экспорт
Отключить(Объект);
Результат = мНетОшибки;
НомерЧека = 0;
НомерСмены = 0;

Попытка
ПрогИД = "AddIn.FPrnM8";//ПрогИД = "AddIn.FPrnM6";
ПодключитьВнешнююКомпоненту(ПрогИД);
Драйвер = Новый (ПрогИД);
//сообщить(прогид+ " компонента создана");
Драйвер.AddDevice();
Драйвер.PortNumber = Объект.Параметры.Порт;
Драйвер.BaudRate = Объект.Параметры.Скорость;
Драйвер.DeviceEnabled = 1;
Драйвер.Password = 30;//Объект.Параметры.ПарольПользователя;
Драйвер.Mode = 1;
Драйвер.SetMode();
Драйвер.BeginDocument();
Драйвер.Barcode = АдресЧека;
Драйвер.BarcodeType = 84;
Драйвер.Height = 50;
Драйвер.AutoSize = "True";
Драйвер.Alignment = 1;
Драйвер.Scale = 300;
Драйвер.BarcodeControlCode = "False";
Драйвер.PrintBarcodeText = "False";
Драйвер.PrintPurpose = 1;
Драйвер.PrintBarcode();
Драйвер.EndDocument();
Драйвер.DeviceEnabled = 0;
Драйвер.DeleteDevice();
Исключение
Сообщить("Невозможно подключить внешнюю компоненту.
| Проверьте, что внешняя компонента корректно установлена и имеет ту же версию,
| что и требуемая обработкой обслуживания.");
КонецПопытки;
Подключить(Объект);
Возврат Результат;
КонецФункции

26 Comments

  1. doba1

    По поводу скорости обмена.

    Логи не нашел, зато вот это нашел:

    1 – 1200 бод;

    2 – 2400 бод;

    3 – 4800 бод;

    4 – 9600 бод;

    5 – 14400 бод;

    6 – 38400 бод;

    7 – 57600 бод;

    8 – 115200 бод;

    9 – 19200 бод

    Reply
  2. doba1

    Не подскажите, почему после запуска тестовой обработки, не освобождается COM-порт?

    Приходится перезапускать платформу.

    Reply
  3. erutan

    (2) doba1,

    могу лишь предположить.

    В тестовой обработке объект отключается как-то так

    Драйвер.DeviceEnabled = 0; //на последние строки драйвер атола ругался на

    Драйвер.DeleteDevice(); //последовательность команд (но только в логах, юзер этого не видит)

    (хотя, вообще-то, в «боевой» тоже).

    Что-то Атолу не нравится, он об этом кричит в логи.

    Честно — я его не понял (и не стал углубляться, так как тестовая пригодится ну 1 раз на 1 ПК).

    Если вчитаться в логи — наверное, можно понять, что именно не так.

    Reply
  4. bgp

    Картинка тусклая получается и вылезает медленно очень

    Что с этим можно сделать?

    Reply
  5. erutan

    (4) bgp, версия драйвера, модель фр?

    Единственное, ято мы можем поменять — скорость обмена с фр, вплоть до 115200

    Хотя вроде скорость печати тоже где-то настраивалась; возможно, из теста драйвера.

    Далее. Есть ряд моделей, как раз ПТК — у них скорость печати кубика занимает 1-2 секунды.

    Если модель печатает как графику — это уже 6-10 секунд.

    Reply
  6. erutan

    (4) bgp, в общем, покрутить настройки можно «напрячь» цто, но если у вас не птк — все равно будет медленней, чем птк

    Reply
  7. bgp

    Модель FPrint 11 ПТК, подключен по ip, средствами драйвера 8.10. Чтобы обработка заработала по ip добавил параметр Драйвер.MachineName = «ip:port»

    через тест драйвера печатает QR код быстро и ярко, через тестовую обработку соответственно медленно и тускло.

    Ставил параметр Драйвер.BaudRate = 18, вроде в логах это соответствует скорости 115200, но не помогает.

    Завтра буду пробовать на модели Fprint 5200K.

    Reply
  8. erutan

    (7) bgp, воу! По ip не подключал — втыкал напрямую.

    Узнаете что-то — напишите.

    Скорость надо менять не в самой обработке, а на фискальнике. В обработке мы по идее просто выбираем то, на какой устройство работает (читай — на какой скорости обнаружилось в тесте драйвера).

    Из теста драйвера ккм надо лезть в свойства, полагаю.

    Еще можно глянуть документацию на fprint11 — на сайте атола есть

    Reply
  9. bgp

    обработка на модели 5200К не выводит QR совсем, хотя отрабатывает без ошибок.

    через тест драйвера QR на данной модели печатается около 3 сек.

    Reply
  10. bgp

    Печатает 5200К, в первой попытке неверно порт в параметрах указал. Скорость печати из обработки через подключение по ip совпадает со скоростью печати через драйвер, т.е. 3,5 сек. И картинка нормальная.

    Что делать с fprint11 неясно..

    Драйвер АТОЛ версии 8.10.

    Reply
  11. erutan

    (10) bgp, можете попробовать задать вопрос в Атол.

    делается через партнеров, поставляющих вам торговое оборудование. В принципе и через фирму-франчайзи 1с, но не каждую.

    Еще можно на атоловском форуме зарегистрироваться и попробовать выяснить там. Это может быть просто «косяком» ip-версии драйвера, или есть какая-то тонкость.

    Reply
  12. erutan

    (7) bgp, кстати, еще можно попробовать вчитаться в атоловские логи теста драйера и сравнить их с тем, что появится после попытки печатать из 1с.

    В чем-то будет разница

    Reply
  13. bgp

    Заработал у меня fprint11. В обработку обслуживания добавил Ваш код, с некоторыми изменениями, т.к. у меня обработка обслуживания ТО изначально работает с модулем AddIn.FPrnM8, то мне не нужно заново создавать объект драйвера, использую уже созданный.

    В итоге QR код добавляется в текущий чек без проблем, и быстро выходит и ярко печатается.

    Функция НапечататьКубик(Объект, АдресЧека, Ширина) Экспорт
    
    Результат = мНетОшибки;
    НомерЧека = 0;
    НомерСмены = 0;
    Попытка
    Объект.Драйвер.Barcode = АдресЧека;
    Объект.Драйвер.BarcodeType = 84;
    Объект.Драйвер.Height = 50;
    Объект.Драйвер.AutoSize = «True»;
    Объект.Драйвер.Alignment = 1;
    Объект.Драйвер.Scale = 300;
    Объект.Драйвер.BarcodeControlCode = «False»;
    Объект.Драйвер.PrintBarcodeText = «False»;
    Объект.Драйвер.PrintPurpose = 1;
    Объект.Драйвер.PrintBarcode();
    Исключение
    //Сообщить(«Невозможно подключить внешнюю компоненту.
    //| Проверьте, что внешняя компонента корректно установлена и имеет ту же версию,
    //| что и требуемая обработкой обслуживания.»);
    КонецПопытки;
    Возврат Результат;
    КонецФункции
    

    Показать

    А тестовая обработка по прежнему печатает QR тускло и медленно. Возможно все дело в команде

    Объект.Драйвер.TestMode = Ложь;, но проверить пока нет возможности.

    Reply
  14. Flok

    Большое спасибо . Все работает как в УТ 10.3 , так и в Розница 1.

    Проверял на Fprint 5200.

    Ставил драйвера ТО 8.10.

    Обработку использовал 6.32 с users.v8.1c.ru.

    QR печатает графикой — примерно 2-3 секунды.

    четкость нормальная сканер читает.

    Reply
  15. lexme

    в тестовой обработке ошибка значение Драйвер.AddDevice(); не является значением объектного типа

    в релизе 10.3.37.2 Результат.РезультатПечатиЧека = МенеджерРаботыСОборудованием().ПечатьТекста(ИдентификаторУстройства, МассивСтрокСлипЧека, ШиринаСтроки); вместо ПОлучитьСерверТО

    Reply
  16. erutan

    (15) lexme,

    1) про не является объектного типа — очень странно.может, драйвер установился некорректно, или устройство занято (например, тестом драйвера или самой 1с-кой в интерфейсе кассира?

    2) вы говорите о том, что изменилась строка вызова то, и все? Ну то есть я ее не предлагаю править, я лишь написал, что мы после нее вставляем вызов печати qr

    Reply
  17. lexme

    после доработки по вашей статье, ничего не происходит…то-есть qr не печатается релиз ут 10.3.37.2 фискальник fprint 22 ПТК.

    Reply
  18. erutan

    (17) lexme, 1)Печатается ли из тестовой обработки?

    2) Версия драйвера, и что полезного в атоловских логах есть?



    если что, сейчас на 37.2 и торгуем, только FPrint-11ПТК, а не 12

    Reply
  19. lexme

    тестовая не запускается, ошибка значение Драйвер.AddDevice(); не является значением объектного типа ,в логах ничего полезного, драйвер 8.10.2

    Reply
  20. erutan

    (19) lexme,

    Не стоит ли несколько версий драйвера, и нормально ли зарегистрировались все библиотеки? Что-то похожее у меня было, когда сначала работали на одной версии драйвера, потом обновили, но винда где-то хранила часть старых файлов dll И теста драйвера, удалял рукамм, ставил заново.

    Часть библиотек атол копирует куда-то близко к 1с, в appdata что ли.

    В общем, попробуйте перерегистровать руками и подложить 1с-ке, куда ей хочется.

    Старые лучше начисто удалить.



    Попробуйте выполнить тест драйвера из интерфейса пользователя(но не кассира) в ут — так мы заодно увидим параметры в логах, да и должны убедиться в работе нормальной драйвера(версию напишет?). Лучше это делать после перезагрузки, чтобы объект ккм был точно свободен (и рядом не должна быть «свернута» другая ут-шка с подключенным ккм, конечно).



    Подключено по com / usb?

    1)Еще я бы сделал следующее. Dll , в которос лежит addin нас интересующий — вскрыл (где-то на инфостарте была инструкция, как прицепить его к проекту vba (в лист эксель короче) и посмотреть содержимое) — не поменялось ли им объекта.

    2)попробовать на другой машине развернуть файловую копию ут, может даже прошлого релиза, туда же прицепить фискальник и поставить, например, одну из предыдущих версий драйвера.

    Reply
  21. lexme

    POSы новые, даже муха не сидела ещё, старые версии драйверов и не устанавливались собственно, библиотеки перерегистрировал, в обработке ТОСервер в конец модуля добавлять функцию? или не имеет значения куда?(20)

    Reply
  22. erutan

    >> в обработке ТОСервер в конец модуля добавлять функцию?

    (21) lexme, не должно играть роли.

    Но, в общем, очень странная ситуация.

    —-

    Можете попробовать почитать описание драйвераККМ от Атола, где-то у них на сайте валяется.

    Там, в конце файла pdf, есть пример подключения к 1С. Может быть, в последних версиях драйвера что-то изменилось, и нужна какая-то дополнительная команда?

    —-

    Еще, если Вы вдруг ставили драйвер _только_ккм_ — попробуйте установить весь комплект, не снимая галочки. Для 1с-ки драйвера регистрируются какой-то отдельной «галочкой», насколько я помню.

    Reply
  23. vcspektr

    Кто-нибудь может поделиться готовым cf-ником от розницы 1,0,9,16, я замучался уже, ничего не выходит….

    Reply
  24. Daniayr

    Скачал обработку. не печатает тест QR

    вот логи:

    0000000000 TDispatchProxyHost.Destroy complete

    04.07.2017 13:45:25.305 0000062172 00001E54 ML low level: OnPortReceive

    04.07.2017 13:45:25.305 0000000000 Сокет закрыт

    0000000000 Исключение Нет связи: сервер разорвал соединение Повтор: True

    04.07.2017 13:45:25.305 0000000000 Исключение Нет связи: сервер разорвал соединение

    04.07.2017 13:45:25.305 0000000000 DispatchProxy: OnPortError

    0000000125 Ошибка сокета:10038 Дескриптор: -1

    0000000000 Reconnecting…

    04.07.2017 13:45:25.430 0000000000 CommDeviceTCPClient.query IP-address for armnet.ddns.net

    0000000047 CommDeviceTCPClient.connecting armnet.ddns.net:6221

    0000000094 CommDeviceTCPClient.connected

    0000000000 Исключение 10038 Сделана попытка выполнить операцию на объекте, не являющемся сокетом Повтор: True

    04.07.2017 13:45:25.571 0000000000 Исключение 10038 Сделана попытка выполнить операцию на объекте, не являющемся сокетом

    04.07.2017 13:45:25.571 0000000000 DispatchProxy: OnPortError

    подскажите где может быть ошибка

    Reply
  25. Flok

    (24) Проверьте из теста драйвера доступность ФР . Ошибки в логе не связаны с QR а просто отсутствие связи на ФР подключенном по ethernet.

    Обработка рассчитана на обычные кассы, а не онлайн , у них другая компонента. Так же в примере подключение идет по com порту,а у вас ошибки подключения по сети .

    Reply
  26. erutan

    (24) Эльчин Гасанов все правильно сказал.

    От себя могу добавить следующее:

    1)если поставите последние драйверы Атол — там есть примеры использования, так что можете посмотреть, чем отличается вызов компоненты драйвера, если работаем по tcp/ip

    2)действительно ли вам необходимо такое подключение? Как правило, оно оправдано, если хотите печатать на этом фр чеки с разных касс. Ну или чтобы онлайн фр выводить по ethernet, конечно, хотя есть (существует) вариант по usb, через виртуальные ком-порты

    3)вроде Атол хотели обновить обработки обслуживания под онлайн-кассы? Может, они там уже впаяли и печать QR?

    я бы и сам поковырял, но руководство приняло решение разбить учет на фронт и бэк-офис, так что ут теперь только для бэка, а на фронте специализированное кассовое по, не 1с.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *