shtrih-m / fr_drv_ng_examples

Примеры использования https://github.com/shtrih-m/fr_drv_ng
10 stars 2 forks source link

Не печатается Буква М+ на маркированная позиции #42

Closed ConsperSerj closed 2 years ago

ConsperSerj commented 2 years ago

Добрый день. У меня возникла проблема с маркированной позицией

Провожу проверку маркировки. Получаю ответ от ядра что все прекрасно маркировка распознана и все с ней хорошо.

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

Подскажите пожалуйста в чем может быть причина?

Мои действия:

OpenCheck() - открылся без ошибок указываю тип как обычно

Заполняю поля для проверки маркировки

Set_Password(USER_PASSWORD) Set_BarCode(param.markingCode.decodeToString()) Set_ItemStatus(param.plannedGoodStatus.code) Set_CheckItemMode(0) var tlvData = byteArrayOf() Set_TLVDataHex("") param.measureOfQuantity?.let { tlvData += getTLVDataHexForByte(2108, it.code.toLong()) } param.quantity?.let { tlvData += getTLVDataHexForFVLN(1023, it) } param.fractionalCountOfMarkedPosition?.let { fractional -> Set_TagNumber(1291) Set_TagType(8) FNBeginSTLVTag() val parentId = Get_TagID() addTagVlnType(parentId, 1293, fractional.numerator.toString()) addTagVlnType(parentId, 1294, fractional.denominator.toString()) Set_TagNumber(parentId) Set_TagType(8) GetTagAsTLV() tlvData += Get_TLVData() } Set_TLVData(tlvData) val result = executeCommand { FNCheckItemBarcode() } - Получаю ответ что все хорошо

После этого выполняю заполнение полей для регистрации позиции и регистрирую ее:
FNOperation() тут тоже ответ что все хорошо

После этого выполняю Set_BarCode(position.markingCode?.decodeToString()) val result = executeCommand { FNSendItemBarcode() }

И потом заполнение оставшихся полей для команды FNCloseCheckEx
Происходит фискализация но вот пометки на чеке что данная позиция маркированная нет.

Подскажите пожалуйста что не так?

П.С. вычитал в вашем примере увидел следующее: Требуется актуальная версия прошивки ККТ и функциональная лицензия. Может ли это быть причиной?

@swex

swex commented 2 years ago

нужен лог

ConsperSerj commented 2 years ago

@swex Завтра утром ранним пришлю

ConsperSerj commented 2 years ago

Доброе утро, Алексей.

Лог по ссылке - https://drive.google.com/file/d/1qkyKGbNz_mxmsd224HO5NW6Ya-qzrb5T/view?usp=sharing

Устройство Pax A930

@swex

ConsperSerj commented 2 years ago

@swex Подскажите пожалуйста. Удалось ли понять хоть что-то с логи? Может быть я где то делаю что-то не так, но вроде бы все по документации.

swex commented 2 years ago

необходимо поменять местами методы FNOperation и FNSendItemBarcode, для ККТ на базе КЯ порядок отправки тегов такой: сначала операция(FNOperation) потом теги в т.ч. FNSendItemBarcode, для остальных ККТ обратный: сначала теги в т.ч. FNSendItemBarcode, потом операция(FNOperation)

ConsperSerj commented 2 years ago

@swex Спасибо этот момент заработал.

Сейчас столкнулся со следующим. При попытке передать Set_MeasureUnit для маркированной позиции получаю ошибку что нельзя передавать тег 2108 для штучного товара.

1) Подскажите пожалуйста каким образом тогда передавать например литры или килограммы? 2)Так же При попытке передавать дробное количество получил ошибку
Некорректные параметры в команде или ошибка при работе с КМ <0x00330054: до команды FF67h передается {тег 1293}>

Я правильно понимаю что дробное количество нужно передавать непосредственно перед вызовом метода FNSendItemBarcode() или наоборот после?

В документации не указано в каком порядке нужно вызывать методы которые связаны с маркировкой. Если вас не затруднит то расскажите пожалуйста в каком порядке нужно передавать дробное количество это числитесь и знаменатель, как передавать меру исчисления. Может быть их нужно вызывать между вызовами FNSendItemBarcode и FNOperation. И перед FNSendItemBarcode. @swex

swex commented 2 years ago
  1. достаточно выставить MeasureUnit перед вызовом FNOperation
  2. FF67 это FNSendItemBarcode, а дробное количество передается внутри самой FNOperation. Значит опять где-то не тот порядок... покажите лог
  3. Вообще я знаю только про общее правило для КЯ: все теги, привязанные к операции, необходимо передать ДО операции. Возможно @asem-m знает какие-то еще правила для КЯ
ConsperSerj commented 2 years ago

