Программа БИТ драйвер ккт поддерживает технологии маркировки по формату 1.2 для кассовых аппаратов Атол.
Речь о том, что в новом формате маркировки (1.2) должна происходить проверка на валидность кода перед продажей или точнее прямо в процессе продажи. Для этого конечно нужен интернет и конечно не плохой, хотя все таки самое наверное главное понимать, что ты делаешь и что ты хочешь получить.
Драйвер ккт Атол (у нас сейчас 10.10.0) предоставляет средства проверки кода маркировки на закладке "Маркировка" и на закладке "Работа с json":
Причем надо заметить, что ответ приходящий на команду в json формате более информативен и мы рекомендуем использовать именно запросы по json.
Берём любой штрих код маркировки, например на обуви, считываем его прямо в текстовом редакторе через сканер (USB HID, то есть как обычная клавиатура работает).

Текстовый редактор рекомендуем использовать notepad32, так как он позволяет показывать специальные (скрытые) символы.
Нас интересует символ GS, он равен байту со значением 0х1D. Дело в том, что сканеры штрих кода могут быть настроены так чтобы передавать этот символ без изменений, могут это GS символ вообще убирать из выдачи, но могут и преобразовывать в другое представление, например в четыре символа {GS}.
Так вот на закладке "Работа а json" в параметр "icm" надо подставлять букво-символы кода маркировки заменяя байт GS на \u001d. Правда есть ещё вариант преобразовывать исходный код маркировки в base64 формат, Атол также поймет и этот формат.
Далее пробуем выполнить запрос и наблюдаем ответ в контейнере offlineValidation.
fmCheck =true значит код валидный.
Чтобы лучше понять, что происходит на самом деле лучше включить логгирование в файл и посмотреть какие байты передаются в ккт.
Файл лога обычно находится здесь:
C:\User\.....\AppData\Roaming\ATOL\drivers10\logs
Общий принцип работы такой: мы посылаем запрос в ккт и ждём ответа в соответствие с временными настройками в кассе.
Ответ транслируется кассой в интернет серверу ИСМ. Но ответ может и не прийти (интернет...). В этом случае через некоторое время придет отказ с ошибкой тайм-аут.
Если процесс затягивается где-то в интернете его можно прервать специальной командой, например на закладке Маркировка.
Послать следующий запрос проверки без завершения предыдущего нельзя, это надо учитывать.
Проверить выполняется ли сейчас какой-либо запрос кода маркировки можно, для этого тоже есть спец. команда, смотрит json протокол атола.
Пример посылки команды с положительным ответом [M+]
Мы проверили на драйвере 10.10.0.0, ккт Атол FPrint 22ПТК прошивка 5.8.100 (ФН боевой, не тестовый). Итак чек с одной позицией, цена 0.00, пробился успешно.
Примечание: настройки кассы: сервер ОФД АО "Энергетические системы и коммуникации"
k-server.1-ofd.ru порт 7777,
ИСМ k-server.1-ofd.ru порт 7788,
ОКП 31.44.83.174 порт 26101 (это prod01.okp-fn.ru)
Пробиваем просто - кидаем на закладке работа с json в поле задание и жмем Выполнить задание.
{
"ignoreNonFiscalPrintErrors": true,
"items": [
{
"name" : "обувь",
"price" : 0.00,
"quantity" : 1.00,
"measurementUnit" : "шт",
"amount" : 0.00,
"paymentMethod" : "fullPayment",
"paymentObject" : "commodity",
"type" : "position",
"department" : 0,
"infoDiscountAmount" : 0,
"tax" : {
"type": "vat20"
},
"imcParams" : {
"imc": "MDEwMjkwMDAwMDQ3NTgzMDIxTWRFZng6WHA2WUZkNx05MTgwMjkdOTJhUUlRa0k3b0hYbXpHL21kS3h6Q1VDS1RKSFhvQk9EZG1DZE01azhRajdnYVpWMnhibjY2eEJYR0lLcnRmdnFQSU5BMmprYmp5ajMvTytreTZvdTFOQT09",
"imcModeProcessing": 0,
"imcType": "auto",
"itemEstimatedStatus": "itemPieceSold"
}
}
],
"operator": {
"name": "564646546465"
},
"payments": [
{
"sum": 0.00,
"type": "cash"
}
],
"taxationType": "osn",
"type": "sell",
"validateMarkingCodes": true
}
Чек пробился нормально, буква M+ появилась (как ни странно). Дело в том, что сам код маркировки взят с сайта https://integration.atol.ru/api/#fiskalnye-cheki . То есть это из примера пробития чека от самого Атола, но вот что это за код маркировки может тестовый какой (на самом деле это base64 закодированный).
Но тем не менее именно в начале настройки маркировки очень трудно понять почему чек с маркировкой не работает. Поэтому надо тупо сделать как в нашем примере выше и много прояснится.
Надо добавить, что "validateMarkingCodes": true является обязательным параметром, иначе чек вернет [409] не корректный код маркировки. По-видимому это означает, что без обязательной проверки кода маркировки в интернете нельзя пробивать чеки с маркировкой по ФФД1.2
И вот такой ответ вы должны увидеть чуть ниже в том же окне:
{
"fiscalParams" : {
"fiscalDocumentDateTime" : "2024-02-06T13:21:00+03:00",
"fiscalDocumentNumber" : 70,
"fiscalDocumentSign" : "0059975976",
"fiscalReceiptNumber" : 2,
"fnNumber" : "7281440501183115",
"fnsUrl" : "www.nalog.gov.ru",
"registrationNumber" : "0000942807046545",
"shiftNumber" : 22,
"total" : 0
},
"validateMarks" : [
{
"driverError" : {
"code" : 0
},
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : true,
"imcCheckResult" : true,
"imcEstimatedStatusCorrect" : true,
"imcStatusInfo" : true
},
"offlineValidation" : {
"fmCheck" : true,
"fmCheckErrorReason" : "checked",
"fmCheckResult" : true
},
"onlineValidation" : {
"imcType" : "imcFmVerifyCode88",
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : true,
"imcCheckResult" : true,
"imcEstimatedStatusCorrect" : true,
"imcStatusInfo" : true
},
"markOperatorItemStatus" : "itemEstimatedStatusCorrect",
"markOperatorResponse" : {
"itemStatusCheck" : true,
"responseStatus" : true
},
"markOperatorResponseResult" : "correct"
},
"sentImcRequest" : true
}
],
"warnings" : {}
}
Еще один вариант
Далее мы пробуем в поле "imc" подставлять другие откуда попало коды маркировки и наблюдаем только один результат - это [409] не корректный код маркировки. Но не отчаивайтесь проблема решается заменой байта GS на \u001d в коде json пакета. И вот вам второй пример,Ю который пробьет чек нормально с буквой [M+]. Код маркировки взят с какой-то коробки обуви.
Примечание: настройки кассы: сервер ОФД АО "Энергетические системы и коммуникации"
k-server.1-ofd.ru порт 7777,
ИСМ k-server.1-ofd.ru порт 7788,
ОКП 31.44.83.174 порт 26101 (это prod01.okp-fn.ru)
{
"ignoreNonFiscalPrintErrors": true,
"items": [
{
"name" : "обувь",
"price" : 0.00,
"quantity" : 1.00,
"measurementUnit" : "шт",
"amount" : 0.00,
"paymentMethod" : "fullPayment",
"paymentObject" : "commodity",
"type" : "position",
"department" : 0,
"infoDiscountAmount" : 0,
"tax" : {
"type": "vat20"
},
"imcParams" : {
"imc": "010843399791281021xTJKD2Fc:DorI\u001d918097\u001d92kf158zZIRc5pkQP9FHIupiPmC8ko9LbbgpVnW3OFSrVrj2dG57De2BmWmhqQ8v1dDV8vTvRM3fcBlj8dfq3xfA==",
"imcModeProcessing": 0,
"imcType": "auto",
"itemEstimatedStatus": "itemPieceSold"
}
}
],
"operator": {
"name": "564646546465"
},
"payments": [
{
"sum": 0.00,
"type": "cash"
}
],
"taxationType": "osn",
"type": "sell",
"validateMarkingCodes": true
}
Ответ такой (положительный), чек пробился:
{
"fiscalParams" : {
"fiscalDocumentDateTime" : "2024-02-06T14:15:00+03:00",
"fiscalDocumentNumber" : 72,
"fiscalDocumentSign" : "2489517282",
"fiscalReceiptNumber" : 4,
"fnNumber" : "7281440501183115",
"fnsUrl" : "www.nalog.gov.ru",
"registrationNumber" : "0000942807046545",
"shiftNumber" : 22,
"total" : 0
},
"validateMarks" : [
{
"driverError" : {
"code" : 0
},
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : true,
"imcCheckResult" : true,
"imcEstimatedStatusCorrect" : true,
"imcStatusInfo" : true
},
"offlineValidation" : {
"fmCheck" : true,
"fmCheckErrorReason" : "checked",
"fmCheckResult" : true
},
"onlineValidation" : {
"imcType" : "imcFmVerifyCode88",
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : true,
"imcCheckResult" : true,
"imcEstimatedStatusCorrect" : true,
"imcStatusInfo" : true
},
"markOperatorItemStatus" : "itemEstimatedStatusCorrect",
"markOperatorResponse" : {
"itemStatusCheck" : true,
"responseStatus" : true
},
"markOperatorResponseResult" : "correct"
},
"sentImcRequest" : true
}
],
"warnings" : {}
}
Тестовый ФН
Надо сказать, что на тестовом ФН (ФФД 1.2) чек НЕ пробивается, а именно касса долго думает (ждет ответ от ИСМ, около 1 мин) и завершается примерно с таким содержанием:
Примечание: настройки кассы: сервер ОФД АО "Энергетические системы и коммуникации"
k-server.1-ofd.ru порт 7777,
ИСМ k-server.1-ofd.ru порт 7788,
ОКП 31.44.83.174 порт 26101 (это prod01.okp-fn.ru)
{
"validateMarks" : [
{
"driverError" : {
"code" : 421,
"description" : "Превышен таймаут ожидания ответа от сервера",
"error" : "responseTimeout"
},
"offlineValidation" : {
"fmCheck" : true,
"fmCheckErrorReason" : "checked",
"fmCheckResult" : true
}
}
]
}
Лекарства
Можете протестировать еще код, который мы просто взяли дома от какого-то лекарства, также заменяем GS на \u001d 0104601026039010210000000859384\u001d91ee05\u001d92HGEnysoAmPV+g/jZB78AAFlmwo53Huputa7v5GfB5dw=
А если из кода убрать \u001d чек не печатается (offlineValidation сразу выдает "fmCheckErrorReason" : "typeIncorrect")
Выводы
1. Если вы пользуетесь json командами Атола, то надо обязательно заменять символы GS на \u001d.
2. Тестовый накопитель для отладки вам скорее всего не поможет.
3. К счастью в целях тестирования модно указывать нулевую сумму, хотя все это не совсем корректно.
4. Не надо обращать внимание на код Атола, который используется для их примеров. Почему он проходит до сих пор не понятно.
5. Наличие в остатках (где-то в честном знаке) похоже не контролируется нигде. [M+] означает только валидность кода маркировки.
6. Сканер в зависимости от раскладки клавиатуры будет считывать разные данные со штрих кода (если сканер работает как внешняя клавиатура).
И вот теперь возвращаемся опять к символу GS, который надо заменять на \u001d. А если GS байтов изначально нет в считанном коде, точнее сканер его отрезал автоматически или в форме куда вы считываете код маркировки (а ведь это всегда какое-то окно на экране) спец байты тоже отрезаются автоматом. То ничего работать не должно.
Примечание: код маркировки от Атола (в его примерах) :
MDEwMjkwMDAwMDQ3NTgzMDIxTWRFZng6WHA2WUZkNx05MTgwMjkdOTJhUUlRa0k3b0hYbXpHL21kS3h6Q1VDS1RKSFhvQk9EZG1DZE01azhRajdnYVpWMnhibjY2eEJYR0lLcnRmdnFQSU5BMmprYmp5ajMvTytreTZvdTFOQT09
Это не что иное как преобразованный в base64 код маркировки:
010290000047583021MdEfx:Xp6YFd791802992aQIQkI7oHXmzG/mdKxzCUCKTJHXoBODdmCdM5k8Qj7gaZV2xbn66xBXGIKrtfvqPINA2jkbjyj3/O+ky6ou1NA==
Таким образом по-видимому можно значение кода маркировки передавать и в base64 виде.