BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 26 окт 2021, 18:46

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
СообщениеДобавлено: 24 июн 2019, 14:22 
Не в сети

Зарегистрирован: 31 авг 2015, 12:40
Сообщения: 10
Карма: 0
Добрый день. У меня вопрос по печати чеков в соответсвие с новыми требованиями ФЗ54
С 1.07.2019 на чеках вводится требование по выводу информации об ИНН и наименовании плательщика.

Ссылки на "Консультант"
Приказ -
Письмо налоговой - https://www.consultant.ru/cons/cgi/online.cgi?req=doc&base=LAW&n=321176&fld=134&dst=1000000001,0&rnd=0.3847943447193015#03314645425354409

Бухгалерия справедливо потредовала реализовать требуемые пункты, однако возникли проблемы.

В классе Check нет соответсвующих методов, для передачи значений тегов 1227 (имя плательщика) и 1228 (ИНН плательщика)
Реализовал через явное определение значения тега.
Код:
check.setTag(1227,contractName);
check.setTag(1228,contractINN);





Возникли ошибки:
1. при попытках передавать ИНН длинной не 10 символов - это ИНН ИП/ЧП и физ.лиц, - получаем отлуп с ошибкой ("ru.bitel.frk.driver.atol3.PrintterAtolException: #19 Неверный формат")
2. при попытках передать имя плательщика в любом виде, получаем отлуп с ошибкой #19

Выдержка из лога принт.сервера