1) MeasureUnit - указываю перед FNOperation и перед добавлением маркировки. Получаю ошибку что нельзя указывать для штучного маркированного товара 2) утром пришлю тоги и попробую в разных порядках передавать

@swex

asem-m commented 2 years ago

в changelog.txt см. "Рекомендации по использованию КЯ в режиме ФФД 1.2" п.2. "Работа с чеком прихода/расхода/возвратов"

чтобы товар был мерным нужно передать либо 1023, либо 1291, иначе он штучный

ConsperSerj commented 2 years ago

@asem-m в тег 1023 ложу количество 1. Потом указываю что это литры. После этого указываю код маркировки. Выполняю функцию FNOperation и получаю ошибку что литры нельзя указывать для штучного товара. А если судить по вашему ответу то должно быть всё хорошо. Если нужно могу прислать логи

asem-m commented 2 years ago

пришлите лог с HEX командами

asem-m commented 2 years ago

Команда ККТ FF61h "Проверка маркированного товара" позволяет принимать в параметрах Список TLV, куда передавать теги 2108, 1023, 1291. Это ускоряет обработку данных, чтобы эти теги не загружать отдельной командой ККТ FF4Dh "Передать произвольную TLV структуру привязанную к операции".

Посмотрите лог драйвера ФР под Windows как это делается.

ConsperSerj commented 2 years ago

@asem-m к сожалению у меня нет оборудования. Я сниму логи с андроид устройства м завтра с утра пришлю + попробую по-разному передавать параметры.

И тут речь уже не про проверку маркировки. А привязывание маркировки к позиции и указание у этой позиции меры измерения например литров

А у вас нет расшифровки как называютчя методы в документации например вы пишите команда ККТ FF61h - а как этот метод называется а документации например это FNOperation или ещё как то. Это можно как то быстро понять?

ConsperSerj commented 2 years ago

@swex @asem-m Доброе утро

Провел два эксперимента Первый пример:

ConsperSerj commented 2 years ago

@asem-m Подскажите пожалуйста. Вы писали: в changelog.txt см. "Рекомендации по использованию КЯ в режиме ФФД 1.2" п.2. "Работа с чеком прихода/расхода/возвратов"

А где можно найти данный файл? Что-то я в github его не могу найти

asem-m commented 2 years ago

changelog.txt идет в архиве в поставке КЯ

ConsperSerj commented 2 years ago

@swex @asem-m подскажите пожалуйста а удалось что-то по логам понять?

asem-m commented 2 years ago
  Получаю ошибку: Код ошибки 33h (51) от ККТ: Некорректные параметры в команде или ошибка при работе с КМ <0x00330054: до команды FF67h передается {тег 2108}>

Последовательность (если не передавать TLV List (1023) в FF61h, тогда передавать 1023 отдельной командой FF4Dh): Открытие чека 8Dh -> Проверить код маркировки FF61h (без TLV List) -> Принять КМ FF69h -> Отправить тег привязанный к операции FF4Dh (тег 1023, например) -> Передать и распознать КТ FF67h -> Добавить позицию V2 FF46h -> Закрытие чека расширенное V3 FF45h

FF61h-without-TLVList

asem-m commented 2 years ago

Команда ККТ FF61h "Проверка маркированного товара" позволяет принимать в параметрах Список TLV, куда передавать теги 2108, 1023, 1291. Это ускоряет обработку данных, чтобы эти теги не загружать отдельной командой ККТ FF4Dh "Передать произвольную TLV структуру привязанную к операции".

Посмотрите лог драйвера ФР под Windows как это делается.

FF61h-with-TLVList

ConsperSerj commented 2 years ago

Добрый день. Подскажите пожалуйста

Set_BarCode executeCommand { FNSendItemBarcode() }

В Set_BarCode - нужно передавать код товара или все же код маркировки?

@swex @asem-m

asem-m commented 2 years ago

для лучшего понимания о чем речь, уточняйте код команды ККТ по логу драйвера

ConsperSerj commented 2 years ago

@asem-m FF67

ConsperSerj commented 2 years ago

Я завел чтобы у меня печатался [M+], чтобы можно было указать дробно значение и так же значение измерения позиции. Но столкнулся со следующим

Пример: Есть например позиция у которой не удалось считать код маркировки. Но мы знаем что Признаки предмета расчета. = * Обязательный к маркировке подакцизный товар без КМ и Коды товара - тоже нам известен.

И получается ситуация: 1)проверить маркировку нет возможности - по причине того что кода маркировки нет 2)Принять маркировку нет возможности то же не можем 3) Вызвать команду FF67 то же не имеет смысла

НООО. Данная позиция по закону должна фискализироваться и на чеке она должна отобразиться как [M] при этом если это например в литрах измерялось то напечататься литры

