shtrih-m / javapos_shtrih

Реализация JavaPOS драйвера принтера фискального регистратора для устройств Штрих-М
http://www.shtrih-m.ru
MIT License
33 stars 16 forks source link

ККТ: Некорректные параметры в команде <0x00330030: не допускается повтор тега в текущем документе ФН> #142

Closed ghost closed 2 years ago

ghost commented 2 years ago

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

        printer.fiscalReceiptType = FiscalPrinterConst.FPTR_RT_SALES
        printer.beginFiscalReceipt(true)

        val writer = TLVWriter()
        val phoneTag = 1171
        val supplierNameTag = 1225
        val supplierDataTag = 1224
        val innTag = 1226

        writer.add(phoneTag, "+79136195732")
        writer.add(supplierNameTag, "Тест")

        printer.fsWriteOperationTag(supplierDataTag, writer.bytes)
        printer.fsWriteOperationTag(innTag, "5448100656")
        printer.setParameter(SmFptrConst.SMFPTR_DIO_PARAM_ITEM_SUBJECT_TYPE, 4)
        printer.printRecItem("Товар1", 0, 1000000, 1, 10000, "0")

        printer.fsWriteOperationTag(supplierDataTag, writer.bytes)
        printer.fsWriteOperationTag(innTag, "5448100656")
        printer.setParameter(SmFptrConst.SMFPTR_DIO_PARAM_ITEM_SUBJECT_TYPE, 4)
        printer.printRecItem("Товар2", 0, 1000000, 1, 10000, "0")

        printer.printRecTotal(20000, 20000, "0")
        printer.endFiscalReceipt(true)

Ранее этот код работал и таким образом выводились данные поставщика, когда выставлен признак агента "Агент". Мы используем версию драйвера 633, но проблема на удивление воспроизводится и на более старых версиях драйвера, хотя ранее все работало.

Ниже лог с этой ошибкой, воспроизводится стабильно и на нескольких устройствах 51PrinterError.txt

Помогите понять, как решить эту проблему

VitalyKravtsov2016 commented 2 years ago

Добрый день. По логу видно, что ошибка возникает при выполнении команды 0xFF0C, "Передать произвольную TLV структуру". При помощи этой команды добавить два одинаковых тега в чек нельзя. По приведенному коду эта команда вызываться не должна. Нужен лог драйвера, чтобы стало понятнее.

ghost commented 2 years ago

@VitalyKravtsov2016 лог драйвера, здесь другой текст ошибки и происходит она на другой команде, но тем не менее проблема та же PrintCheque51LogsJpos.txt

VitalyKravtsov2016 commented 2 years ago