24.06.2019 15:20:30,644 DEBUG [thread#9] Driver:489 - Driver: SALE: sum=1.00;txt=1.00р.;dep=0
24.06.2019 15:20:30,644 DEBUG [thread#9] Driver:431 - Driver: TAX: 1
24.06.2019 15:20:30,644 DEBUG [thread#9] Driver:449 - Driver: TAG: 1228;33 38 31 32 31 33 35 32 35 34
24.06.2019 15:20:30,644 DEBUG [thread#9] Driver:436 - Driver: PAYMENT TYPE: 1
24.06.2019 15:20:30,644 DEBUG [thread#9] Driver:464 - Driver: PAY OBJECT: 4
24.06.2019 15:20:30,644 DEBUG [thread#9] Driver:470 - Driver: CHECK TYPE: PAYMENT
24.06.2019 15:20:30,644 DEBUG [thread#9] Driver:392 - Driver: check/checkreturn(clientsumma=1.0,type=1):
24.06.2019 15:20:32,603 DEBUG [thread#9] CmdTcpServer:482 - thread#9: frk error
ru.bitel.frk.driver.atol3.PrinterAtolErrorException: Чек был аннулирован ввиду ошибки: ru.bitel.frk.driver.atol3.PrinterAtolErrorException: #20: Неверная длина
at ru.bitel.frk.driver.atol3.Driver.a(SourceFile:482)
at ru.bitel.frk.driver.atol3.Driver.check(SourceFile:504)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at ru.bitel.frk.server.CmdTcpServer.run(SourceFile:453)
24.06.2019 15:20:32,603 WARN [thread#9] CmdTcpServer:492 - thread#9: send error driver: Чек был аннулирован ввиду ошибки: ru.bitel.frk.driver.atol3.PrinterAtolErrorException: #20: Неверная длина
24.06.2019 15:20:32,603 DEBUG [thread#9] CmdTcpServer:502 - thread#9: command 'check' processing sucessfull
24.06.2019 15:20:32,603 DEBUG [thread#9] CmdTcpServer:504 - thread#9: end all commands
24.06.2019 15:20:32,603 DEBUG [thread#9] CmdTcpServer:530 - thread#9: close socket



Обновление PrintServer не помогает. Сейчас работает 7.2_387 версия. С PrintServer 7.0_437 ситуация аналогична.
ККМ - Атол22.
а ККМ установлена последняя актуальная версия прошики 77.33
CashCheck плагин версии 7.0.155
Биллинг 7.0.993

Куда ещё копать, что ещё сделать?


Последний раз редактировалось linzmen 24 июн 2019, 15:03, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 14:32 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6051
Карма: 244
а какой ему формат нужен? биллинг никак это не проверяет и не должен, просто передаются теги как этого требует протокол.
даже если будут соответствующие методы в Check, то внутри сервера печати они всё равно будут ставиться точно так же как теги, как это делается для customerAddкess или имени/инн кассира, например.

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 14:41 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6051
Карма: 244
Тег| Наименование реквизита| Тип | Формат ЭФ| Формат ПФ |Фикс. |Длина |Примечание
1227 получатель (покупатель) Текст Строка {С} Нет 128
1228 ИНН получателя (покупателя) Текст Строка ЦЦЦЦЦЦЦЦЦЦ или ЦЦЦЦЦЦЦЦЦЦЦЦ Да 12 Если ИНН имеет длину меньше 12 цифр, то он дополняется справа пробелами

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 14:43 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6051
Карма: 244
Вот в таком виде передавать, версия сервера и плагина не имеет особого значения (если не совсем старые, конечно), дальше вопросы к ККТ исключительно

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 14:59 
Не в сети

Зарегистрирован: 31 авг 2015, 12:40
Сообщения: 10
Карма: 0
Откуда сведения про необязательность и длинну для тега 1227? И откуда сведения о том, что если ИНН меньше 12 его надо дополнять пробелами?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 15:51 
Не в сети

Зарегистрирован: 31 авг 2015, 12:40
Сообщения: 10
Карма: 0
В общем, экспериментальным путем выяснил, что ККМ воспринимает значение тега 1227 только в латинице.
Если кирилица тогда шибка #19 - неверный формат.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 16:01 
Не в сети

Зарегистрирован: 31 авг 2015, 12:40
Сообщения: 10
Карма: 0
Мммм, слушайте.
А это нормально, что в недрах ChashCheck плагина значение тега конвертируется сначала в массив байтов а потом обратно в строку?

Код:
 
public void setTag(int tag, String value) {
        this.setTag(tag, value.getBytes(StandardCharsets.UTF_8));
    }

    public void setTag(int tag, byte value) {
        this.setTag(tag, new byte[]{value});
    }

    public void setTag(int tag, byte[] value) {
        this.tags.put(tag, Utils.bytesToString(value));
    }


Зачем так странно, если значение уже строка?
Я почему спрашиваю.
Есть подозрение что из-за таких пертурбаций кирилических строк всё ломается.
По факту я пришёл к тому, что нельзя определять тэг строковым значением если там кирилица.
Иными словами, нельзя определить тег 1227 (в частности) кирилическим значением.

Например строковые значения, те, которые заданы через setString, использованы как есть, без преобразований. Разве что переводы строк вырезаны и строка затримана.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 17:10 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6051
Карма: 244
linzmen писал(а):
Откуда сведения про необязательность и длинну для тега 1227? И откуда сведения о том, что если ИНН меньше 12 его надо дополнять пробелами?

из интернета по запросу ффд тег 1227 , есть реестр и описание всех тегов

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 17:17 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6051
Карма: 244
linzmen писал(а):
Мммм, слушайте.
А это нормально, что в недрах ChashCheck плагина значение тега конвертируется сначала в массив байтов а потом обратно в строку?

Код:
 
public void setTag(int tag, String value) {
        this.setTag(tag, value.getBytes(StandardCharsets.UTF_8));
    }

    public void setTag(int tag, byte value) {
        this.setTag(tag, new byte[]{value});
    }

    public void setTag(int tag, byte[] value) {
        this.tags.put(tag, Utils.bytesToString(value));
    }


Зачем так странно, если значение уже строка?
Я почему спрашиваю.
Есть подозрение что из-за таких пертурбаций кирилических строк всё ломается.
По факту я пришёл к тому, что нельзя определять тэг строковым значением если там кирилица.
Иными словами, нельзя определить тег 1227 (в частности) кирилическим значением.

Например строковые значения, те, которые заданы через setString, использованы как есть, без преобразований. Разве что переводы строк вырезаны и строка затримана.

Это не совсем нормально, но здесь суть в том, что способ отдачи тега ККТ разный в зависимости от протокола итд, а вы показываете код передачи тега от плагина в сервер печати.
Конкретно в атол в бинарном протоколе (который реализован в драйвере atol3) они уходят всегда в массиве байт и по всей видимости в том формате/кодировке который хочет офд, а это, внимание, cp866 вообще, т.е. в сервере печати оно перекодируется в формат кажждого ККТ (например в атол-онлайне конечно так строкой и уходит).
А до сервера печати оно уходит в utf-8, как и в setString упомянутом (хотя в атолах заголовок позиций и строки уходят в модифицированном 1251 на самом деле).

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 24 июн 2019, 17:22 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6051
Карма: 244
Но вообще вы подняли правильный вопрос - теги надо как-то отчётливее передавать, вероятно тег каждого типа по-разному. Потому что в сервере печати типы никак неизвестны уже, когда их изначально делали немного всё по-другому было да и вообще теги для тестов по сути делали сначала, а сейчас напридумывали атрибутов.

Тогда сами попробуйте использовать байтовый setTag(int tag, byte[] value) и закодировать в байты вручную в cp866:

import java.nio.charset.Charset;

check.setTag(1227, contractName.getBytes(Charset.forName("cp866")))

если так работает - будем думать про апи тегов более внятный

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2019, 07:54 
Не в сети

Зарегистрирован: 31 авг 2015, 12:40
Сообщения: 10
Карма: 0
Благодарю за совет. Я уже и сам до этого дошёл но не проверил, смену закрыли.
Обязательно это проверю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2019, 08:15 
Не в сети

Зарегистрирован: 31 авг 2015, 12:40
Сообщения: 10
Карма: 0
Собственно говоря, работает.
Код:
            ContractParameterManager cp_readonly = new ContractParameterManager(this.con);
            String inn = cp_readonly.getStringParam(payment.getContractId(), 4);
            String contractName = cp_readonly.getStringParam(payment.getContractId(), 3);
//          Наименование покупателя - название договора
            logger.info("Client name:" + contractName);
            contractName = contractName.trim().replace('\n', ' ').replace('\r', ' ').replace('\t', ' ');
            check.setTag(1227, contractName.getBytes(Charset.forName("CP866")));
            logger.info("Client INN:" + inn);
//          ИНН покупателя, если он есть
            check.setTag(1228, String.format("%-12s", inn));


Благодарю за помощь.
Тему закрываю.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2019, 11:45 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6051
Карма: 244
ок тогда переделаем немного физическую передачу тегов в ближайшее время

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2019, 19:55 
Не в сети
Аватара пользователя

Зарегистрирован: 30 май 2008, 15:51
Сообщения: 6051
Карма: 244
выложено обновление, надо сервер печати и плагин обновить

_________________
I'm clever. I've got a computer.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.054s | 48 Queries | GZIP : On ]