Подскажите пожалуйста каким образом поступать если маркировка не считалась и позиция измеряется не в штуках а например в литрах, каким образом в позицию передать это все? @swex @asem-m

asem-m commented 2 years ago

если КМ может быть поврежден, но непустой, то нужно предварительно установить Т1П57=1 "ПРИНИМАТЬ ВСЕ КОДЫ ТОВАРА", тогда в позицию чека будет добавлен тег 1300 с поврежденным КМ

asem-m commented 2 years ago

если КМ пустая строка, то при любом значении Т1П57 в позицию чека будет добавлен пустой тег 1300

asem-m commented 2 years ago

@asem-m FF67

эта команда и формирует тег 1300, если КМ поврежден или пустая строка

ConsperSerj commented 2 years ago

@asem-m что такое Т1П57 и как это поле или метод называется в вашем сдк для андроид? Я что-то даже не понимаю р чем речь сейчас.

ConsperSerj commented 2 years ago

И я могу для команды ff67 передать пустую строку. Но при попытке передать меру исчисления я получаю ошибку что до метода ff67 был передан параметр 1208 @asem-m

asem-m commented 2 years ago

таблица 1, поле 57, ряд 1 (по умолчанию)

тест драйвера ФР: 09.Параметры устройства -> Редактирование таблиц -> №1 Настройки ККТ -> Открыть

ConsperSerj commented 2 years ago

@asem-m если указать в 57 поле значение 1 это будет означать что можно передавать код маркировки пустым или нет?

asem-m commented 2 years ago

Т1П57=1 чтобы передавать поврежденные КМ

ConsperSerj commented 2 years ago

@asem-m и ещё вопрос. Если код маркировки пуст, то нужно ли проводить проверку маркировки и добавление кода маркировки или достаточно просто вызывать команду ff67?

ConsperSerj commented 2 years ago

Тогда как поступать когда 1) код маркировки отсутствует 2) позиция является маркированной имеет право быть без км 3) при этом измеряется в литрах 4) на чеке она должна распечататься с пометкой [М]

Как поступать в таком случае?

У меня получается или чтобы печаталось [М] или печатается литры. Но вот все вместе не выходит заставить провести такую позицию

@asem-m

asem-m commented 2 years ago

И я могу для команды ff67 передать пустую строку. Но при попытке передать меру исчисления я получаю ошибку что до метода ff67 был передан параметр 1208 @asem-m

если вы передаете отдельными тегами, а не TLV List'ом в FF61h, и товар мерный, то нужно сначала передать 1023 и следом 2108, далее FF67h

последовательность:

ConsperSerj commented 2 years ago

@asem-m буду пробовать. Спасибо

asem-m commented 2 years ago

@asem-m и ещё вопрос. Если код маркировки пуст, то нужно ли проводить проверку маркировки и добавление кода маркировки или достаточно просто вызывать команду ff67?

если пуст, то Проверка (FF61h) выдаст ошибку <0x00D30015: передана пустая строка в качестве КМ>, а значит далее подавать Передать (FF67h), но можно сразу Передать

asem-m commented 2 years ago

Тогда как поступать когда

1. код маркировки отсутствует

2. позиция является маркированной имеет право быть без км

3. при этом измеряется в литрах

4. на чеке она должна распечататься с пометкой [М]

Как поступать в таком случае?

У меня получается или чтобы печаталось [М] или печатается литры. Но вот все вместе не выходит заставить провести такую позицию

@asem-m

photo_2022-09-26_19-42-33

ConsperSerj commented 2 years ago

@asem-m спасибо огромное. Буду завтра с утра пробовать

ConsperSerj commented 2 years ago

@asem-m @swex Добрый день. С обычным чеком все работает прекрасно. Спасибо за помощь.

Но есть проблемы с чеком коррекции при работе с маркировкой. По сути тот же код отличается только открытие документа - FNOpenCheckCorrection (в обычном OpenCheck()) Но выдается ошибка от ядра : Код ошибки 5Eh (94) от ККТ: Неверная операция <0x005E0013: команда ККТ FF67h не поддерживается в текущем открытом документе КЯ>

Подскажите пожалуйста каким образом тогда проводить коррекцию с маркировкой чтобы печаталась буква [M]?

Без маркировки чек коррекции отрабатывает нормально.

ConsperSerj commented 2 years ago

https://drive.google.com/file/d/1V28toGJviHH5Slpn3Q8dm4lpQRoVr2YF/view?usp=sharing

@asem-m @swex Лога

asem-m commented 2 years ago

Потому что вы открываете чек на расход. При работе с КМ поддерживаются типы чеков - приход и возврат прихода. Это связано с тегом 2110.

ConsperSerj commented 2 years ago

Спасибо со всем разобрался.