Маркировка на ККТ АТОЛ с ФФД 1.2
Учетные задачи - Кассовые операции
Всем доброго дня.
Уверен, что многие еще столкнутся с данной проблемой, после перепрошивки кассовых аппаратов АТОЛ на версию формата фискальных данных 1.2. Эта информация в основном для тех, кто поддерживает самописные конфигурации.
Ранее мы просто брали GTIN и серийный номер из маркировки, формировали 16-ричный код и записывали его в реквизит 1162.
Теперь этот путь закрыт.
Основная суть изменившегося подхода при пробитии чека - мы должны занести в память кассового аппарата полный код маркировки с криптохвостом, проверить его и проверенный код пробить в чеке, чтобы получить заветный [M+].
Мой код для отражения продажи/возврата маркированной продукции,передаваемой в Честный Знак, тестировалось на драйвере DTO 10.9.1.0:
//Переменные на входе
// Кассир - ФИО кассира
// ВидЧека - "ПРОДАЖА" или "ВОЗВРАТ"
// Телефон - телефон контрагента
// ШтрихкодМаркировки - маркировка товара из системы Честный Знак
// Номенклатура - название товара
// Цена,Количество,СуммаНДС (в примере 20%)
// СуммаАванса,СуммаНал,СуммаБезнал
//Переменные на выходе
// НомерЧека, НомерДокумента
//Обращаемся к объекту драйвера DTO10
//Инициализируем параметры кассы.
FR = Новый COMОбъект("AddIn.Fptr10");
FR.setSingleSetting(FR.LIBFPTR_SETTING_MODEL, Строка(FR.LIBFPTR_MODEL_ATOL_AUTO));
FR.setSingleSetting(FR.LIBFPTR_SETTING_PORT, FR.LIBFPTR_PORT_COM);
FR.setSingleSetting(FR.LIBFPTR_SETTING_COM_FILE, 1);
FR.setSingleSetting(FR.LIBFPTR_SETTING_BAUDRATE, 9600);
FR.setSingleSetting(FR.LIBFPTR_SETTING_ACCESS_PASSWORD, "0");
FR.setSingleSetting(FR.LIBFPTR_SETTING_USER_PASSWORD, 1);
FR.applySingleSettings();
Если FR.open()<>0 тогда //Соединение с ККТ
Сообщить("Ответ: "+FR.errorCode()+" Ошибка: "+FR.errorDescription());
возврат;
КонецЕсли;
FR.setParam(1021, СокрЛП(Кассир));
FR.operatorLogin();
// После прошивки - важный параметр "Система налогообложения",
// который слетает в неопределенность.
// Либо ставьте в драйверве в регистрации по умолчанию, либо указывайте явно
FR.setParam(1055, FR.LIBFPTR_TT_OSN);
//FR.setParam(1055, fptr.LIBFPTR_TT_ENVD);
Попытка
//стираем все запрошенные маркировки из памяти кассового аппарата
FR.clearMarkingCodeValidationResult();
Исключение
КонецПопытки;
Если ВидЧека = "ВОЗВРАТ" тогда
FR.setParam(FR.LIBFPTR_PARAM_RECEIPT_TYPE, FR.LIBFPTR_RT_SELL_RETURN);
Иначе
FR.setParam(FR.LIBFPTR_PARAM_RECEIPT_TYPE, FR.LIBFPTR_RT_SELL);
КонецеСли;
FR.setParam(FR.LIBFPTR_PARAM_RECEIPT_ELECTRONICALLY, false);
Если не СокрЛП(Телефон) = "" тогда
FR.setParam(1008, СокрЛП(Телефон));
КонецЕСли;
FR.openReceipt();
status = 1;
Разделитель = Символ(29);
ПодготовленныйШК = СокрЛП(ШтрихкодМаркировки);
ПодготовленныйШК = СтрЗаменить(ПодготовленныйШК,Разделитель,"");
КМ = Лев(ПодготовленныйШК, 31) + Разделитель + Сред(ПодготовленныйШК, 32, 6) + Разделитель + Сред(ПодготовленныйШК, 38);
//Получился код маркировки с восстановленными знаками GS1, если вдруг их не было в строке
//Много где было сказано, что надо использовать только 16-ричную кодировку. Это не так.
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_TYPE, FR.LIBFPTR_MCT12_AUTO);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE, КМ);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT, Истина);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
FR.beginMarkingCodeValidation();
ВремяНачала = ТекущаяДата();
ВремяОжидания = 100;
// Начало проверки
Пока истина Цикл
FR.getMarkingCodeValidationStatus();
Если FR.getParamBool(FR.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY) тогда
прервать;
КонецЕсли;
Если ТекущаяДата() - ВремяНачала > ВремяОжидания тогда
прервать;
КонецЕсли;
КонецЦикла;
validationResult = FR.getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
FR.acceptMarkingCode();
//Наш штрихкод проверен и занесен в память аппарата
// Теперь его ОБЯЗАТЕЛЬНО надо повторить в самой продаже
// Если этого не сделать - то ничего и не отошлется
FR.setParam(FR.LIBFPTR_PARAM_COMMODITY_NAME,СокрЛП(Номенклатура));
FR.setParam(FR.LIBFPTR_PARAM_PRICE, Окр(Цена,2));
FR.setParam(FR.LIBFPTR_PARAM_QUANTITY, Количество);
FR.setParam(FR.LIBFPTR_PARAM_TAX_TYPE,FR.LIBFPTR_TAX_VAT20);
FR.setParam(FR.LIBFPTR_PARAM_TAX_SUM, СуммаНДС);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE, КМ);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_STATUS, status);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
Если FR.registration() <> 0 тогда
Сообщить("Ответ: "+FR.errorCode()+" Ошибка: "+FR.errorDescription());
FR.cancelReceipt();
Возврат;
КонецЕсли;
//Оплата
Если СуммаАванса>0 тогда
FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_TYPE, FR.LIBFPTR_PT_PREPAID);
FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_SUM, СуммаАванса);
FR.payment();
КонецеСли;
Если СуммаНал>0 тогда
FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_TYPE, FR.LIBFPTR_PT_CASH);
FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_SUM, СуммаНал);
FR.payment();
КонецеСли;
Если СуммаБезнал>0 тогда
FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_TYPE, FR.LIBFPTR_PT_ELECTRONICALLY);
FR.setParam(FR.LIBFPTR_PARAM_PAYMENT_SUM, СуммаБезнал);
FR.payment();
КонецеСли;
FR.closeReceipt();
//открыть ящик
FR.openDrawer();
FR.setParam(FR.LIBFPTR_PARAM_DATA_TYPE, FR.LIBFPTR_DT_STATUS);
FR.queryData();
НомерЧека = FR.getParamInt(FR.LIBFPTR_PARAM_RECEIPT_NUMBER);
НомерДокумента = FR.getParamInt(FR.LIBFPTR_PARAM_DOCUMENT_NUMBER);
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
ККМ Кассовые операции Розничная торговля НДС 22% Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 1.6 1С:Бухгалтерия автономного учреждения Россия Платные (руб)
Универсальная обработка для обслуживания любых фискальных регистраторов (ККТ), в том числе Веб сервер АТОЛ. Работает в соответствии с 54-ФЗ. (ФФД 1.0, ФФД 1.05, ФФД 1.1, ФФД 1.2). Подключайте любую онлайн кассу к практически любой конфигурации на обычных формах. Нет необходимости обновлять 1С. Можно бесплатно скачать и протестировать. Может работать одновременно с несколькими онлайн-кассами, либо одной с разных рабочих мест. (через RDP, TCP\IP или веб-сервер) Позволяет разделить один чек сразу на несколько ККТ или на несколько систем налогообложения. Поддерживает разрешительный режим и маркировку. Поддерживает локальный модуль честного знака для офлайн проверки. Можно настроить собственный шаблонов чека. Можно использовать эквайринг там, где он не поддерживается. Работает на LINUX и Windows Адаптировано к ставке НДС 22% и ТС ПИоТ.
6100 руб.
27.02.2017 918501 6629 10489
ККМ Кассовые операции Розничная торговля НДС 22% Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия автономного учреждения Россия Платные (руб)
Обработка осуществляет обслуживание ККТ АТОЛ, Штрих, Вики Принт и Меркурий для конфигураций "УТ 10.3", "КА 1.1", "УПП 1.3", "Розница 1.0", "БП 2.0" и других отраслевых решений, построенных на основе указанных выше конфигурациях. Поддерживает возможность параллельно пробития чеков на одной ККМ несколькими пользователями. Поддерживает Веб-сервер Атол. Соответствует требованиям 54-ФЗ. Поддерживает ФФД 1.0, 1.05, 1.1 и 1.2. Разделяет чеки по нескольким СНО. Поддерживает механизмы подключения ККТ по TCP/IP, для работы через RDP или интернет. Поддержка маркировки и разрешительного режима. Поддержка пробития чеков с новыми ставками НДС 5%, НДС 7% и НДС 22%.
7900 руб.
25.05.2015 405856 2035 3372
ККМ Розничная торговля Системный администратор Разработчик 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)
Обмен между 1С:Розница и Frontol 6 при торговле от нескольких организаций, а также ряд других полезных функций. Данный модуль синхронизации незаменим для тех, кто ведёт учет по нескольким организациям в 1С:Розница, а на РМК (рабочем месте кассира) установлен Frontol или планируется его установка. Подходит для 1С:Розница 2.3 / 3.0, 1С:УНФ 3.0
4200 руб.
22.03.2019 106389 891 494
ККМ Кассовые операции Розничная торговля Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)
Расширение для типовых конфигураций для Управляемых форм позволяет выполнять печать кассовых чеков на одну ККМ 54-ФЗ с нескольких рабочих мест. НИКАКИХ НАСТРОЕК В РАЗРАБОТКЕ - ПОДКЛЮЧИЛ И ПЕЧАТАЙ. Если у вас несколько отделов и одна ККМ - печатайте на одной ККМ! Если у вас две ККМ и одна поломалась - печатайте на одной ККМ, пока ремонтируете другую! Решение для розничных продаж! Обновление 19.03.26 для 1С:Розница 2.3.23 и 27.04.2026 для 1С:УТ 11.5.25 в новых релизах tcp/ip. Реализована работа с ПИОТ.
9500 руб.
27.08.2018 142189 827 603
Кассовые операции Файловый обмен (TXT, XML, DBF), FTP ЭДО и ОФД НДС 22% Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Бухгалтерский учет Налоговый учет Управленческий учет Платные (руб)
Специализированные обработки для загрузки кассовых чеков в локальных базах: 1С:БП 3.0, 1С:УНФ 3.0, 1С:Розница 3.0, 1С:КА. 2.5, 1С:ERP Управление предприятием 2.5 и 1С:УТ 11.5. Вы просто сканируете QR коды с бумажных и электронных чеков c помощью мобильного приложения ФНС или сканера штрихкодов и чеки автоматически (без ручного ввода) загружаются в документы 'Авансовый отчет', 'Расходы предпринимателя', 'Путевой лист', 'Приходная накладная', 'Поступление (акты, накладные, УПД)', 'Приобретение товаров и услуг', 'Отчет о розничных продажах', 'Поступление денежных документов' и 'Реестры выплат самозанятым'. Обработка будет работать на любой версии конфигурации управляемые формы: базовой, ПРОФ или КОРП. Для загрузки чеков самозанятых достаточно только ссылки на чек.
6990 руб.
19.08.2020 83834 383 93
ККМ Кассовые операции Розничная торговля НДС 22% Системный администратор Разработчик Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Торговля и склад 7.7 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 10 1С:Управление торговлей 11 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Платные (руб)
«Сервер ККМ» позволяет приложениям работать с фискальными регистраторами по локальной сети или интернет, организовать печать на одном ККМ с нескольких рабочих мест или нескольких баз 1С. Поддержка ТСПИоТ для Атол, Штрих, Ритейл и РР-Электро. Возможность работы с ТСПИоТ без изменения конфигурации 1С! Поддерживаются ВСЕ ревизии требований фирмы 1С к разработке драйверов ККТ от 2.0 до 4.7. Бесплатные функции: Эмулятор ККМ с возможностью эмуляции различных сбоев, печать чеков продажи и покупки до 1000р, прочие виды чеков - без ограничений.
18000 руб.
02.09.2016 160585 243 210
Кассовые операции Розничная торговля ККМ 1С 8.3 1С 8.5 1С:Розница 2 1С:Управление торговлей 11 Россия Платные (руб)
Расширение для «Розницы» 2.3 и «Управления торговлей» 11.5. При сканировании пачки сигарет ставит в строку чека МРЦ из её кода маркировки. Возвращает коды маркировки на свои строки перед пробитием: типовая программа в чеке с пачками разной МРЦ может отправить в ККТ и «Честный знак» код одной пачки с ценой другой. Не даёт пробить чек дороже МРЦ. Конфигурацию не меняет.
23.09.2026 5275 14 G_100802897175107255412 0
Кассовые операции ЭДО и ОФД Бухгалтер 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Бухгалтерский учет Платные (руб)
Согласно 54-ФЗ по правилам ведения кассовых операций необходимо оформлять приходные кассовые ордера (ПКО) и расходные кассовые ордера (РКО) на основании чеков ККМ. Все данные о чеках, можно взять на сайте оператора фискальных данных (ОФД). Обработка загрузки данных из ОФД в 1С сделает за вас в 1С - ПКО и РКО, Операции по платежным картам или Отчет о розничных продажах (может создать номенклатуру в 1С, указать налоги и др. реквизиты в документах в зависимости от налогообложения ККМ в торговой точке).
7320 руб.
09.08.2017 170381 1014 377
{
"type": "sell",
"validateMarkingCodes": true,
"operator": {
"name": "Иванов",
"vatin": ""
},
"electronically": false,
"items": [
{
"type": "position",
"name": "*3282705 Товар",
"price": 299.95,
"quantity": 1.0,
"measurementUnit": "piece",
"amount": 299.95,
"infoDiscountAmount": 0.0,
"tax": {
"type": "vat20",
"sum": 0.0
},
"paymentObject": "commodityWithMarking",
"paymentMethod": "fullPayment",
"imcParams": {
"imcType": "auto",
"imc": "MDEwMjkwMDAwMDQ3NTgzMDIxTWRFZng6WHA2WUZkNx05MTgwMjkdOTJhUUl Ra0k3b0hYbXpHL21kS3h6Q1VDS1RKSFhvQk9EZG1DZE01azhRajdnYVpWMnh ibjY2eEJYR0lLcnRmdnFQSU5BMmprYmp5ajMvTytreTZvdTFOQT09",
"itemEstimatedStatus": "itemPieceSold",
"imcModeProcessing": 0
}
}
],
"payments": [
{
"type": "0",
"sum": 300.0
}
],
"taxes": [],
"total": 299.95,
"clientInfo": {
"emailOrPhone": "address@mail.ru"
},
"companyInfo": {
"email": "test@ofd.ru"
}
}
ПоказатьДля примера:
И такой код
010467018882925021xpFnolGDIAy9p91EE0692aTIUIotYb7jKc0OBacg
И такой код
010467018882925021xpFnolGDIAy9p91EE0692aTIUIotYb7jKc0OBacgOK
на выходе должны дать
010467018882925021xpFnolGDIAy9p91EE0692aTIUIotYb7jKc0OBacg
любопытна.
А как насчет того, что для фототоваров серийный номер (то, что находится после кода применения 21) содержит не 13 символов, а больше?
А код маркировки молочной продукции для групповой упаковки меньше.
А с табаком там вообще фиг поймешь
Минули меня стороной данные типы маркированной продукции, однако данный пост скорее показывает как без ошибки сформировать чек на ККТ АТОЛ с ФФД 1.2, нежели универсальный алгоритм замещения символов.
Тогда оговорюсь - алгоритм замещения символов корректен для шин, одежды, обуви.
В других типах маркировки следует обращать внимание на описанный в Честном Знаке формат маркировки.
А сколько этих типов завтра придумают одному Алишеру известно..
А еще буду очень благодарен тем, кто сталкивался с работой маркировки ФФД 1.2 в реальных условиях и смог бы проконсультировать меня по таким вопросам:
1. В документации по драйверу и примерам обычно описывается ситуация, когда код маркировки проверяется в момент формирования чека, ну или до его открытия. Сколько в среднем занимает по времени проверка кода маркировки онлайн?
Мне хотелось бы организовать эту проверку на этапе добавления товара в реализацию до формирования фискального чека, чтобы можно было уже на этом этапе отказаться от продажи товара, если проверка кода была неуспешна.
2. Как средствами драйвера организовать проверку оффлайн и нужно ли это? Если я правильно понимаю, то оффлайн проверка это проверка кодов самим ФН. Откуда они там берутся и что такое "ключ проверки", упоминаемый в документации?
3. Судя про приведенному примеру, чек будет сформирован на все товары, если маркировка успешна будет напечатано "М+", если нет, то "М-". Что потом делать с товарами, которые продались с "М-"?
1. Онлайн проверка кода занимает немного времени - буквально секунды (я имею ввиду розничную продажу, когда кодов от силы 4 (например шины)) НО. Я пробовал проверить коды без открытия чека, а потом их продать - ругается аппарат. Только после того как чек открыт , прошла проверка, коды маркировки подтянулись - все отрабатывает как надо. Как вариант - можно чек открыть, проверить и отменить, однако проще по-моему проверить статус непосредственно через АПИ Честного знака. Это те же секунды. Правда, для этого на компьютере должна быть электронная подпись. Да и нужно ли их проверять в момент продажи - вопрос. Приняли товар, проверили коды и забыли. А далее уже в момент онлайн проверки ККМ - чтобы [M+] получить.
2. Оффлайн проверка, как я понял - это проверка на формат самой маркировки. Нужно указать тип маркировки и аппарат проверит, что код маркировки валиден. Естественно, о том, есть он в Честном знаке или нет и в каком он статусе, аппарат не скажет.
3. Если хоть один код маркировки не пройдет проверку, чек не нужно печатать - товар который не прошел проверку нужно заменить на другой.
Добрый день. Подскажите где в 1с Ка 2.4 увидеть, что код маркировки не прошел проверку? Я только в самом чеке это вижу.
В документации от Атола есть метод "validateMarks" ("Проверка массива КМ"), который позволяет проверить массив данных о кодах маркировки (далее КМ) в одно действие; результатом является массив результатов проверки каждого из КМ (порядок в ответе соответствует порядку в запросе). Если я правильно понял, то выигрыш в сравнении с методом "beginMarkingCodeValidation", как минимум, в отсутствии необходимости опрашивать фискальник на наличие результата после каждого КМ.
На fs.atol.ru / Программное обеспечение / ДТО / 10.х / существует файл "Работа с ФФД 1.2.pdf". В нём для JSON есть три блок-схемы взаимодействия с фискальником, во второй из них как раз используется метод "validateMarks".
В том же pdf есть пример, где параметр "validateMarkingCodes" в методе "sell" используется со значение "false", т.е. в этом методе уже не надо повторно выполнять проверку КМ, а только записать их чтобы фискальник передал их ОФД.
Ещё раз повторюсь, я сейчас только разбираюсь и потому уверенность в своих выводах не стопроцентная.
У меня как раз и не получалось сначала ВСЕ проверить, а потом просто указать коды с признаком успешной валидации.
Когда я делал проверку валидации отдельно, до открытия чека, - он упорно не отсылал код в ЧЗ и признак [M+] не ставил.
Поэтому я оставил построчную проверку и отправку внутри открытого чека.
Попробуйте - возможно в варианте JSON запроса все отработает как нужно. Удачи в тестировании!
Хорошие примеры, позволяющие понять последовательность, нашёл в онлайн документации от атола (integration. и далее).
Слева выбрать "Работа с марками в ФФД 1.2" а справа смотреть примеры для "Python" или "Java"
Примеры JSON |
|---|
| (все коды товаров "поломал" специально)
ПРОВЕРКА МАССИВА КОДОВ: { "type": "validateMarks", "timeout": 60000, "params": [ { "imcType": "auto", "imc": "MDEwNTkwNj*************jIxWjxmISZ5VV9aIXJtPh05MUVFMDcdOTJ6dzdCZ0FwaWQ2TkxCUTg5TFlhL "itemEstimatedStatus": "itemPieceSold", "imcModeProcessing": 0 }, { "imcType": "auto", "imc": "MDEwNTkwMT*******************k/R1RPU0o4bx05MUVFMDcdOTJDQVJqNTNPMnpWUTFQVkZyWS83VmNHQVA1Tk "itemEstimatedStatus": "itemPieceSold", "imcModeProcessing": 0 } ] } в ответе, в зависимости от ситуации, надо обращать внимание на разные секции и значения. при успешном выполнении правильные коды автоматически добавятся в буфер, состояние которого можно проверить { "type": "checkImcWorkState" } ----------------- РЕГИСТРАЦИЯ ЧЕКА: { "type": "sell", "validateMarkingCodes": false, "taxationType": "osn", "ignoreNonFiscalPrintErrors": false, "operator": { "name": "Ю**** И.Г.", "vatin": "9102*********" }, "electronically": false, "items": [ { "type": "position", "name": "11126 La Rive туалетная вода 90 мл red line {12}", "price": 100.00, "quantity": 1.0, "measurementUnit": "piece", "amount": 100.00, "tax": { "type": "vat20" }, "paymentObject": "commodityWithMarking", "paymentMethod": "fullPayment", "imcParams": { "imcType": "auto", "imc": "MDEwNTkw********************************aIXJtPh05MUVFMDcdOTJ6dzdCZ0FwaWQ2TkxCUTg5TFlhL1lFdHQ0OTc3NTJ "itemEstimatedStatus": "itemPieceSold", "imcModeProcessing": 0 } } ], "payments": [ {"type": "cash", "sum": 100.00 } ], "total": 100.00 } после успешной регистрации чека буфер очищается автоматически |
Подскажите, как вы кодируете КМ? Я беру полный КМ (с криптохвостом), меняю GS1 на символ(29) и перегоняю в Base64. КМ в таком виде нормально принимает тест маркировки в ДТО, но он же в json возвращается с ошибкой "409 Некорректный код маркировки".
Я сначала в тестовой утилите занимался отладкой JSON, а когда получилось полностью прогнать всю цепочку действий, тогда отдал эти JSONа разработчику кассовой программы.
В случае ругательств на некорректность КМ я всегда дополнительно проверял их в УТ 11: Закупки - Обмен с ИС МП - (см. также) Проверка кодов маркировки - получалось информативней. Причём как в base64, так и в чистом виде.
В целом в принципе то все понятно, но вот, что в Вашем примере:
validationResult = FR.getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
FR.acceptMarkingCode();
что в примерах того же Атола, выходит, что Вы получаете результат проверки и сразу же делаете акцепт.
То есть акцепт никак не зависит от результатов проверки? А как же тогда это: " Если хоть один код маркировки не пройдет проверку, чек не нужно печатать - товар который не прошел проверку нужно заменить на другой."
Тем более у Вас там таймаут есть при проверке, то есть КМ в принципе может даже не завершить еще проверку,
что тогда будет в validationResult? Ноль?
Смысл том что в цикле мы сначала запрашиваем статус функцией FR.getMarkingCodeValidationStatus();
и если переменная FR.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY равна TRUE,
то тогда цикл прерывается и уже в переменную FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT записывается результат проверки.
Цикл также может прерваться по таймауту, но в случае проверки одного кода - этого таймаута достаточно.
Т.е. проверка происходит в цикле выше, а не в конструкции getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
И опять же, что возвращается в этом параметре:
validationResult = FR.getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
если цикл завершился по таймауту?
вот я и не могу понять, почему ни в Вашем примере ни в Атоловском это не проверяется
В любом случае, если результат не удовлетворительный, чек не пробьется по ошибке в момент регистрации
FR.registration() <> 0
Спасибо большое. Пока не на чем было тестироваться, возможно завтра наконец привезут МГМ с ФФД 1.2
и тогда все станет окончательно ясно.
остался еще один непонятный момент, метод writeSalesNotice
в документации числится для передачи уведомления о реализации товара,
а в Вашем примере его нет, он не обязателен?
Для товарных групп: Шины, Легкая промышленность, Духи, Обувь, заполнять тег 1265 "Значение отраслевого реквизита" не требуется.
Если у Вас необходимо отправлять уведомление, то значит нужно выполнять этот метод.
Ранее я приводил пример проверки массива кодов маркировки (validateMarks). Результат может быть двух видов (визуально, не обращая внимания на значения)
Если фискальник смог связаться с сервисом проверки кодов |
|---|
[
{
"driverError" : {
"code" : 0
},
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : true,
"imcCheckResult" : true,
"imcEstimatedStatusCorrect" : true,
"imcStatusInfo" : true
},
"offlineValidation" : {
"fmCheck" : false,
"fmCheckErrorReason" : "typeIncorrect",
"fmCheckResult" : false
},
"onlineValidation" : {
"imcType" : "imcVerifyCode44",
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : true,
"imcCheckResult" : true,
"imcEstimatedStatusCorrect" : true,
"imcStatusInfo" : true
},
"markOperatorItemStatus" : "itemEstimatedStatusCorrect",
"markOperatorResponse" : {
"itemStatusCheck" : true,
"responseStatus" : true
},
"markOperatorResponseResult" : "correct"
},
"sentImcRequest" : true
},
{
"driverError" : {
"code" : 0
},
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : true,
"imcCheckResult" : true,
"imcEstimatedStatusCorrect" : true,
"imcStatusInfo" : true
},
"offlineValidation" : {
"fmCheck" : false,
"fmCheckErrorReason" : "typeIncorrect",
"fmCheckResult" : false
},
"onlineValidation" : {
"imcType" : "imcVerifyCode44",
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : true,
"imcCheckResult" : true,
"imcEstimatedStatusCorrect" : true,
"imcStatusInfo" : true
},
"markOperatorItemStatus" : "itemEstimatedStatusCorrect",
"markOperatorResponse" : {
"itemStatusCheck" : true,
"responseStatus" : true
},
"markOperatorResponseResult" : "correct"
},
"sentImcRequest" : true
}
]
Показать |
Если фискальник НЕ смог связаться с сервисом проверки кодов |
|---|
[
{
"driverError" : {
"code" : 402
},
"offlineValidation" : {
"fmCheck" : false,
"fmCheckErrorReason" : "typeIncorrect",
"fmCheckResult" : false
},
"onlineValidation" : {
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : false,
"imcCheckResult" : false,
"imcEstimatedStatusCorrect" : false,
"imcStatusInfo" : false
}
},
"sentImcRequest" : false
},
{
"driverError" : {
"code" : 402
},
"offlineValidation" : {
"fmCheck" : false,
"fmCheckErrorReason" : "typeIncorrect",
"fmCheckResult" : false
},
"onlineValidation" : {
"itemInfoCheckResult" : {
"ecrStandAloneFlag" : false,
"imcCheckFlag" : false,
"imcCheckResult" : false,
"imcEstimatedStatusCorrect" : false,
"imcStatusInfo" : false
}
},
"sentImcRequest" : false
}
]
ПоказатьВместо 402 могут быть другие 4хх, например, 421 |
В обоих случаях ответ содержит секцию "itemInfoCheckResult".
В описании API на integration_atol_ru есть "Пример чека прихода (предварительная проверка маркированного товара под ФФД ≥ 1.2, передача кода маркировки)". Который, по сути, является примером использования метода "sell".
У этого метода есть параметр "items", содержащий данные строк. Для каждой строки может быть задано много параметров, но нам сейчас важен "imcParams". В этом объекте есть несколько параметров, среди которых есть "itemInfoCheckResult" (Результат проверки). Так вот, в случае регистрации чека ("type": "sell") при "validateMarkingCodes": false (проверка КМ проводится заранее и не проводится в момент регистрации) в упомянутый чуть выше параметр строки "itemInfoCheckResult" следует передавать набор значений, полученный ранее при проверке КМ по массиву (validateMarks). Этот результат определяет какой вариант будет напечатан в чеке: М / М- / М+.
Задавал вопрос в Атол:
временно отсутствует доступ в интернет?
Получил ответ:
послали запрос на проверку
получили статус "сервер ИСМ не отвечает"
с этим статусом и произвели регистрацию
Т.е. разработчик ПО "сам" указывает статус, с которым будет происходить регистрация. Скорее всего, в коммерческих решениях всё сделано правильно, но вот в самописных...
1. Какой код ошибки и описание ошибки?
2. Какой-то конкретный код не передается, а остальные передаются? Если да, то его желательно показать
3. Что пишет лог кассы?
4. Пользуетесь для передачи программным кодом из публикации или чем-то другим?
2)Тестировал на двух кодах - оба не передаются
3)Лог могу куда нибудь в мессенджер прислать
4)Использую почти полностью код твой, только момент подключения к ККМ другой. Там стучит по tcpip, но думаю это не принципиально, связь с кассой есть.
0104717784236841215ga2rHsmCq>?H91EE0692MbGeVwKZokrwRA64WXuL/opbsb/23lBNggP0z9jnzX8=Лог кассы возвращает:
2022.04.05 08:39:25.005 T:00012204 ERROR
[FiscalPrinter] Объекту 0x1C651D68 присвоен код ошибки 422 [Данный КМ отсутствует в таблице]
Уже попробовал даже в 64Base передать - всё равно безуспешно. Лог уже набился на 600 мб от таких манипуляций :)
При регистрации чека следующее в логе:
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_COMMODITY_NAME (65631) = "Шина R15 195/50 MAXXIS (лето)"
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_PRICE (65632) = 6160
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_QUANTITY (65633) = 1
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = 6
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "30 31 30 34 37 31 37 37 38 34 32 33 36 38 34 31 32 31 35 67 61 32 72 48 73 6D 43 71 3E 3F 48 39 31 45 45 30 36 39 32 4D 62 47 65 56 77 4B 5A 6F 6B 72 77 52 41 36 34 57 58 75 4C 2F 6F 70 62 73 62 2F 32 33 6C 42 4E 67 67 50 30 7A 39 6A 6E 7A 58 38 3D"
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = 1
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT (65886) = 0
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = 6
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] > LIBFPTR_PARAM_DEPARTMENT (65568) = 1
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] libfptr_registration()
2022.04.05 08:39:25.024 T:00012204 INFO [FiscalPrinter] output > 34
2022.04.05 08:39:25.026 T:00012204 INFO [Transport] send fiscal (1D) 1D 40 33 34 (4 bytes total)
2022.04.05 08:39:25.031 T:00012204 INFO [Transport] recv fiscal (1D) 1D 30 30 34 3B 34 3B 34 3B 32 36 32 3B (13 bytes total)
2022.04.05 08:39:25.031 T:00012204 INFO [FiscalPrinter] input < 4;4;4;262;
2022.04.05 08:39:25.031 T:00012204 INFO [FiscalPrinter] Чтение таблицы КМ (0 элементов)
2022.04.05 08:39:25.031 T:00012204 ERROR [FiscalPrinter] Объекту 0x1C651D68 присвоен код ошибки 409 [Некорректный код маркировки]
2022.04.05 08:39:25.031 T:00012204 INFO [FiscalPrinter] libfptr_close()
Но вопрос по тегу 1261 (отраслевой стандарт ) если в одном чеке и лекарства и молоко и вода. кто нибудь в курсе как быть? в ФФД 1.1 mdlp указывается для конкретно позиции, т.е. все понятно, а в ФФД 1.2 он же на весь чек..
У меня вопрос с шинами стоял.
Нужно смотреть лог - сейчас в логе корректно начали проставляться символы 29 - до этого криво прилетало.
ПодготовленныйШК = СокрЛП(СокрЛП(Т[Сч].ЧестныйЗнак));
ПодготовленныйШК = СтрЗаменить(ПодготовленныйШК,Разделитель,"");
КМ = Лев(ПодготовленныйШК, 31) + Разделитель + Сред(ПодготовленныйШК, 32, 6) + Разделитель + Сред(ПодготовленныйШК, 38);
Как то так у меня это выглядит, так же как и у ТС
У клиента были сканеры, которые просто не считывали спецсимволы.
"В уведомление о реализации товара с КМ также можно передать данные о реализации маркированного товара с помощью метода writeSalesNotice(), который принимает параметры:
1228 - ИНН клиента
1261 - отраслевой реквизит чека (можно несколько)" Т.е. несколько допустимо
Грубо так:
Для каждого стр из Товары Цикл
Если стр.Товар.ВидНоменклатуры = ВидМаркируемогоТовара тогда
ШтрихкодМаркировки = стр.ШтрихкодМаркировки;
ПодготовленныйШК = СокрЛП(ШтрихкодМаркировки);
....
FR.acceptMarkingCode();
КонецЕсли;
КонецЦикла; Показатьвсе коды проверили, если все акцептовалось - дальше уже цикл самой продажи.
Продажа меньше одного - это, я так понимаю, работа с SSCC кодами упаковок и агрегацией. По идее вложенные на этапе упаковки конечные коды маркировки должны без проблем пробиваться при продаже поштучно через ККМ.
base64 - MDQ2NDAwMzAwOTA4NDZMNTtValdI
MarkingCode - HTA0NjQwMB0zMDA5MDg0NktqYmRBaUo=
Заранее большое человеческое спасибо
Он в ЧЗ без проблем бьется
Может наведет на мысль.
У вас в примере какой то очень короткий получается. И не бьется естественно.
Приходит ответ что КМ имеет некорректный формат
Вот код маркировки из логово
010467018882925021xpFnolGDIAy9p91EE0692aTIUIotYb7jKc0OBacg
01 04717784236841 21 - это GTIN
5ga2rHsmCq>?H - это серийный номер
92MbGeVwKZokrwRA64WXuL/opbsb/23lBNggP0z9jnzX8= - это GTIN и серийный номер в строке кодировки base64
Откуда берется часть кода "91EE06"? Или это константа и всегда принимает такое значение?
При печати чека с одним кодом всё ОК. При попытки пробить два товара с КМ на втором товаре ошибка:
Ответ 26 Ошибка Неверный формат команды
Проверяю КМ в цикле по товарам. Чек уже открыт.
Посоветуйте пожалуйста, что с этим делать?
Добрый день.
Первым делом посмотрите в логе ККМ - что вызвало ошибку.
В 90% случаев - ошибка становится ясна.
Также напомню то, что говорил выше: проверка товаров на предмет валидации кодов
FR.acceptMarkingCode()Думаю это вот этот фрагмент:
2022.07.05 09:04:01.011 T: T:0000217C ERROR [FiscalPrinter] Код ошибки ККТ - 3635h
2022.07.05 09:04:01.011 T: T:0000217C ERROR [FiscalPrinter] Объекту 0x04AA4340 присвоен код ошибки 410 [Неверное состояние процесса проверки КМ]
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_COMMODITY_NAME (65631) = "А/ш ш 195/55/16 PIRELLI Formula Ice 91T. ЦЕНА ПО АКЦИИ."
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MEASUREMENT_UNIT (65851) = 0
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "0108019227248081215Ckth%XdlI0al"
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = 1
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT (65886) = 65886
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_PRICE (65632) = 10
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_QUANTITY (65633) = 1
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = 7
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > 1212 (1212) = 1
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > 1214 (1214) = 4
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] libfptr_registration()
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] output > 34
2022.07.05 09:04:01.019 T: T:0000217C INFO [Transport] send fiscal (08) 08 40 33 34 (4 bytes total)
2022.07.05 09:04:01.020 T: T:0000217C INFO [Transport] recv fiscal (08) 08 30 30 34 3B 34 3B 34 3B 32 36 32 3B (13 bytes total)
2022.07.05 09:04:01.020 T: T:0000217C INFO [FiscalPrinter] input < 4;4;4;262;
2022.07.05 09:04:01.020 T: T:0000217C INFO [FiscalPrinter] Чтение таблицы КМ (1 элементов)
2022.07.05 09:04:01.020 T: T:0000217C INFO [FiscalPrinter] 1. [CRC = -2087129350, 2106 = -1] 30 31 30 38 30 31 39 32 32 37 32 34 38 30 38 31 32 31 35 43 6B 74 68 25 58 64 6C 49 30 61 6C
2022.07.05 09:04:01.020 T: T:0000217C INFO [FiscalPrinter] output > bQ0;0;1;18446744073709551615;0108019227248081215Ckth%XdlI0al;
2022.07.05 09:04:01.020 T: T:0000217C INFO [Transport] send fiscal (09) 09 40 62 51 30 3B 30 3B 31 3B 31 38 34 34 36 37 34 34 30 37 33 37 30 39 35 35 31 36 31 35 3B 30 31 30 38 30 31 39 32 32 37 32 34 38 30 38 31 32 31 35 43 6B 74 68 25 58 64 6C 49 30 61 6C 3B (63 bytes total)
2022.07.05 09:04:01.021 T: T:0000217C INFO [Transport] recv fiscal (09) 09 59 44 (3 bytes total)
2022.07.05 09:04:01.021 T: T:0000217C ERROR [FiscalPrinter] Код ошибки ККТ - 4459h
2022.07.05 09:04:01.021 T: T:0000217C ERROR [FiscalPrinter] Объекту 0x04AA4340 присвоен код ошибки 26 [Неверный формат команды]
2022.07.05 09:04:01.032 T: T:0000217C INFO [FiscalPrinter] libfptr_cancel_receipt()
2022.07.05 09:04:01.032 T: T:0000217C INFO [FiscalPrinter] output > a1
2022.07.05 09:04:01.033 T: T:0000217C INFO [Transport] send fiscal (0A) 0A 40 61 31 (4 bytes total)
2022.07.05 09:04:01.033 T: T:0000217C INFO [Transport] recv fiscal (0A) 0A 3B 61 (3 bytes total)
2022.07.05 09:04:01.033 T: T:0000217C ERROR [FiscalPrinter] Код ошибки ККТ - 613Bh
2022.07.05 09:04:01.033 T: T:0000217C INFO [FiscalPrinter] output > 01
2022.07.05 09:04:01.033 T: T:0000217C INFO [Transport] send fiscal (0B) 0B 40 30 31 (4 bytes total)
2022.07.05 09:04:01.034 T: T:0000217C INFO [Transport] recv fiscal (0B) 0B 30 30 30 3B 37 3B 30 3B 30 3B 30 3B (13 bytes total)
2022.07.05 09:04:01.034 T: T:0000217C INFO [FiscalPrinter] input < 0;7;0;0;0;
2022.07.05 09:04:01.034 T: T:0000217C ERROR [FiscalPrinter] Объекту 0x04AA4340 присвоен код ошибки 81 [Чек закрыт - операция невозможна]
Я смотрю посылается короткий код. В ФФД1.2 обязательно длинный.
И если производится проверка, то должна быть последовательность - начало проверки, валидация, и в момент списания - акцепт.
beginMarkingCodeValidation
getMarkingCodeValidationStatus
acceptMarkingCode
У Вас в коде этих запросов нет.
КМ короткие, такие дал тестовый контур ЧЗ.
Может запросы выше в логе остались?
Файл прикладываю, буду благодарна за помощь.
Объект.openReceipt(); // открыли чек
Сообщить("открыли чек ");
//Табличная часть
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл Сообщить("позиция "+СписокТоваров.Наименование);
ПризнакНаличияКМ=32;
Если ПустоеЗначение(СписокТоваров.КМ)=0 Тогда // Код маркировки
ПризнакНаличияКМ=33;
mark = СокрЛП(СписокТоваров.КМ);
Сообщить("КМ "+mark);
Статус = Объект.LIBFPTR_MES_PIECE_SOLD; // штучный товар 1
Штуки = Объект.LIBFPTR_IU_PIECE;
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_TYPE,Объект.LIBFPTR_MCT12_AUTO);
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE, mark);
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_STATUS, Статус); // штучный товар
// Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT, 1);
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
Объект.beginMarkingCodeValidation(); //начать проверку КМ
ВремяНачала = ТекущееВремя(); ВремяОжидания = ТекущееВремя() + 100;
Сообщить("-------------");
Сообщить("Начата проверка КМ "+mark);
Пока 1=1 Цикл
Объект.getMarkingCodeValidationStatus();
ПроверкаЗавершена =
Объект.getParamBool(Объект.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);
Если ПроверкаЗавершена = 1 тогда // проверка завершена
прервать;
КонецЕсли;
Если ТекущееВремя() > ВремяОжидания тогда Сообщить("Время истекло. ");
прервать;
КонецЕсли;
КонецЦикла;
Сообщить("КМ был отправлен на сервер "+Объект.getParamBool(Объект.LIBFPTR_PARAM_IS_REQUEST_SENT));
validationResult = Объект.getParamInt(Объект.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
Если validationResult = 0 Тогда
Сообщить("Отмена чека при проверки КМ! ");
Объект.cancelReceipt(); // отмена чека
Объект.close();
СтатусВозврата(0);
Возврат 0;
КонецЕсли;
Объект.acceptMarkingCode(); // подтверждение реализации
Объект.setParam(Объект.LIBFPTR_PARAM_COMMODITY_NAME,СокрЛП(СписокТоваров.Наименование));
//Объект.setParam(Объект.LIBFPTR_PARAM_MEASUREMENT_UNIT, Объект.LIBFPTR_IU_PIECE);
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE, mark);
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_STATUS, 1); //штучный
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
Сообщить("обработка КМ "+mark+" завершена. ");
Иначе
Объект.setParam(Объект.LIBFPTR_PARAM_COMMODITY_NAME,СокрЛП(СписокТоваров.Наименование));
КонецЕсли;
Объект.setParam(Объект.LIBFPTR_PARAM_PRICE, СписокТоваров.Цена);
Объект.setParam(Объект.LIBFPTR_PARAM_QUANTITY, СписокТоваров.Количество);
Объект.setParam(1212, ПризнакНаличияКМ);
//параметр для ФФД 1.2!!! 32 - товар не имеющий код маркировки, 33 - товар имеющий код маркировки
Сообщить("Попытка регистрации оплаты. ");
Если ПолученоНал > 0 Тогда
Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_TYPE, Объект.LIBFPTR_PT_CASH);
Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_SUM, ПолученоНал);
Если Объект.Payment() <> 0 тогда //Зарегистрировать оплату
Ошибка = 1;
ПолучитьОписаниеРезультата(Объект,"Оплата не прошла");
глСообщитьВЛог("Атол, Ошибка оплаты налом " + ОписаниеРезультата);
Попытка
Объект.cancelReceipt(); // отмена чека
Объект.close();
Исключение
КонецПопытки;
Возврат 0;
КонецЕсли;
КонецЕсли;
лСуммаВстречноеПредставление = глФРДопПарам.Получить("СуммаВстречноеПредставление");
Если ПустоеЗначение(лСуммаВстречноеПредставление) = 0 Тогда
Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_TYPE, Объект.LIBFPTR_PT_OTHER);
Объект.setParam(Объект.LIBFPTR_PARAM_PAYMENT_SUM, лСуммаВстречноеПредставление);
Если Объект.Payment() <> 0 тогда //Зарегистрировать оплату
Ошибка = 1;
ПолучитьОписаниеРезультата(Объект,"Оплата не прошла");
глСообщитьВЛог("Атол, Ошибка оплаты СуммаВстречноеПредставление " + ОписаниеРезультата);
Попытка
Объект.cancelReceipt(); // отмена чека
Объект.close();
Исключение
КонецПопытки;
Возврат 0;
КонецЕсли;
КонецЕсли;
Если Ошибка = 0 Тогда
Сообщить("Можно закрыть чек! ");
Объект.closeReceipt(); // Закрытие чека
КонецЕсли;
Если Объект.checkDocumentClosed() < 0 Тогда
Сообщить("закрылся? "+Объект.getParamBool(Объект.LIBFPTR_PARAM_DOCUMENT_CLOSED));
Если Объект.getParamBool(Объект.LIBFPTR_PARAM_DOCUMENT_CLOSED) = 0 Тогда
Объект.cancelReceipt(); // отменить и сформировать заново
КонецЕсли;
Сообщить("напечатался? "+Объект.getParamBool(Объект.LIBFPTR_PARAM_DOCUMENT_PRINTED));
Если Объект.getParamBool(Объект.LIBFPTR_PARAM_DOCUMENT_PRINTED) = 0 Тогда
Объект.cancelReceipt(); // отменить и сформировать заново
Если Объект.continuePrint() < 0 Тогда // не получилось напечатать. заново
Предупреждение("Чек не напечатан!"); // отключиться
ПолучитьОписаниеРезультата(Объект,"Печать не прошла");
глСообщитьВЛог("Атол, Ошибка печати " + ОписаниеРезультата);
Попытка
Объект.cancelReceipt(); // отмена чека
Исключение
КонецПопытки;
Возврат 0;
КонецЕсли;
КонецЕсли;
КонецЕсли; //Проверить закрытие документа Показать2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > 1212 (1212) = 1
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] > 1214 (1214) = 4
2022.07.05 09:04:01.019 T: T:0000217C INFO [FiscalPrinter] libfptr_registration()
А в коде:
Объект.setParam(1212, ПризнакНаличияКМ);
//параметр для ФФД 1.2!!! 32 - товар не имеющий код маркировки, 33 - товар имеющий код маркировки т.е, 1212 = 33
А строк где 1214=4 и registration() НЕТ ВООБЩЕ!
Это, кстати дает ответ на вопрос почему не проходит когда две строки.
Внимательно изучите вот тут - это практически Ваш код
Объект.setParam(1214, ПризнакСпособРасчета);
Сообщить("Попытка регистрации позиции. ");
Если Объект.registration() <> 0 тогда /// Регистрация позиции
ПолучитьОписаниеРезультата(Объект,"Регистрация позиции ");
Ошибка = 1;
Попытка
Сообщить("Отмена чека при регистрации позиции! ");
Объект.cancelReceipt(); // отмена чека
Объект.close();
Исключение
КонецПопытки;
СтатусВозврата(0);
Возврат 0;
Иначе
Сообщить("Регистрация позиции выполнена. ");
КонецЕсли;
КонецЦикла; // Цикл по строкам товаров
Сообщить("Попытка регистрации оплаты. ");
Если ПолученоНал > 0 Тогда ПоказатьЯ переписала алгоритм. Сначала проверяю КМ, запоминаю ответ. Потом заново перебираю таблицу товаров.
Но это пока не помогло. Чек аннулируется т.к. не проходит проверку КМ.
output > B1кассир Никитина;1;
2022.07.07 14:16:57.510 T: T:00001774 INFO [Transport] send fiscal (0F) 0F 40 42 31 AA A0 E1 E1 A8 E0 20 8D A8 AA A8 E2 A8 AD A0 3B 31 3B (22 bytes total)
2022.07.07 14:16:57.511 T: T:00001774 INFO [Transport] recv fiscal (0F) 0F 59 44 (3 bytes total)
2022.07.07 14:16:57.511 T: T:00001774 ERROR [FiscalPrinter] Код ошибки ККТ - 4459h
2022.07.07 14:16:57.511 T: T:00001774 ERROR [FiscalPrinter] Объекту 0x049D13D0 присвоен код ошибки 196 [Не удалось зарегистрировать кассира]
2022.07.07 14:16:57.511 T: T:00001774 INFO [FiscalPrinter] libfptr_cancel_marking_code_validation()
Ошибок в процессе вывода чека никаких быть не должно - начните с этого
Это вот это место:
ВремяНачала = ТекущееВремя();
ВремяОжидания = ТекущееВремя() + 100;
Сообщить("-------------");
Сообщить("Начата проверка КМ "+mark);
Пока 1=1 Цикл
Объект.getMarkingCodeValidationStatus(); //Сообщить("ожидаем проверки КМ ");
ПроверкаЗавершена = Объект.getParamBool(Объект.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);
Если ПроверкаЗавершена = 1 тогда // проверка завершена Перечисление.Булево.Да
прервать;
КонецЕсли;
Если ТекущееВремя() > ВремяОжидания тогда Сообщить("Заданное время ожидания ответа истекло. ");
прервать;
КонецЕсли;
КонецЦикла;
Сообщить("КМ был отправлен на сервер "+Объект.getParamBool(Объект.LIBFPTR_PARAM_IS_REQUEST_SENT));
validationResult = Объект.getParamInt(Объект.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT); ПоказатьВызовов много, так как жду ответа 100 секунд. Задержку в плане sleep() ?
// для каждого киз
fptr.beginMarkingCodeValidation()
fptr.getMarkingCodeValidationStatus()
// ну и какую-то проверку что статус корректный.
// фиксируем кизы
fptr.acceptMarkingCode()
// открываем чек
fptr.openReceipt();
// вот тут не понятно, как их все передать?
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE, mark);
Показать010460026600180121;6Y-AEs{FNC1}8005147000{FNC1}93sOTQ{FNC1}24010132404
От пачки нормально приходит 15.
Неужели придется все блоки в пачки переводить? Вроде бы блок идет потребительский уровень.
Пример: У нас только молочная продукция. 31 символ в марке.
Вот такое преобразование делаю :
КМ = Лев(ПодготовленныйШК, 24) + Разделитель + Сред(ПодготовленныйШК, 25);
То есть тот самый GS1 должен быть 25 символом
P.S.
Спасибо сообщению (63) все понятно какие марки как ждет.
Задавал вопрос в ЧЗ:
...нашёл в холодильнике несколько товаров из упомянутой категории и обнаружил, что код одного из этих товаров во второй группе содержал не 6, а 8 символов
01048110840014582123udBn5693:5x1
Что самое интересное, ваше мобильное приложение считает этот код правильным.
Получил ответ:
Согласно
....
вторая группа определяется идентификатором применения AI=’21’, состоит из 6 или 8 символов....
Получается, что длина кода маркировки молочной продукции может быть не только 31, но и 33 символа.
P.S. ссылка, присланная ЧЗ, редиректит на сторонний комерческий сайт. Надеюсь, это не станет поводом для её удаления. Других источников, быстро, беспалтно и с полным текстом решения, я не нашёл.
Какими значениями заполнять
LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT
LIBFPTR_PARAM_MARKING_PROCESSING_MODE
LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT
Код маркировки передаю полный, после серийного номера добавляю GS (Симв(29)). Наведите, плиз, на мысль в чем проблема?
Еще вопрос: запускать проверку марок надо после открытия чека? хотя пробовал и так, и так - результат один.
(108) Постараюсь подсказать универсально.
1. Виды маркированного товара вводятся периодически новые, поэтому драйвера для ККМ нужны для новых товаров свежие.
2. Метод запроса валидности кода - АСИНХРОННЫЙ, если вы сразу же спросите ответ у сервиса функцией getMarkingCodeValidationStatus() - наверняка переменная LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY будет false. Поэтому в приведенном мною коде стоит цикл опроса.
Пока истина Цикл
FR.getMarkingCodeValidationStatus();
Если FR.getParamBool(FR.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY) тогда
прервать;
КонецЕсли;
Если ТекущаяДата() - ВремяНачала > ВремяОжидания тогда
прервать;
КонецЕсли;
КонецЦикла; Показать3. Проверяйте не на одном едиственном коде, а хотя бы на выборке из разных поставок а лучше поставщиков. Бывает, что те кто клеят коды неверно выводят на печать сам код (сколько ошибок было в том же Ocvita Barcode или на чистой библиотеке ZINT - они выдают на печать неверные коды) На сегодняшний день - самый верный драйвер печати из свежих конфигураций 1С.
Те. вот эту строку
КМ = Лев(ПодготовленныйШК, 31) + Разделитель + Сред(ПодготовленныйШК, 32, 6) + Разделитель + Сред(ПодготовленныйШК, 38);Сделать такой
КМ = Лев(ПодготовленныйШК, 31) + Разделитель + Сред(ПодготовленныйШК, 32);либо вообще на п проверку передавать чистый код без исправления
КодДляККТ=Лев(КодМаркировки,31)+Симв(29)+Сред(КодМаркировки,32,6)
Чистый код не пробовал передать. Но вроде без разделителя же не пройдет? Надо попробовать. Вообще странная ситуация. Через драйвер код проходит, а так ошибка.
Гляньте, плиз, может что подскажите. И лог ККТ вкладываю
//стираем все запрошенные маркировки из памяти кассового аппарата
Попытка
FR.clearMarkingCodeValidationResult();
Исключение
КонецПопытки;
ТаблМарок=СоздатьОбъект("ТаблицаЗначений");
ТаблМарок.НоваяКолонка("КодМаркировки");
ТаблМарок.НоваяКолонка("РезультатПроверкиСведений");
ТаблМарок.НоваяКолонка("КодМаркировкиККТ");
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
Если (Товар.Маркировка=Перечисление.Булево.Да) Тогда
Если СтрДлина(СокрЛП(КодМаркировки))=37 Тогда //вода
КодДляККТ=Лев(СокрЛП(КодМаркировки),31)+Симв(29)+Сред(КодМаркировки,32,6);
КонецЕсли;
// Запускаем проверку КМ
Если Вид = Перечисление.ВидыОперацийЧекККМ.Чек Тогда
Статус = FR.LIBFPTR_MES_PIECE_SOLD; //штучный товар, реализован
Иначе
Статус = FR.LIBFPTR_MES_PIECE_RETURN; //штучный товар, возвращен
КонецЕсли;
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_TYPE, FR.LIBFPTR_MCT12_AUTO); //Тип КМ (тег 2101)
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE, КодДляККТ); //КМ (тег 2000)
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_STATUS, Статус); //Планируемый статус КМ (тег 2003)
// FR.setParam(FR.LIBFPTR_PARAM_QUANTITY, Количество); //Количество товара (тег 1023)
// FR.setParam(FR.LIBFPTR_PARAM_MEASUREMENT_UNIT, FR.LIBFPTR_IU_PIECE); //Мера количества товара (тег 2108) штуки, единицы
FR.setParam(2108, 0); //Мера количества товара (тег 2108) штуки, единицы
// FR.setParam(FR.LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT, 1);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0); //Режим обработки кода товара (тег 2102)
// FR.setParam(FR.LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, "1/2"); //(тег 1291)
FR.beginMarkingCodeValidation();
ВремяОжидания = ТекущееВремя() + 20; //20 секунд таймаут
// Дожидаемся окончания проверки и запоминаем результат
Пока 1=1 Цикл
FR.getMarkingCodeValidationStatus();
ПроверкаЗавершена=FR.getParamBool(FR.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);
Если ПроверкаЗавершена<>0 Тогда
Прервать;
РезультатПроверкиСведений = FR.getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT); //Результат проверки сведений о товаре (тег 2106)
Иначе
РезультатПроверкиСведений = FR.getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT); //Результат проверки сведений о товаре (тег 2106)
Если ТекущееВремя() > ВремяОжидания Тогда
FR.cancelMarkingCodeValidation();
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Сообщить(ПроверкаЗавершена);
Сообщить("Результат проверки: "+РезультатПроверкиСведений);
// Подтверждаем реализацию товара с указанным КМ
FR.acceptMarkingCode();
ТаблМарок.НоваяСтрока();
ТаблМарок.КодМаркировки=КодМаркировки;
ТаблМарок.РезультатПроверкиСведений=РезультатПроверкиСведений;
ТаблМарок.КодМаркировкиККТ=КодДляККТ;
// FR.clearMarkingCodeValidationResult(); //Очистка таблицы проверенных КМ в ФН
// FR.cancelMarkingCodeValidation();
КонецЕсли;
КонецЦикла;
КонецЕсли;
//------------------------------
FR.setParam(FR.LIBFPTR_PARAM_DATA_TYPE, FR.LIBFPTR_DT_STATUS);
FR.queryData();
НомерДок = FR.getParamInt(FR.LIBFPTR_PARAM_RECEIPT_NUMBER); // запрос номера чека
НомерСмены=FR.getParamInt(FR.LIBFPTR_PARAM_SHIFT_NUMBER); // запрос номера смены
//запрос номера ФН и ФД
FR.setParam(FR.LIBFPTR_PARAM_FN_DATA_TYPE , FR. LIBFPTR_FNDT_LAST_RECEIPT);
FR.fnQueryData();
НомерФД = FR.getParamInt(FR.LIBFPTR_PARAM_DOCUMENT_NUMBER)+1;
FR.setParam(FR.LIBFPTR_PARAM_FN_DATA_TYPE , FR.LIBFPTR_FNDT_FN_INFO);
FR.fnQueryData();
НомерККМ = FR.getParamString(FR.LIBFPTR_PARAM_SERIAL_NUMBER);
//Открыть чек
FR.setParam(1021, Константа.Кассир.Наименование);
FR.operatorLogin();
//Тип чека
Если Вид = Перечисление.ВидыОперацийЧекККМ.ЧекНаВозврат Тогда
FR.setParam(FR.LIBFPTR_PARAM_RECEIPT_TYPE, FR.LIBFPTR_RT_SELL_RETURN);
Иначе
FR.setParam(FR.LIBFPTR_PARAM_RECEIPT_TYPE, FR.LIBFPTR_RT_SELL);
КонецЕсли;
//Запись реквизита телефон или e-mail
Если ПустоеЗначение(Клиент)=0 Тогда
FR.setParam(1008, СокрЛП(Клиент));
КонецЕсли;
FR.openReceipt();
// регистрация продажи
ВыбратьСтроки();
Пока ПолучитьСтроку()=1 Цикл
FR.setParam(FR.LIBFPTR_PARAM_PRICE, Цена);
FR.setParam(FR.LIBFPTR_PARAM_QUANTITY, Количество); //Количество товара (тег 1023)
FR.setParam(FR.LIBFPTR_PARAM_TAX_TYPE, FR.LIBFPTR_TAX_NO ); // номер налога "БезНДС"
FR.setParam(FR.LIBFPTR_PARAM_COMMODITY_NAME, Лев(Товар,64));
//предмет расчета
FR.setParam(1212,33); //параметр для ФФД 1.2!!! 33 - Товар, имеющий КМ, за исключением подакцизного
FR.setParam(1214,4); //Полная оплата
//формируем код маркировки для отправки в ККТ
Поз=0;
ТаблМарок.НайтиЗначение(КодМаркировки,Поз,"КодМаркировки");
ТаблМарок.ПолучитьСтрокуПоНомеру(Поз);
РезультатПроверки=ТаблМарок.РезультатПроверкиСведений;
КодДляККТ=ТаблМарок.КодМаркировкиККТ;
// FR.setParam(FR.LIBFPTR_PARAM_MEASUREMENT_UNIT, FR.LIBFPTR_IU_PIECE);
// FR.setParam(2108, 0);
// FR.setParam(FR.LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, "1/2");
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE, КодДляККТ);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_STATUS, Статус);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, РезультатПроверки);
FR.setParam(FR.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
Если FR.registration() <> 0 тогда //регистрация
ОтветДрайвера();
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЦикла; ПоказатьБуду пробовать на рознице. Пока не пойму в чем дело.
= TRUE выходит? Как вариант больше таймаут поставить. Т.е. влогах должно быть эта переменная false, false а потом true
Когда проходит чек, то выходит из цикла по LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY (65850) = true
ПроверкаЗавершена=FR.getParamBool(FR.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY);
Если ПроверкаЗавершена<>0 Тогда
Прервать;
РезультатПроверкиСведений = FR.getParamInt(FR.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT); //Результат проверки сведений о товаре (тег 2106)
Первое. Переменная РезультатПроверкиСведений не достижима, потому что Прервать стоит перед ней.
И второе, раз таймаут не работает - проверяйте чему равна переменная ПроверкаЗавершена - возможно она всегда не равна 0
(часть лога)
2023.03.30 14:44:40.031 T:00001DFC INFO [FiscalPrinter] recv header sign=[B65D9C62] deviceID=[A769B8E30A66CEC96FBDDAD5763702FBBFCAAC52] id=015A type=[RESPONSE] len=91
2023.03.30 14:44:40.031 T:00001DFC INFO [FiscalPrinter] recv data { "e" : { "c" : 409, "d" : "Некорректный код маркировки" }, "p" : [ ], "f" : null }
2023.03.30 14:44:40.031 T:00001DFC ERROR [FiscalPrinter] Объекту 0x09B1A0F8 присвоен код ошибки 409 [Некорректный код маркировки]
2023.03.30 14:44:40.031 T:00001DFC INFO [FiscalPrinter] libfptr_cancel_receipt()
2023.03.30 14:44:40.031 T:00001DFC INFO [FiscalPrinter] send header sign=[B65D9C62] deviceID=[A769B8E30A66CEC96FBDDAD5763702FBBFCAAC52] id=015B type=[REQUEST] len=47
2023.03.30 14:44:40.031 T:00001DFC INFO [FiscalPrinter] send data { "m" : "libfptr_cancel_receipt", "w" : false, "p" : [ ] }
2023.03.30 14:44:40.196 T:00001DFC INFO [FiscalPrinter] recv header sign=[B65D9C62] deviceID=[A769B8E30A66CEC96FBDDAD5763702FBBFCAAC52] id=015B type=[RESPONSE] len=58
2023.03.30 14:44:40.196 T:00001DFC INFO [FiscalPrinter] recv data { "e" : { "c" : 0, "d" : "Ошибок нет" }, "p" : [ ], "f" : null }
2023.03.30 14:44:40.198 T:00001DFC INFO [FiscalPrinter] < LIBFPTR_PARAM_JSON_DATA (65645) = ""
2023.03.30 14:44:40.198 T:00001DFC ERROR [FiscalPrinter] Объекту 0x09B1A0F8 присвоен код ошибки 409 [Некорректный код маркировки]
2023.03.30 14:44:43.728 T:00001DFC INFO [FiscalPrinter] > LIBFPTR_PARAM_FN_DATA_TYPE (65622) = 5
2023.03.30 14:44:43.728 T:00001DFC INFO [FiscalPrinter] libfptr_fn_query_data()
Конкретные условия, при которых ошибка себя проявляет выявить не удалось. Однако товар спокойно реализуется, после того как КМ добавляется в РМК повторно. Частота возникновения по всей сети, так же не имеет закономерностей, может не быть неделю, а может возникать десятки раз в день. (Все магазины на ФФД 1.2).
У меня проблема при фискализации чека с маркировкой. А конкретно проблема возникает на этапе проверки марки методами ЗапросКМ, ПолучитьРезультатыЗапросаКМ, ПодтвердитьКМ.
При выполнении ПодтвердитьКМ выходит ошибка = неверный аргумент.
Выбытие = Истина;
ИдентификаторЗапроса = УникаьныйУИДсгенерированный на этапе ЗапросКМ.
ПараметрыПодключения.ИДУстройства = "ATOL_KKT_1C_V10#1"
Результат = ОбъектДрайвера.ПодтвердитьКМ(ПараметрыПодключения.ИДУстройства, ИдентификаторЗапроса, ?(Выбытие, 0 , 1));
При чём в типовой 1с всё отрабатывает. Получается у меня либо какая-то ошибка на этапе проверить статус КМ, и в ККТ неверно устанавливаются данные в готовность к операции ПодтвердитьКМ, либо у меня в самописной подтягивается не тот ОбъектДрайвера для атола ?
Все-таки в данной публикации обсуждается реализация подключения ККМ с помощью функций АТОЛа, а не с помощью обработки написанной для 1С. Что в ней за функции - не известно, лично я такими методами не пользуюсь, поэтому подсказать не смогу.
В любом случае - сначала начинайте тестировать с лога кассы. Там, по крайней мере, видно будет конкретный момент возникновения ошибки.
Если до ошибки там не дошло - смотрите саму обработку в которой реализованы функции ПодтвердитьКМ и пр... Возможно она не для данного драйвера или там, например, нет перечисленных выше аргументов. В конце концов - можно взять встроенную в типовую 1с обработку и подключить ее, тем более что данный вызов функции есть в общем модуле "ПодключаемоеОборудованиеУниверсальныйДрайверКлиент"
Пробую использовать приведенный алгоритм в самописной конфигурации, обувь, используемый код вставляется без спецсимволов. getMarkingCodeValidationStatus() не возвращает никакого результата, прерывается по истечению времени с validationResult = 0. В какую сторону копать?
Усложняется тем, что ккт на удаленном рабочем месте, проверить не всегда могу, уже после проверки пришла мысль, возможно ошибка появляется где-то предыдущих шагах, например на beginMarkingCodeValidation(), или и того раньше.
Чек пробивается, в офд под товаром появляется запись КТ ААА=. На печать признаков маркировки не выводится, просто обычная продажа.
Первое что необходимо сделать - получить лог с ккт. Там по шагам будет все видно на каком этапе возникает ошибка.
Ну и конечно проверить ревизию аппарата ккт. Он должен уметь работать с маркированными товарами. ФФД должно быть 1.2.
пытаюсь пробить с кодом в base64, в логах драйвера он отображается верно:
1305 (1305) = "0102900197088110215MbLX%ndd;hSl9180BF92a4Yi9UPRPGKcqKOXFUIqp95R1rn4FUvecxLENqkeW6RJuSY
ошибка:
Объекту 0x14990B40 присвоен код ошибки 148 [Ошибка программирования реквизита 1305 (Превышение длины реквизита)]
Проверил приведенный код: с криптохвостом не бьется в ЧЗ, а без криптохвоста бьется, из чего могу допустить что отсканированный код все-таки не верный. Судя по начальным цифрам - всего введен был он с описания остатков.
Проверка завершена
КМ был отправлен
Ошибка онлайн проверки: 0 - Ошибок нет
Результат проверки сведений о товаре: 15
Сведения о статусе товара: 1
Результаты обработки запроса: 15
Код обработки запроса: 0
Все правильно вроде.
Можете прислать пример валидного кода?
Спасибо, бред конечно, на 1.05 - 1.1 пробить можно с признаком м а на 1.2 уже не дает
1. Проверяете код мобильным приложением честного знака - все пункты должны быть зелеными. Если хоть один красный - значит код маркировки не корректен (или временно некорректен - и такое бывает))
2. Если код везде показывает что корректен, нужно смотреть лог кассы. Практически сразу становится все понятно, т.к. лог выводит все сообщения пооперационно.
3. Можно попробовать распечатать данный код с помощью драйвера. И если все пройдет и ошибки не будет - сравнить лог кассы с тем логом который был из программы. Такой подход позволяет выявить неочевидные настройки.
Если (СтрДлина(СписокТоваров.КодМаркировкиСоСканера) = 20) или (СтрДлина(СписокТоваров.КодМаркировкиСоСканера) = 25) или (СтрДлина(СписокТоваров.КодМаркировкиСоСканера) = 29) Тогда
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_TYPE, Объект.LIBFPTR_MCT12_SHORT);
Иначе
Объект.setParam(Объект.LIBFPTR_PARAM_MARKING_CODE_TYPE, Объект.LIBFPTR_MCT12_AUTO);
КонецЕсли;
В итоге успешно проапгрейдил до ФФД 1.2 драйвер для 1С 7.7:
1. В приложенном логе не нашел примера отправки маркировки и ошибки связанной с ней
2. Зато в логе есть куча других ошибок, например 11 ошибка - что за параметр 7777 который записывается в настройки соединения? , скорее всего отсюда ошибка "нет соединения с сервером ОФД"...
3. Здесь ветка про самописные конфигурации 1С (в основном). Если речь про конкретное, нередактируемое ПО, самым верным способом все-таки будет обращение на их линию поддержки.
Что делать если за время "ВремяОжидания" процесс получения СТАТУСА не завершился. У меня реально ОН не завершается.
Что ВЫ предлагаете делать в этом случае?
// Начало проверки
Пока истина Цикл
FR.getMarkingCodeValidationStatus();
Если FR.getParamBool(FR.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY) тогда
прервать;
КонецЕсли;
Если ТекущаяДата() - ВремяНачала > ВремяОжидания тогда
прервать;
КонецЕсли;
КонецЦикла;
На самом деле и ранее и сейчас признаком проверки маркировки через драйвер ККТ являлся признак [M+] [M] и [M-]. При этом чек пробивался в любом случае. Теперь же нужно сначала проверить товары программным путем, далее результат проверки вставить в тег 1260. А в случае отрицательного результата чек выбивать нельзя. Вот здесь автор подробно описал процесс :
1) Т.к. первая функция открывает запрос на проверку FR.beginMarkingCodeValidation();
2) А вторая функция FR.getMarkingCodeValidationStatus() получает статус маркировки (АСИНХРОННО);
3) Третья FR.acceptMarkingCode() добавляет код маркировки с список проверенных.
Без этого МАРКИРОВКИ не пробьются, как бы хорошо не плясали разработчики 1С вокруг ККТ.
Главный вопрос, что писать в ТЕГИ, если запрос FR.getMarkingCodeValidationStatus() не закончился в отведенное время (100 секунд).
Возможно как профи, вы меня поправите.
Зайдите в главном меню Эвотора в приложение «Время проверки КМ», проверьте настройку Продажа без моментальной онлайн проверки КМ.
Если настройка установлена, значит, проверка в ОИСМ отключена. Запрос на проверку КМ отправляется, но терминал не ожидает ответа, поэтому при продаже вы видите статус [М].
Но как это сделать на "AddIn.Fptr10", честно говоря не знаю.
Вы проверьте, по рекомендации из пункта 2. "Проверьте связь с ОИСМ. Для этого перейдите в раздел: Настройки → Обслуживание кассы и нажмите Поверить связь с ОФД, распечатается чек диагностики."
а после этого не надо КМ переводить в base 24?
подсовываю КМ при печати чека не проходит проверку ЧЗ, в прочем и в base64 тоже не проходит
1011 - часовой пояс
2040 - номер ФД
1125 - признак расчета в интернет
Посмотрел в документации к драйверу, что-то там вообще не нашел по тегу 2040 ничего.
Более свежих пока нет.
Упоминания о теге 2040 тоже нет.
- Добавлена настройка часовой зоны LIBFPTR_SETTING_TIME_ZONE, используемая при формировании уведомлений;
- Добавлены новые значения для реквизита LIBFPTR_PARAM_MARKING_CODE_STATUS(тег 2003, тег 2110) — LIBFPTR_MES_PIECE_FOR_SALE и LIBFPTR_MES_DRY_SOLD в соответствии с изменениями ФФД;
- Переименовано значение признака предмета расчета «Курортный сбор» в «Туристический налог» в соответствии с изменениями ФФД;
- Добавлена возможность подачи адреса расчета (тег 1009), признака расчета в «Интернет» (тег 1125) при открытии чека в соответствии с изменениями ФФД;
- Добавлена возможность подать дополнительные сведения об оплате безналичными (тег 1235) в соответствии с изменениями ФФД;
Помогите пожалуйста разобраться, с проверкой маркировки на Атол зашли в тупик.
Получаем такой лог:
2025.08.04 10:40:26.773 T:000029FC INFO [FiscalPrinter] > 1021 (1021) = "Владелец"
2025.08.04 10:40:26.773 T:000029FC INFO [FiscalPrinter] > 1203 (1203) = "1"
2025.08.04 10:40:26.773 T:000029FC INFO [FiscalPrinter] libfptr_operator_login() [0x01CAD6E8]
2025.08.04 10:40:26.773 T:000029FC INFO [FiscalPrinter] output > B1Владелец;1;
2025.08.04 10:40:26.773 T:000029FC INFO [Transport] send fiscal (12) 12 40 42 31 82 AB A0 A4 A5 AB A5 E6 3B 31 3B (15 bytes total)
2025.08.04 10:40:26.774 T:000029FC INFO [Transport] recv fiscal (12) 12 59 44 (3 bytes total)
2025.08.04 10:40:26.774 T:000029FC ERROR [FiscalPrinter] Код ошибки ККТ - 4459h
2025.08.04 10:40:26.774 T:000029FC ERROR [FiscalPrinter] Объекту 0x01CAD6E8 присвоен код ошибки 196 [Не удалось зарегистрировать кассира]
2025.08.04 10:40:26.774 T:000029FC INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_TYPE (65826) = LIBFPTR_MCT12_AUTO (256)
2025.08.04 10:40:26.774 T:000029FC INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "0109002490100070215&P,BZjeh&f2d92jo5A"
2025.08.04 10:40:26.774 T:000029FC INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = LIBFPTR_MES_DRY_FOR_SALE (2)
2025.08.04 10:40:26.774 T:000029FC INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2025.08.04 10:40:26.774 T:000029FC INFO [FiscalPrinter] > LIBFPTR_PARAM_TIMEOUT (65899) = 5000
2025.08.04 10:40:26.774 T:000029FC INFO [FiscalPrinter] libfptr_begin_marking_code_validation() [0x01CAD6E8]
2025.08.04 10:40:26.774 T:000029FC INFO [FiscalPrinter] output > A1
2025.08.04 10:40:26.775 T:000029FC INFO [Transport] send fiscal (13) 13 40 41 31 (4 bytes total)
2025.08.04 10:40:26.775 T:000029FC INFO [Transport] recv fiscal (13) 13 30 30 30 34 30 38 32 35 31 30 32 38 33 32 3B (16 bytes total)
2025.08.04 10:40:26.775 T:000029FC INFO [FiscalPrinter] input < 040825102832;
2025.08.04 10:40:26.778 T:000029FC INFO [FiscalPrinter] output > UE0;0109002490100070215&P,BZjeh&f2d[1Dh][1Dh]92jo5A;╙[07h][01h][00h][02h]6[08h][01h][00h][00h];5000;
2025.08.04 10:40:26.778 T:000029FC INFO [Transport] send fiscal (14) 14 40 55 45 30 3B 30 31 30 39 30 30 32 34 39 30 31 30 30 30 37 30 32 31 35 26 50 2C 42 5A 6A 65 68 26 66 32 64 1D 1D 39 32 6A 6F 35 41 3B D3 07 01 00 02 36 08 01 00 00 3B 35 30 30 30 3B (62 bytes total)
2025.08.04 10:40:26.779 T:000029FC INFO [Transport] recv fiscal (14) 14 33 42 (3 bytes total)
2025.08.04 10:40:26.779 T:000029FC ERROR [FiscalPrinter] Код ошибки ККТ - 4233h
2025.08.04 10:40:26.779 T:000029FC ERROR [FiscalPrinter] Объекту 0x01CAD6E8 присвоен код ошибки 11 [Не поддерживается в данной версии]
2025.08.04 10:40:26.779 T:000029FC INFO [FiscalPrinter] libfptr_get_marking_code_validation_status() [0x01CAD6E8]
2025.08.04 10:40:26.779 T:000029FC ERROR [FiscalPrinter] Объекту 0x01CAD6E8 присвоен код ошибки 422 [Данный КМ отсутствует в таблице]
2025.08.04 10:40:26.780 T:000029FC INFO [FiscalPrinter] libfptr_get_marking_code_validation_status() [0x01CAD6E8]
2025.08.04 10:40:26.780 T:000029FC ERROR [FiscalPrinter] Объекту 0x01CAD6E8 присвоен код ошибки 422 [Данный КМ отсутствует в таблице]
2025.08.04 10:40:26.780 T:000029FC INFO [FiscalPrinter] libfptr_get_marking_code_validation_status() [0x01CAD6E8]
Первая ошибка "присвоен код ошибки 196 [Не удалось зарегистрировать кассира]" явно из-за передачи ИНН = 1, либо передавайте правильный инн, либо не передавайте его совсем.
Вторая ошибка "присвоен код ошибки 11 [Не поддерживается в данной версии]" очень похожа на то, что используется старая прошивка (2.5). Обновите прошивку ККМ до платформы 5.0 и проблема уйдет.
Дальнейшие ошибки свидетельствуют о той же проблеме устаревшей платформы.
IFptr fptr = null;
int result;
try
{
fptr = new Fptr();
}
catch (Exception)
{
MessageBox.Show("Не удалось создать объект общего драйвера ККМ!", Application.ProductName,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return false;
}
string COM_FILE = "COM" + comPort;
fptr.setSingleSetting(Constants.LIBFPTR_SETTING_MODEL, Constants.LIBFPTR_MODEL_ATOL_AUTO.ToString());
fptr.setSingleSetting(Constants.LIBFPTR_SETTING_PORT, Constants.LIBFPTR_PORT_COM.ToString());
fptr.setSingleSetting(Constants.LIBFPTR_SETTING_COM_FILE, COM_FILE);
fptr.setSingleSetting(Constants.LIBFPTR_SETTING_BAUDRATE, Constants.LIBFPTR_PORT_BR_115200.ToString());
fptr.applySingleSettings();
fptr.open();
bool isOpened = fptr.isOpened();
if (!isOpened)
{
MessageBox.Show("Ошибка открытия порта устройства");
return false;
}
//Короткий запрос статуса ККТ
fptr.setParam(Constants.LIBFPTR_PARAM_DATA_TYPE, Constants.LIBFPTR_DT_STATUS);
result = fptr.queryData();
if (result < 0)
{
MessageBox.Show("Ошибка статуса устройства. Код: " + result + "\n" + fptr.errorDescription());
return false;
}
uint receiptType = fptr.getParamInt(Constants.LIBFPTR_PARAM_RECEIPT_TYPE);
if (receiptType != Constants.LIBFPTR_RT_CLOSED)
{
result = fptr.cancelReceipt();
if (result < 0)
{
MessageBox.Show("Ошибка операции ККМ(cancelReceipt). Код: " + result + "\n" + fptr.errorDescription());
return false;
}
}
// входим в режим регистрации
// устанавливаем пароль кассира
fptr.setParam(1021, cashierFIO);
fptr.setParam(1203, pwd);
fptr.operatorLogin();
// Запускаем проверку КМ
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE_TYPE, Constants.LIBFPTR_MCT12_AUTO);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE_STATUS, Constants.LIBFPTR_MES_DRY_FOR_SALE);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
// таймаут 5 сек
fptr.setParam(Constants.LIBFPTR_PARAM_TIMEOUT, 5000);
fptr.beginMarkingCodeValidation();
// Синхронный режим, Дожидаемся окончания проверки и запоминаем результат
while (true)
{
fptr.getMarkingCodeValidationStatus();
if (fptr.getParamBool(Constants.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY))
break;
}
uint validationResult = fptr.getParamInt(Constants.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
// Т.к тут просто проверка маркировки, то просто сбрасывем валидацию
fptr.declineMarkingCode();
fptr.destroy();
// из документов
return validationResult == 15;
1. Проверка марки на валидность и ее текущий статус нужно проверять через API честного знака, а не через кассу.
2. Нигде не написано что же за ошибка выходит
3. После введения разрешительного режима я вообще не уверен что марки можно таким образом проверять, т.к. они опасаются DDOS атак и рассматривают подобные запросы без оформления марки именно как атаку:
"Использование метода API разрешительного режима разрешено только в момент перед розничной продажей. Проверка принимаемой продукции с использованием этого метода запрещена. "
Большое спасибо за комментарий, было такое ощущение, что через драйвер проверку делать сейчас не актуально.
Можно уточняющий вопрос, я понимаю что мы можем слать запрос на проверку марки сюда - /api/v4/true-api/codes/check и в случае прохождения проверки реализовывать товар.
Вопрос в чем, куда при формировании чека через кассу Атол записывать информацию о реализации маркированного товара, в какой реквизит, что бы он изьялся из оборота в система ЧЗ.
"куда при формировании чека через кассу Атол записывать информацию о реализации маркированного товара, в какой реквизит, что бы он изьялся из оборота в система ЧЗ" - Вы записываете в реквизиты чека коды маркировки как описано в топике, собственно ККТ передает эти коды маркировки в ОФД, ОФД передает эти данные в ЧЗ и они выводятся из оборота автоматически. С ОФД должен быть заключен договор.
Можно еще уточнить, т.е. мне надо после получения ответа от ЧЗ что марка прошла, формировать чек "Регистрация позиции с отраслевым реквизитом предмета расчета (тег 1260, ФФД 1.2)" ? В описании у штриха ( много разных вариантов регистрации марки в чеке, но если мы работаем с ФФД 1.2, надо реализовывать такую регистрацию, правильно ?
mark = "014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6 SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=";
fptr.SetParam(1262, "020");
fptr.SetParam(1263, "14.12.2018");
fptr.SetParam(1264, "1556");
fptr.SetParam(1265, "tm=mdlp&sid=00000000105200");
fptr.UtilFormTlv();
industryInfo = fptr.GetParamByteArray(fptr.LIBFPTR_PARAM_TAG_VALUE);
validationResult = fptr.GetParamInt(fptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
fptr.SetParam(fptr.LIBFPTR_PARAM_COMMODITY_NAME, "Афобазол");
fptr.SetParam(fptr.LIBFPTR_PARAM_PRICE, 450);
fptr.SetParam(fptr.LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.SetParam(fptr.LIBFPTR_PARAM_MEASUREMENT_UNIT, fptr.LIBFPTR_IU_PIECE);
fptr.SetParam(fptr.LIBFPTR_PARAM_TAX_TYPE, fptr.LIBFPTR_TAX_VAT10);
fptr.SetParam(1212, 33);
fptr.SetParam(1214, 4);
fptr.SetParam(1260, industryInfo);
fptr.SetParam(fptr.LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.SetParam(fptr.LIBFPTR_PARAM_MARKING_CODE_STATUS, fptr.LIBFPTR_MES_DRY_FOR_SALE);
fptr.SetParam(fptr.LIBFPTR_PARAM_MARKING_CODE_TYPE, fptr.LIBFPTR_MCT12_AUTO);
fptr.SetParam(fptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
fptr.SetParam(fptr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.Registration();
ПоказатьНо бывают случаи, когда АПИ ЧЗ марку проверил, а ККМ не смогла. Редко но бывает отвал по таймауту проверки
из лога АТОЛа
2025.09.10 10:44:26.477 T:000004BC INFO [FiscalPrinter |
|---|
| < LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY (65850) = false
2025.09.10 10:44:26.600 T:000004BC INFO [FiscalPrinter] libfptr_get_marking_code_validation_status() [0x05A6FA80] 2025.09.10 10:44:26.600 T:000004BC INFO [FiscalPrinter] output > UA 2025.09.10 10:44:26.600 T:000004BC INFO [Transport] send fiscal (C7) C7 40 55 41 (4 bytes total) 2025.09.10 10:44:26.602 T:000004BC INFO [Transport] recv fiscal (C7) C7 30 30 31 3B 31 33 38 37 38 3B 30 3B 3B 31 3B (16 bytes total) 2025.09.10 10:44:26.603 T:000004BC INFO [FiscalPrinter] input < 1;13878;0;;1; 2025.09.10 10:44:26.603 T:000004BC ERROR [FiscalPrinter] Код ошибки ККТ - 3636h 2025.09.10 10:44:26.604 T:000004BC INFO [FiscalPrinter] < LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY (65850) = true 2025.09.10 10:44:26.604 T:000004BC INFO [FiscalPrinter] < LIBFPTR_PARAM_IS_REQUEST_SENT (65878) = true 2025.09.10 10:44:26.604 T:000004BC INFO [FiscalPrinter] < LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR_DESCRIPTION (65887) = "Истёк таймаут проверки КМ" 2025.09.10 10:44:26.604 T:000004BC INFO [FiscalPrinter] < LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR (65849) = 421]Скрытый текст |
1. Выбирайте самую свободную площадку ЧЗ для проверки.
2. Попробуйте получение параметра в 16-ричном виде.
....
fptr.utilFormTLV();
ДанныеТега1260 = fptr.getParamStringHex(FR.LIBFPTR_PARAM_TAG_VALUE);
.....
fptr.setParamStrHex(1260,ДанныеТега1260);
На счет отвала по таймауту - такое бывает конечно же, это же внешний сервис.
На кассе АТОЛ 91Ф при продаже воды, ФФД 1.2 получаем ошибку на тег 1260.
Лог атола ниже:
025.10.11 17:16:23.979 T:00002ED0 INFO [FiscalPrinter] output > 01
2025.10.11 17:16:23.979 T:00002ED0 INFO [Transport] send fiscal (18) 18 40 30 31 (4 bytes total)
2025.10.11 17:16:23.979 T:00002ED0 INFO [Transport] recv fiscal (18) 18 30 30 30 3B 37 3B 30 3B 30 3B 30 3B (13 bytes total)
2025.10.11 17:16:23.980 T:00002ED0 INFO [FiscalPrinter] input < 0;7;0;0;0;
2025.10.11 17:16:23.980 T:00002ED0 INFO [FiscalPrinter] output > b11;0;32;
2025.10.11 17:16:23.980 T:00002ED0 INFO [Transport] send fiscal (19) 19 40 62 31 31 3B 30 3B 33 32 3B (11 bytes total)
2025.10.11 17:16:24.451 T:00002ED0 INFO [Transport] recv fiscal (19) 19 30 30 (3 bytes total)
2025.10.11 17:16:24.452 T:00002ED0 INFO [FiscalPrinter] input <
2025.10.11 17:16:24.452 T:00002ED0 INFO [FiscalPrinter] output > 01
2025.10.11 17:16:24.452 T:00002ED0 INFO [Transport] send fiscal (1A) 1A 40 30 31 (4 bytes total)
2025.10.11 17:16:24.453 T:00002ED0 INFO [Transport] recv fiscal (1A) 1A 30 30 30 3B 37 3B 31 3B 33 38 3B 30 3B (14 bytes total)
2025.10.11 17:16:24.453 T:00002ED0 INFO [FiscalPrinter] input < 0;7;1;38;0;
2025.10.11 17:16:24.453 T:00002ED0 INFO [FiscalPrinter] < LIBFPTR_PARAM_SHIFT_AUTO_OPENED (65743) = true
2025.10.11 17:16:24.453 T:00002ED0 INFO [FiscalPrinter] > 2108 (2108) = 0
2025.10.11 17:16:24.453 T:00002ED0 INFO [FiscalPrinter] > 2108 (2108) = 0
2025.10.11 17:16:24.453 T:00002ED0 INFO [FiscalPrinter] > 1262 (1262) = "030"
2025.10.11 17:16:24.453 T:00002ED0 INFO [FiscalPrinter] > 1263 (1263) = "21.11.2023"
2025.10.11 17:16:24.453 T:00002ED0 INFO [FiscalPrinter] > 1264 (1264) = "1944"
2025.10.11 17:16:24.453 T:00002ED0 INFO [FiscalPrinter] > 1265 (1265) = "UUID=feadb273-417b-4b1d-be68-2a16fdbd9a88&Time=1760192172582"
2025.10.11 17:16:24.453 T:00002ED0 INFO [FiscalPrinter] libfptr_util_form_tlv() [0x07CA5140]
2025.10.11 17:16:24.459 T:00002ED0 INFO [FiscalPrinter] < LIBFPTR_PARAM_TAG_VALUE (65624) = 3C 08 01 00 00 3C 08 01 00 00 EE 04 03 00 30 33 30 EF 04 0A 00 32 31 2E 31 31 2E 32 30 32 33 F0 04 04 00 31 39 34 34 F1 04 3C 00 55 55 49 44 3D 66 65 61 64 62 32 37 33 2D 34 31 37 62 2D 34 62 31 64 2D 62 65 36 38 2D 32 61 31 36 66 64 62 64 39 61 38 38 26 54 69 6D 65 3D 31 37 36 30 31 39 32 31 37 32 35 38 32
2025.10.11 17:16:24.459 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_COMMODITY_NAME (65631) = "RedBull"
2025.10.11 17:16:24.459 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_PRICE (65632) = 250
2025.10.11 17:16:24.459 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_QUANTITY (65633) = 1
2025.10.11 17:16:24.460 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = LIBFPTR_TAX_NO (6)
2025.10.11 17:16:24.460 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_SUM (65570) = 0
2025.10.11 17:16:24.460 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_POSITION_SUM (65634) = 250
2025.10.11 17:16:24.460 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_DEPARTMENT (65568) = 1
2025.10.11 17:16:24.460 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_INFO_DISCOUNT_SUM (65562) = 0
2025.10.11 17:16:24.460 T:00002ED0 INFO [FiscalPrinter] > 1260 (1260) = 3C 08 01 00 00 3C 08 01 00 00 EE 04 03 00 30 33 30 EF 04 0A 00 32 31 2E 31 31 2E 32 30 32 33 F0 04 04 00 31 39 34 34 F1 04 3C 00 55 55 49 44 3D 66 65 61 64 62 32 37 33 2D 34 31 37 62 2D 34 62 31 64 2D 62 65 36 38 2D 32 61 31 36 66 64 62 64 39 61 38 38 26 54 69 6D 65 3D 31 37 36 30 31 39 32 31 37 32 35 38 32
2025.10.11 17:16:24.460 T:00002ED0 INFO [FiscalPrinter] libfptr_registration() [0x07CA5140]
2025.10.11 17:16:24.460 T:00002ED0 INFO [FiscalPrinter] output > A1
2025.10.11 17:16:24.460 T:00002ED0 INFO [Transport] send fiscal (1B) 1B 40 41 31 (4 bytes total)
2025.10.11 17:16:24.461 T:00002ED0 INFO [Transport] recv fiscal (1B) 1B 30 30 31 31 31 30 32 35 31 37 31 34 30 30 3B (16 bytes total)
2025.10.11 17:16:24.461 T:00002ED0 INFO [FiscalPrinter] input < 111025171400;
2025.10.11 17:16:24.461 T:00002ED0 INFO [FiscalPrinter] output > 34
2025.10.11 17:16:24.461 T:00002ED0 INFO [Transport] send fiscal (1C) 1C 40 33 34 (4 bytes total)
2025.10.11 17:16:24.462 T:00002ED0 INFO [Transport] recv fiscal (1C) 1C 30 30 34 3B 34 3B 34 3B 32 38 32 3B (13 bytes total)
2025.10.11 17:16:24.462 T:00002ED0 INFO [FiscalPrinter] input < 4;4;4;282;
2025.10.11 17:16:24.463 T:00002ED0 INFO [FiscalPrinter] output > bA0;
2025.10.11 17:16:24.463 T:00002ED0 INFO [Transport] send fiscal (1D) 1D 40 62 41 30 3B (6 bytes total)
2025.10.11 17:16:24.463 T:00002ED0 INFO [Transport] recv fiscal (1D) 1D 30 30 (3 bytes total)
2025.10.11 17:16:24.464 T:00002ED0 INFO [FiscalPrinter] input <
2025.10.11 17:16:24.464 T:00002ED0 INFO [FiscalPrinter] output > aAь[04h]g[00h]<[08h][01h][00h][00h]<[08h][01h][00h][00h]ю[04h][03h][00h]030я[04h][0Ah][00h]21.11.2023Ё[04h][04h][00h]1944ё[04h]<[00h]UUID=feadb273-417b-4b1d-be68-2a16fdbd9a88&Time=1760192172582;0;
2025.10.11 17:16:24.464 T:00002ED0 INFO [Transport] send fiscal (1E) 1E 40 61 41 EC 04 67 00 3C 08 01 00 00 3C 08 01 00 00 EE 04 03 00 30 33 30 EF 04 0A 00 32 31 2E 31 31 2E 32 30 32 33 F0 04 04 00 31 39 34 34 F1 04 3C 00 55 55 49 44 3D 66 65 61 64 62 32 37 33 2D 34 31 37 62 2D 34 62 31 64 2D 62 65 36 38 2D 32 61 31 36 66 64 62 64 39 61 38 38 26 54 69 6D 65 3D 31 37 36 30 31 39 32 31 37 32 35 38 32 3B 30 3B (114 bytes total)
2025.10.11 17:16:24.759 T:00002ED0 INFO [Transport] recv fiscal (1E) 1E 59 44 (3 bytes total)
2025.10.11 17:16:24.759 T:00002ED0 ERROR [FiscalPrinter] Код ошибки ККТ - 4459h
2025.10.11 17:16:24.764 T:00002ED0 INFO [FiscalPrinter] < LIBFPTR_PARAM_ERROR_TAG_NUMBER (65617) = 1260
2025.10.11 17:16:24.765 T:00002ED0 ERROR [FiscalPrinter] Объекту 0x07CA5140 присвоен код ошибки 26 [Неверный формат команды]
2025.10.11 17:16:24.765 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_TEXT (65536) = "========================="
2025.10.11 17:16:24.765 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_TEXT_WRAP (65537) = LIBFPTR_TW_WORDS (1)
2025.10.11 17:16:24.765 T:00002ED0 INFO [FiscalPrinter] libfptr_print_text() [0x07CA5140]
2025.10.11 17:16:24.765 T:00002ED0 INFO [FiscalPrinter] output > P3
2025.10.11 17:16:24.765 T:00002ED0 INFO [Transport] send fiscal (1F) 1F 40 50 33 (4 bytes total)
2025.10.11 17:16:24.765 T:00002ED0 INFO [Transport] recv fiscal (1F) 1F 30 30 31 3B (5 bytes total)
2025.10.11 17:16:24.765 T:00002ED0 INFO [FiscalPrinter] input < 1;
2025.10.11 17:16:24.765 T:00002ED0 INFO [FiscalPrinter] output > P1
2025.10.11 17:16:24.766 T:00002ED0 INFO [Transport] send fiscal (20) 20 40 50 31 (4 bytes total)
2025.10.11 17:16:24.766 T:00002ED0 INFO [Transport] recv fiscal (20) 20 30 30 33 38 34 3B (7 bytes total)
2025.10.11 17:16:24.766 T:00002ED0 INFO [FiscalPrinter] input < 384;
2025.10.11 17:16:24.766 T:00002ED0 INFO [FiscalPrinter] output > P21;
2025.10.11 17:16:24.766 T:00002ED0 INFO [Transport] send fiscal (21) 21 40 50 32 31 3B (6 bytes total)
2025.10.11 17:16:24.767 T:00002ED0 INFO [Transport] recv fiscal (21) 21 30 30 39 3B 31 34 3B (8 bytes total)
2025.10.11 17:16:24.767 T:00002ED0 INFO [FiscalPrinter] input < 9;14;
2025.10.11 17:16:24.767 T:00002ED0 INFO [FiscalPrinter] output > PA1;=========================;1;1;
2025.10.11 17:16:24.767 T:00002ED0 INFO [Transport] send fiscal (22) 22 40 50 41 31 3B 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3D 3B 31 3B 31 3B (36 bytes total)
2025.10.11 17:16:24.768 T:00002ED0 INFO [Transport] recv fiscal (22) 22 41 61 (3 bytes total)
2025.10.11 17:16:24.768 T:00002ED0 ERROR [FiscalPrinter] Код ошибки ККТ - 6141h
2025.10.11 17:16:24.768 T:00002ED0 ERROR [FiscalPrinter] Объекту 0x07CA5140 присвоен код ошибки 203 [Произошла критическая ошибка, документ необходимо отменить]
2025.10.11 17:16:24.768 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_PAYMENT_TYPE (65564) = LIBFPTR_PT_CASH (0)
2025.10.11 17:16:24.768 T:00002ED0 INFO [FiscalPrinter] > LIBFPTR_PARAM_PAYMENT_SUM (65565) = 250
2025.10.11 17:16:24.768 T:00002ED0 INFO [FiscalPrinter] libfptr_payment() [0x07CA5140]
2025.10.11 17:16:24.768 T:00002ED0 INFO [FiscalPrinter] output > bD0;250;
2025.10.11 17:16:24.768 T:00002ED0 INFO [Transport] send fiscal (23) 23 40 62 44 30 3B 32 35 30 3B (10 bytes total)
2025.10.11 17:16:24.769 T:00002ED0 INFO [Transport] recv fiscal (23) 23 41 61 (3 bytes total)
2025.10.11 17:16:24.769 T:00002ED0 ERROR [FiscalPrinter] Код ошибки ККТ - 6141h
2025.10.11 17:16:24.769 T:00002ED0 ERROR [FiscalPrinter] Объекту 0x07CA5140 присвоен код ошибки 203 [Произошла критическая ошибка, документ необходимо отменить]
2025.10.11 17:16:24.769 T:00002ED0 INFO [FiscalPrinter] libfptr_close_receipt() [0x07CA5140]
2025.10.11 17:16:24.769 T:00002ED0 INFO [FiscalPrinter] output > 01
2025.10.11 17:16:24.769 T:00002ED0 INFO [Transport] send fiscal (24) 24 40 30 31 (4 bytes total)
2025.10.11 17:16:24.770 T:00002ED0 INFO [Transport] recv fiscal (24) 24 30 30 30 3B 37 3B 31 35 33 37 3B 32 3B 30 3B (16 bytes total)
2025.10.11 17:16:24.771 T:00002ED0 INFO [FiscalPrinter] input < 0;7;1537;2;0;
2025.10.11 17:16:24.771 T:00002ED0 INFO [FiscalPrinter] Чтение кеша: [C:\Users\User\AppData\Roaming\ATOL\drivers10\cache\00108203424918.json]
2025.10.11 17:16:24.771 T:00002ED0 INFO [FiscalPrinter] Содержимое файла кеша:
2025.10.11 17:16:24.771 T:00002ED0 INFO [FiscalPrinter] {
"lastFiscalDocumentNumber" : 3846
}
Подскажите в чем может быть проблема.
Просто проверочные данные на вход абсолютно те же самые, и год документа 23...
У него все получилось, пишет.
Могу предложить тоже самое - изменить последовательность проверки с сохранением результат в переменную.
Я в своем решении вообще сначала организую таблицу проверки, проверяю разрешительный режим, записываю результат проверки в таблицу, затем уже при пробитии чека - ПЕРЕД выводом каждой строки с товаром заполняю тэг 1260 из таблицы.
Добавили разрешительный режим для Атол.
При продаже воды получили ошибку: Не найден обязательный параметр (LIBFPTR_PARAM_PRICE)] , хотя в логе есть это параметр
2025.10.29 08:11:04.494 T:00000C70 INFO [FiscalPrinter] < LIBFPTR_PARAM_RECEIPT_SIZE (65904) = 291
2025.10.29 08:11:04.494 T:00000C70 INFO [FiscalPrinter] < LIBFPTR_PARAM_RECEIPT_PERCENTAGE_SIZE (65935) = 1
2025.10.29 08:11:04.497 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_COMMODITY_NAME (65631) = ""Аква минерале 0,5 л""
2025.10.29 08:11:04.497 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_QUANTITY (65633) = 1
2025.10.29 08:11:04.497 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_MEASUREMENT_UNIT (65851) = LIBFPTR_IU_PIECE (0)
2025.10.29 08:11:04.497 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_PRICE (65632) = 107
2025.10.29 08:11:04.498 T:00000C70 INFO [FiscalPrinter] > 1212 (1212) = 1
2025.10.29 08:11:04.498 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = LIBFPTR_TAX_VAT5 (9)
2025.10.29 08:11:04.498 T:00000C70 INFO [FiscalPrinter] > 1262 (1262) = "020"
2025.10.29 08:11:04.498 T:00000C70 INFO [FiscalPrinter] > 1263 (1263) = "14.12.2018"
2025.10.29 08:11:04.498 T:00000C70 INFO [FiscalPrinter] > 1264 (1264) = "1556"
2025.10.29 08:11:04.498 T:00000C70 INFO [FiscalPrinter] > 1265 (1265) = "tm=mdlp&sid=00000000105200"
2025.10.29 08:11:04.498 T:00000C70 INFO [FiscalPrinter] libfptr_util_form_tlv() [0x07137380]
2025.10.29 08:11:04.499 T:00000C70 INFO [FiscalPrinter] < LIBFPTR_PARAM_TAG_VALUE (65624) = BC 04 01 00 01 EE 04 03 00 30 32 30 EF 04 0A 00 31 34 2E 31 32 2E 32 30 31 38 F0 04 04 00 31 35 35 36 F1 04 1A 00 74 6D 3D 6D 64 6C 70 26 73 69 64 3D 30 30 30 30 30 30 30 30 31 30 35 32 30 30
2025.10.29 08:11:04.517 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "0104600494693359215rpZ2gYgKa6Wa93WGKq"
2025.10.29 08:11:04.517 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = LIBFPTR_MES_PIECE_SOLD (1)
2025.10.29 08:11:04.517 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_TYPE (65826) = LIBFPTR_MCT12_AUTO (256)
2025.10.29 08:11:04.518 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT (65886) = 15
2025.10.29 08:11:04.518 T:00000C70 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2025.10.29 08:11:04.518 T:00000C70 INFO [FiscalPrinter] libfptr_registration() [0x07137380]
2025.10.29 08:11:04.518 T:00000C70 INFO [FiscalPrinter] output > 01
2025.10.29 08:11:04.518 T:00000C70 INFO [Transport] send fiscal (3E) 3E 40 30 31 (4 bytes total)
2025.10.29 08:11:04.522 T:00000C70 INFO [Transport] recv fiscal (3E) 3E 30 30 30 3B 37 3B 31 3B 33 38 3B 30 3B (14 bytes total)
2025.10.29 08:11:04.522 T:00000C70 INFO [FiscalPrinter] input < 0;7;1;38;0;
2025.10.29 08:11:04.522 T:00000C70 INFO [FiscalPrinter] output > 17
2025.10.29 08:11:04.522 T:00000C70 INFO [Transport] send fiscal (3F) 3F 40 31 37 (4 bytes total)
2025.10.29 08:11:04.526 T:00000C70 INFO [Transport] recv fiscal (3F) 3F 30 30 32 39 31 30 32 35 30 38 30 39 32 33 3B (16 bytes total)
2025.10.29 08:11:04.526 T:00000C70 INFO [FiscalPrinter] input < 291025080923;
2025.10.29 08:11:04.527 T:00000C70 ERROR [FiscalPrinter] Объекту 0x07137380 присвоен код ошибки 8 [Не найден обязательный параметр (LIBFPTR_PARAM_PRICE)]
Получили новую загадку:
При валидации приходится отправлять МС с CHR(29), т.к. с \u001D не проходит:
-------------------------------------------------------
2025.10.29 11:28:10.125 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_TYPE (65826) = LIBFPTR_MCT12_AUTO (256)
2025.10.29 11:28:10.125 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "0104600494693359215<Hu.e.&NGY1r93<chr(29)>FwcU"
2025.10.29 11:28:10.125 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = LIBFPTR_MES_PIECE_SOLD (1)
2025.10.29 11:28:10.125 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT (65845) = true
2025.10.29 11:28:10.125 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2025.10.29 11:28:10.125 T:00000F40 INFO [FiscalPrinter] libfptr_begin_marking_code_validation() [0x07384190]
----------------------------------------------------------------
так валидация проходит и получаем 15
При регистрации позиции, нет смысла указывать правильный код (с \u001D), атол все равно берет код марки из своей таблицы, куда записал при валидации, т.е. с Chr(29)
В результате, получаем ошибку [Некорректный код маркировки]
---------------------------------------------------------
2025.10.29 11:28:20.739 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "0104600494693359215<Hu.e.&NGY1r\u001D93FwcU"
2025.10.29 11:28:20.739 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = LIBFPTR_MES_PIECE_SOLD (1)
2025.10.29 11:28:20.739 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_TYPE (65826) = LIBFPTR_MCT12_AUTO (256)
2025.10.29 11:28:20.740 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT (65886) = 15
2025.10.29 11:28:20.740 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2025.10.29 11:28:20.740 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_COMMODITY_NAME (65631) = ""Аква минерале 0,5 л""
2025.10.29 11:28:20.740 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_QUANTITY (65633) = 1
2025.10.29 11:28:20.741 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_MEASUREMENT_UNIT (65851) = LIBFPTR_IU_PIECE (0)
2025.10.29 11:28:20.741 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_PRICE (65632) = 107
2025.10.29 11:28:20.741 T:00000F40 INFO [FiscalPrinter] > 1212 (1212) = 1
2025.10.29 11:28:20.741 T:00000F40 INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = LIBFPTR_TAX_VAT5 (9)
2025.10.29 11:28:20.741 T:00000F40 INFO [FiscalPrinter] libfptr_registration() [0x07384190]
2025.10.29 11:28:20.742 T:00000F40 INFO [FiscalPrinter] output > 01
2025.10.29 11:28:20.742 T:00000F40 INFO [Transport] send fiscal (3E) 3E 40 30 31 (4 bytes total)
2025.10.29 11:28:20.745 T:00000F40 INFO [Transport] recv fiscal (3E) 3E 30 30 30 3B 37 3B 31 3B 33 38 3B 30 3B (14 bytes total)
2025.10.29 11:28:20.745 T:00000F40 INFO [FiscalPrinter] input < 0;7;1;38;0;
2025.10.29 11:28:20.745 T:00000F40 INFO [FiscalPrinter] output > 17
2025.10.29 11:28:20.745 T:00000F40 INFO [Transport] send fiscal (3F) 3F 40 31 37 (4 bytes total)
2025.10.29 11:28:20.749 T:00000F40 INFO [Transport] recv fiscal (3F) 3F 30 30 32 39 31 30 32 35 30 38 30 39 32 33 3B (16 bytes total)
2025.10.29 11:28:20.749 T:00000F40 INFO [FiscalPrinter] input < 291025080923;
2025.10.29 11:28:20.749 T:00000F40 INFO [FiscalPrinter] output > 34
2025.10.29 11:28:20.750 T:00000F40 INFO [Transport] send fiscal (40) 40 40 33 34 (4 bytes total)
2025.10.29 11:28:20.753 T:00000F40 INFO [Transport] recv fiscal (40) 40 30 30 34 3B 34 3B 34 3B 33 36 33 3B (13 bytes total)
2025.10.29 11:28:20.754 T:00000F40 INFO [FiscalPrinter] input < 4;4;4;363;
2025.10.29 11:28:20.754 T:00000F40 INFO [FiscalPrinter] Чтение таблицы КМ (1 элементов)
2025.10.29 11:28:20.754 T:00000F40 INFO [FiscalPrinter] 1. [CRC = 0xEFD19FD0, 2106 = 15] 0104600494693359215<Hu.e.&NGY1r93FwcU
2025.10.29 11:28:20.755 T:00000F40 ERROR [FiscalPrinter] Объекту 0x07384190 присвоен код ошибки 409 [Некорректный код маркировки]
А вот если лог просматриваешь в Notepad++, например, то там уже видишь символы.
пример:
2025.02.05 14:03:29.190 T: T:0000023C INFO [FiscalPrinter] input < 0;7;1;38;0;
2025.02.05 14:03:29.191 T: T:0000023C INFO [FiscalPrinter] > LIBFPTR_PARAM_COMMODITY_NAME (65631) = "TM00446100"
2025.02.05 14:03:29.191 T: T:0000023C INFO [FiscalPrinter] > 1212 (1212) = 1
2025.02.05 14:03:29.191 T: T:0000023C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_TYPE (65826) = 256
2025.02.05 14:03:29.191 T: T:0000023C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "0104603755648291215jZpjOcMaaFY991EE1992o/c7x/Mj2Yn77N2GhLzoG6fL8j+Waw09hAEWbW7v1YA="
2025.02.05 14:03:29.191 T: T:0000023C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = 1
2025.02.05 14:03:29.191 T: T:0000023C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT (65845) = true
2025.02.05 14:03:29.191 T: T:0000023C INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2025.02.05 14:03:29.191 T: T:0000023C INFO [FiscalPrinter] libfptr_begin_marking_code_validation()
у атола написано, что код должен быть таким:
0104600494693359215<Hu.e.&NGY1r\u001D93FwcU
Но так он не проходит
Его же вставляем в разрешительный режим
На счет экранирования символов в АТОЛе - не видел у него таких надписей. Возможно это при передачи через JSON - тогда справедливо.
У меня в описании - использование именно команд драйвера - я передаю код как есть, с символами 29 в качестве разделителей
вот:
Общий алгоритм проведения чека с маркировкой в синхронном режиме
String mark = "014494550435306821QXYXSALGLMYQQ\u001D91EE06\u001D92YWCXbmK6 SN8vvwoxZFk7WAY8WoJNMGGr6Cgtiuja04c=";
// Запускаем проверку КМ в синхронном режиме с таймаутом 2 минуты (120000 миллисекунд)
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE_TYPE, Constants.LIBFPTR_MCT12_AUTO);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE_STATUS, Constants.LIBFPTR_MES_DRY_FOR_SALE);
fptr.setParam(Constants.LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(Constants.LIBFPTR_PARAM_MEASUREMENT_UNIT, Constants.LIBFPTR_IU_PIECE);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, "1/2");
fptr.setParam(Constants.LIBFPTR_PARAM_TIMEOUT, 120000);
fptr.beginMarkingCodeValidation();
// Выполнение данного потока останавливается до тех пор, пока не будет выполнена проверка КМ!
fptr.getMarkingCodeValidationStatus();
if (!fptr.getParamBool(Constants.LIBFPTR_PARAM_MARKING_CODE_VALIDATION_READY)) {
break;
}
uint validationResult = fptr.getParamInt(Constants.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT);
// Подтверждаем реализацию товара с указанным КМ
fptr.acceptMarkingCode();
// ... Проверяем остальные КМ
// Формируем чек
fptr.setParam(Constants.LIBFPTR_PARAM_RECEIPT_TYPE, Constants.LIBFPTR_RT_SELL);
fptr.openReceipt();
fptr.setParam(Constants.LIBFPTR_PARAM_COMMODITY_NAME, "Молоко");
fptr.setParam(Constants.LIBFPTR_PARAM_PRICE, 80);
fptr.setParam(Constants.LIBFPTR_PARAM_QUANTITY, 1.000);
fptr.setParam(Constants.LIBFPTR_PARAM_MEASUREMENT_UNIT, Constants.LIBFPTR_IU_PIECE);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_FRACTIONAL_QUANTITY, "1/2");
fptr.setParam(Constants.LIBFPTR_PARAM_TAX_TYPE, Constants.LIBFPTR_TAX_VAT10);
fptr.setParam(1212, 33);
fptr.setParam(1214, 4);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE, mark);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE_STATUS, Constants.LIBFPTR_MES_DRY_FOR_SALE);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult);
fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0);
fptr.registration(); ПоказатьМожет есть другое описание?
Покажите, если не трудно, пожалуйста.
Его же вставляем в разрешительный режим
Похоже, что так.
Но сначала нужна валидация,
Атол запоминает этот код и при регистрации позиции, подставляет его, но тут уже код оказывается не верным.
Подозреваю, где-то делаю неправильно, а где - не пойму.
До разрешительного режима (только с валидацией) все работало отлично, теперь не получается.
Валидацию также проходит, а регистрацию с разрешительным режимом - нет.
Подскажете?
Еще раз обращу внимание на статью - там все подробно описано про разрешительный режим.
Спасибо большое, что помогаете, но я пока не понимаю, что делаю неправильно.
Попробую описать подробнее:
Валидация:
code = "0104600494693359215rpZ2gYgKa6Wa93WGKq" //(код с символом Chr(29))
выполняем:
_fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE_TYPE, Constants.LIBFPTR_MCT12_AUTO)
_fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE, code)
_fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE_STATUS, 1)
_fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_WAIT_FOR_VALIDATION_RESULT, true)
_fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0)
_fptr.beginMarkingCodeValidation()
validationResult = _fptr.getParamInt(Constants.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT)
_fptr.acceptMarkingCode()
//здесь все нормально, валидация проходит:
< LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_ERROR (65849) = 0
< 2106 (2106) = 15
LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT (65886) = 15
//запоминаем рез-тат валидации (15), после этого начинаем формирование чека.:
code = 0104600494693359215rpZ2gYgKa6Wa\u001D93WGKq
_fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE, code)
_fptr.setParam(_fptr.LIBFPTR_PARAM_MARKING_CODE_STATUS, 1)
_fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE_TYPE, Constants.LIBFPTR_MCT12_AUTO)
_fptr.setParam(_fptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, 15)
_fptr.setParam(_fptr.LIBFPTR_PARAM_MARKING_PROCESSING_MODE, 0)
_fptr.setParam(Constants.LIBFPTR_PARAM_COMMODITY_NAME, "Вода ...")
_fptr.setParam(Constants.LIBFPTR_PARAM_QUANTITY, 1)
_fptr.setParam(Constants.LIBFPTR_PARAM_MEASUREMENT_UNIT, Constants.LIBFPTR_IU_PIECE)
_fptr.setParam(Constants.LIBFPTR_PARAM_PRICE, 107.00)
_fptr.setParam(1212, 1)
_fptr.setParam(Constants.LIBFPTR_PARAM_TAX_TYPE, LIBFPTR_TAX_VAT5)
_fptr.registration()
//получаем -1 (Ошибка Атол №409: Некорректный код маркировки)
//то есть, в это месте он берет код из своей таблицы, куда записал после успешной валидации и обзывает его некорректным
2025.10.29 11:28:20.754 T:00000F40 INFO [FiscalPrinter] Чтение таблицы КМ (1 элементов)
2025.10.29 11:28:20.754 T:00000F40 INFO [FiscalPrinter] 1. [CRC = 0xEFD19FD0, 2106 = 15] 0104600494693359215rpZ2gYgKa6Wa93WGKq
2025.10.29 11:28:20.755 T:00000F40 ERROR [FiscalPrinter] Объекту 0x07384190 присвоен код ошибки 409 [Некорректный код маркировки]
Показать1. А зачем нужно еще одно присвоение переменной code? Вы же уже присвоили код вверху.
2.
_fptr.setParam(Constants.LIBFPTR_PARAM_COMMODITY_NAME, "Вода ...")
Должно быть ПЕРЕД
_fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE, code)
Это происходит в разных методах.
Сначала - валидация, чтобы разрешить продажу, потом запускается создание и печать чека уже в другом методе
_fptr.setParam(Constants.LIBFPTR_PARAM_MARKING_CODE, code)
Было и так, не помогало
Отправили на валидацию,
получили ответ и после
_fptr.acceptMarkingCode()
следом сразу идет
_fptr.setParam(FR.LIBFPTR_PARAM_COMMODITY_NAME,"....")
Вместо
_fptr.setParam(_fptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, 15)
Правильно так:
_fptr.setParam(_fptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult)
_fptr.setParam(_fptr.LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT, validationResult)
у меня в коде так и есть
Не проходит только код марки, полученный из таблицы Атол, куда он записывается Атолом при валидации
1. Открываете чек
Открываем цикл товаров
2. _fptr.setParam(FR.LIBFPTR_PARAM_COMMODITY_NAME,"....")
3. Производим валидацию марки
4. _fptr.setParam(FR.LIBFPTR_PARAM_COMMODITY_NAME,"....")
5. все остальные действия с этой же маркой и ценами
6. регистрация
Закрываем цикл товаров
7. закрываем чек
Попробую завтра.
А как быть, если товар не прошел валидацию, а в чеке один товар?
Отменять чек?
Валидация прошла
Регистрация позиции - вроде бы тоже
2025.10.31 11:07:09.933 T:000003A4 INFO [FiscalPrinter] < LIBFPTR_PARAM_RECEIPT_SIZE (65904) = 310
2025.10.31 11:07:09.933 T:000003A4 INFO [FiscalPrinter] < LIBFPTR_PARAM_RECEIPT_PERCENTAGE_SIZE (65935) = 1
2025.10.31 11:07:09.954 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_COMMODITY_NAME (65631) = ""Аква минерале 0,5 л""
2025.10.31 11:07:09.954 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_QUANTITY (65633) = 1
2025.10.31 11:07:09.954 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_MEASUREMENT_UNIT (65851) = LIBFPTR_IU_PIECE (0)
2025.10.31 11:07:09.954 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE (65760) = "0104600494693335215g=Y'II"Gl!o&93lbZP"
2025.10.31 11:07:09.954 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_STATUS (65846) = LIBFPTR_MES_PIECE_FOR_SALE (5)
2025.10.31 11:07:09.955 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_TYPE (65826) = LIBFPTR_MCT12_AUTO (256)
2025.10.31 11:07:09.955 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_CODE_ONLINE_VALIDATION_RESULT (65886) = 15
2025.10.31 11:07:09.955 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_MARKING_PROCESSING_MODE (65852) = 0
2025.10.31 11:07:09.955 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_PRICE (65632) = 107
2025.10.31 11:07:09.955 T:000003A4 INFO [FiscalPrinter] > 1212 (1212) = 1
2025.10.31 11:07:09.955 T:000003A4 INFO [FiscalPrinter] > LIBFPTR_PARAM_TAX_TYPE (65569) = LIBFPTR_TAX_VAT5 (9)
2025.10.31 11:07:09.955 T:000003A4 INFO [FiscalPrinter] libfptr_registration() [0x071062A0]
2025.10.31 11:07:09.956 T:000003A4 INFO [FiscalPrinter] output > 01
2025.10.31 11:07:09.956 T:000003A4 INFO [Transport] send fiscal (43) 43 40 30 31 (4 bytes total)
2025.10.31 11:07:09.958 T:000003A4 INFO [Transport] recv fiscal (43) 43 30 30 30 3B 37 3B 31 3B 33 38 3B 30 3B (14 bytes total)
2025.10.31 11:07:09.959 T:000003A4 INFO [FiscalPrinter] input < 0;7;1;38;0;
2025.10.31 11:07:09.959 T:000003A4 INFO [FiscalPrinter] output > 17
2025.10.31 11:07:09.959 T:000003A4 INFO [Transport] send fiscal (44) 44 40 31 37 (4 bytes total)
2025.10.31 11:07:09.965 T:000003A4 INFO [Transport] recv fiscal (44) 44 30 30 33 31 31 30 32 35 30 38 33 32 31 39 3B (16 bytes total)
2025.10.31 11:07:09.966 T:000003A4 INFO [FiscalPrinter] input < 311025083219;
2025.10.31 11:07:09.966 T:000003A4 INFO [FiscalPrinter] output > 34
2025.10.31 11:07:09.966 T:000003A4 INFO [Transport] send fiscal (45) 45 40 33 34 (4 bytes total)
2025.10.31 11:07:09.970 T:000003A4 INFO [Transport] recv fiscal (45) 45 30 30 34 3B 34 3B 34 3B 33 36 33 3B (13 bytes total)
2025.10.31 11:07:09.970 T:000003A4 INFO [FiscalPrinter] input < 4;4;4;363;
2025.10.31 11:07:09.970 T:000003A4 INFO [FiscalPrinter] Чтение таблицы КМ (1 элементов)
2025.10.31 11:07:09.971 T:000003A4 INFO [FiscalPrinter] 1. [CRC = 0x4DD30770, 2106 = 15] 0104600494693335215g=Y'II"Gl!o&93lbZP
2025.10.31 11:07:09.971 T:000003A4 INFO [FiscalPrinter] output > bQ0;0;5;15;0104600494693335215g=Y'II"Gl!o&[1Dh]93lbZP;
2025.10.31 11:07:09.971 T:000003A4 INFO [Transport] send fiscal (46) 46 40 62 51 30 3B 30 3B 35 3B 31 35 3B 30 31 30 34 36 30 30 34 39 34 36 39 33 33 33 35 32 31 35 67 3D 59 27 49 49 22 47 6C 21 6F 26 1D 39 33 6C 62 5A 50 3B (52 bytes total)
2025.10.31 11:07:10.092 T:000003A4 INFO [Transport] recv fiscal (46) 46 30 30 (3 bytes total)
2025.10.31 11:07:10.092 T:000003A4 INFO [FiscalPrinter] input <
2025.10.31 11:07:10.092 T:000003A4 INFO [FiscalPrinter] output > aA<[08h][01h][00h][00h];0;
2025.10.31 11:07:10.092 T:000003A4 INFO [Transport] send fiscal (47) 47 40 61 41 3C 08 01 00 00 3B 30 3B (12 bytes total)
2025.10.31 11:07:10.099 T:000003A4 INFO [Transport] recv fiscal (47) 47 30 30 (3 bytes total)
2025.10.31 11:07:10.099 T:000003A4 INFO [FiscalPrinter] input <
2025.10.31 11:07:10.099 T:000003A4 INFO [FiscalPrinter] output > bR"Аква минерале 0,5 л";107;1;107;7;0;4;1;
2025.10.31 11:07:10.099 T:000003A4 INFO [Transport] send fiscal (48) 48 40 62 52 22 80 AA A2 A0 20 AC A8 AD A5 E0 A0 AB A5 20 30 2C 35 20 AB 22 3B 31 30 37 3B 31 3B 31 30 37 3B 37 3B 30 3B 34 3B 31 3B (44 bytes total)
2025.10.31 11:07:10.228 T:000003A4 INFO [Transport] recv fiscal (48) 48 30 30 (3 bytes total)
2025.10.31 11:07:10.228 T:000003A4 INFO [FiscalPrinter] input <
2025.10.31 11:07:10.228 T:000003A4 INFO [FiscalPrinter] output > 01
2025.10.31 11:07:10.228 T:000003A4 INFO [Transport] send fiscal (49) 49 40 30 31 (4 bytes total)
2025.10.31 11:07:10.232 T:000003A4 INFO [Transport] recv fiscal (49) 49 30 30 30 3B 37 3B 34 30 39 37 3B 36 33 3B 30 3B (17 bytes total)
2025.10.31 11:07:10.232 T:000003A4 INFO [FiscalPrinter] input < 0;7;4097;63;0;
2025.10.31 11:07:10.233 T:000003A4 INFO [FiscalPrinter] output > 17
2025.10.31 11:07:10.233 T:000003A4 INFO [Transport] send fiscal (4A) 4A 40 31 37 (4 bytes total)
2025.10.31 11:07:10.237 T:000003A4 INFO [Transport] recv fiscal (4A) 4A 30 30 33 31 31 30 32 35 30 38 33 32 31 39 3B (16 bytes total)
2025.10.31 11:07:10.237 T:000003A4 INFO [FiscalPrinter] input < 311025083219;
2025.10.31 11:07:10.237 T:000003A4 INFO [FiscalPrinter] output > 01
2025.10.31 11:07:10.237 T:000003A4 INFO [Transport] send fiscal (4B) 4B 40 30 31 (4 bytes total)
2025.10.31 11:07:10.241 T:000003A4 INFO [Transport] recv fiscal (4B) 4B 30 30 30 3B 37 3B 34 30 39 37 3B 36 33 3B 30 3B (17 bytes total)
2025.10.31 11:07:10.241 T:000003A4 INFO [FiscalPrinter] input < 0;7;4097;63;0;
2025.10.31 11:07:10.242 T:000003A4 INFO [FiscalPrinter] output > 17
2025.10.31 11:07:10.242 T:000003A4 INFO [Transport] send fiscal (4C) 4C 40 31 37 (4 bytes total)
2025.10.31 11:07:10.245 T:000003A4 INFO [Transport] recv fiscal (4C) 4C 30 30 33 31 31 30 32 35 30 38 33 32 31 39 3B (16 bytes total)
2025.10.31 11:07:10.246 T:000003A4 INFO [FiscalPrinter] input < 311025083219;
2025.10.31 11:07:10.246 T:000003A4 INFO [FiscalPrinter] < LIBFPTR_PARAM_RECEIPT_SIZE (65904) = 426
2025.10.31 11:07:10.246 T:000003A4 INFO [FiscalPrinter] < LIBFPTR_PARAM_RECEIPT_PERCENTAGE_SIZE (65935) = 1
2025.10.31 11:07:10.253 T:000003A4 ERROR [COM-OBJECT] Неподдерживаемый тип параметра в COM-обертке: 24593
2025.10.31 11:08:02.916 T:000003A4 INFO [FiscalPrinter] libfptr_close() [0x071062A0]
2025.10.31 11:08:02.987 P50LOG:00000ABC INFO [FiscalPrinter] Завершение выполнения потока P50LOG:00000ABC
2025.10.31 11:08:02.997 P50POLL:00000CE0 INFO [FiscalPrinter] Завершение выполнения потока P50POLL:00000CE0
ПоказатьОднако, в конце получаю ошибку
Судя по всему, эта ошибка происходит здесь:
_fptr.setParam(1261, industryInfo)
т.е., после регистрации позиции при попытке отправить уведомление, которое формируется так:
_fptr.setParam(1262, "020")
_fptr.setParam(1263, "14.12.2018")
_fptr.setParam(1264, "1556")
_fptr.setParam(1265, "tm=mdlp&sid=00000000105200")
_fptr.utilFormTlv()
industryInfo = _fptr.getParamByteArray(Constants.LIBFPTR_PARAM_TAG_VALUE)
Если это клякса, тогда опять последовательность:
1. Сначала мы получаем сведения о разрешительном режиме по всем строкам. Запоминаем значения industryInfo в таблицу.
Затем начинаем пробивать чек в цикле:
1 валидация,
2. название,
3. остальные реквизиты строки продажи
4. результат валидации.
5. инфо о разрешительном режиме,
6. регистрация
см 167
Рейтинг: 602
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1563868
Создание 07.12.21 11:00
Обновление 07.12.21 11:00
Просмотры 48985
Загрузки 0
Рейтинг
26
Комментарии 197
Код открыт Да
Рубрики Кассовые операции ККМ
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация Универсальные
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Управленческий учет
Доступ к файлу Бесплатно (free)