Добрый день. По логу видно, что в чеке 2 команда записи тегов чека: D/com.shtrih.jpos.fiscalprinter.FiscalPrinterService: directIO(SMFPTR_DIO_FS_WRITE_TLV, null, [B@25436d68) D/com.shtrih.jpos.fiscalprinter.FiscalPrinterService: directIO(SMFPTR_DIO_FS_WRITE_TLV, null, [B@da06a7b) Данные в лог не записаны (нужно это поправить), поэтому сказать что передаются одинаковые теги нельзя. По логу нельзя сказать где ошибка, в драйвере или в приложении. Ошибка происходит при повторной записи тега в чек: D/com.shtrih.fiscalprinter.PrinterProtocol_1: sendCommand: Fiscal storage: write TLV data, false D/com.shtrih.fiscalprinter.PrinterProtocol_1: -> 05 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- 15 D/com.shtrih.fiscalprinter.PrinterProtocol_1: -> 02 0B FF 0C 1E 00 00 00 21 04 01 00 40 82 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- 06 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- 02 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- 03 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- FF 0C 00 F0 D/com.shtrih.fiscalprinter.PrinterProtocol_1: -> 06 D/com.shtrih.fiscalprinter.SMFiscalPrinterImpl: FF0Ch, Fiscal storage: write TLV data = 0, 60 ms D/com.shtrih.fiscalprinter.SMFiscalPrinterImpl: FF0Ch, Fiscal storage: write TLV data D/com.shtrih.fiscalprinter.PrinterProtocol_1: sendCommand: Fiscal storage: write TLV data, false D/com.shtrih.fiscalprinter.PrinterProtocol_1: -> 05 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- 15 D/com.shtrih.fiscalprinter.PrinterProtocol_1: -> 02 0B FF 0C 1E 00 00 00 21 04 01 00 40 82 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- 06 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- 02 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- 03 D/com.shtrih.fiscalprinter.PrinterProtocol_1: <- FF 0C 33 C3 D/com.shtrih.fiscalprinter.PrinterProtocol_1: -> 06

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

ghost commented 2 years ago

@VitalyKravtsov2016 не знаю, насколько это поможет, но вот еще один файла с логами драйвера, где исходная ошибка о повторе тега уже есть PrintCheque51Logcat.txt

VitalyKravtsov2016 commented 2 years ago

Понятнее пока не стало - так же две команды записи тега в чек: 2022-01-28 18:02:38.553 6427-6485/ru.eastbanctech.mobileregistrator.dev D/com.shtrih.jpos.fiscalprinter.FiscalPrinterService: directIO(SMFPTR_DIO_FS_WRITE_TLV, null, [B@1bd08ae0) 2022-01-28 18:02:38.805 6427-6485/ru.eastbanctech.mobileregistrator.dev D/com.shtrih.jpos.fiscalprinter.FiscalPrinterService: directIO(SMFPTR_DIO_FS_WRITE_TLV, null, [B@d20f8d3)

ghost commented 2 years ago

@VitalyKravtsov2016 правильно ли передавать данные поставщика как мы это делаем в примере, который я прислал ранее?

        printer.fiscalReceiptType = FiscalPrinterConst.FPTR_RT_SALES
        printer.beginFiscalReceipt(true)

        val writer = TLVWriter()
        val phoneTag = 1171
        val supplierNameTag = 1225
        val supplierDataTag = 1224
        val innTag = 1226

        writer.add(phoneTag, "+79136195732")
        writer.add(supplierNameTag, "Тест")

        printer.fsWriteOperationTag(supplierDataTag, writer.bytes)
        printer.fsWriteOperationTag(innTag, "5448100656")
        printer.setParameter(SmFptrConst.SMFPTR_DIO_PARAM_ITEM_SUBJECT_TYPE, 4)
        printer.printRecItem("Товар1", 0, 1000000, 1, 10000, "0")

        printer.fsWriteOperationTag(supplierDataTag, writer.bytes)
        printer.fsWriteOperationTag(innTag, "5448100656")
        printer.setParameter(SmFptrConst.SMFPTR_DIO_PARAM_ITEM_SUBJECT_TYPE, 4)
        printer.printRecItem("Товар2", 0, 1000000, 1, 10000, "0")

        printer.printRecTotal(20000, 20000, "0")
        printer.endFiscalReceipt(true)

Мы с помощью TLVWriter записываем телефон и наименование и далее передаем через fsWriteOperationTag с тегом 1224. Возможно неправильно так передавать эти теги? Мы делаем так перед каждым printRecItem, передавая один и тот же телефон и наименование. Если это неверно, то какой правильный способ отправить эту информацию, в случае если данные поставщика для некоторых позиций могут совпадать?

VitalyKravtsov2016 commented 2 years ago

Добрый день. Вы все делаете правильно. Лучше использовать writer.addTag: writer.addTag(phoneTag, "+79136195732") Тогда хотя бы будет проверен идентификатор тега. printer.fsWriteOperationTag(innTag, "5448100656") выдает ошибку, потому что ИНН принимается 12 символов. Если ИНН 10 символов, то они должны дополняться пробелами: "5448100656 " В новой версии это сделает драйвер. Также можно отключить строгий ФЛК в таблица ФР.

ghost commented 2 years ago

@VitalyKravtsov2016 здравствуйте! Увидели, что появилась новая версия драйвера 642. Попробовали распечатать с ней. Вот лог операции. Здесь, вроде бы, теперь выводятся теги, возможно станет яснее в чем может быть проблема. PrinterLog.txt

VitalyKravtsov2016 commented 2 years ago

Добрый день. В ФФД 1.2 нет тега 1057, есть тег 1222

ghost commented 2 years ago

@VitalyKravtsov2016 на наших терминалах мы используем ФН с версией ФФД 1.05. Может ли в таком случае возникать наша проблема недопуском повтора тега в текущем документе, если используем тег 1057 вместо 1222? Требуется ли убрать тег 1057 и перейти на 1222?