Приветствуем вас! При переходе на формат фискальных данных ФФД 1.2 и внедрении разрешительного режима (РР) розничные продавцы часто сталкиваются с неприятной ситуацией: на кассах одного производителя (например, Штрих-М) чеки бьются со статусом [М+], а на ККТ АТОЛ упорно печатается статус [М] — есть готовая настройка печати маркировки на кассе при распределении продаж. При этом сам товар в оборот возвращается и выбывает без ошибок, но покупатели или контролирующие органы могут задавать лишние вопросы. Давайте подробно разберем, почему так происходит, проанализируем взаимосвязь учетной системы с кассовым ядром и выясним, как настроить систему для получения заветного плюса на чеках.
Прежде всего, давайте устраним путаницу в понятиях, которая часто возникает у технических специалистов. При продаже маркированного товара происходят два абсолютно независимых процесса:
ЗапросКМ и ПолучитьРезультатыЗапросаКМ через оператора фискальных данных (ОФД) напрямую в ИС Маркировки (сервер ОИСМ). Именно по результатам этой проверки на чековой ленте печатается символ статуса:
Выясним причину, почему 1С может принудительно давать команду кассе не дожидаться ответа от сервера ИСМ. Для этого перейдем в настройки программы:
Откроем раздел «НСИ и администрирование» — «Настройки интеграции» — «Интеграция с ИС МП» — «Настройки сканирования кодов маркировки». Проанализируем состояние двух флагов:
Если в 1С все настройки выставлены верно, но АТОЛ все равно выдает только [М], проблема кроется в таблицах самой кассы или в параметрах связи с ОИСМ — здесь пригодится централизованное управление кассами и драйверами из 1С. Фискальный накопитель пытается отправить запрос, но сервер не отвечает, либо ККТ не знает, куда отправлять этот запрос. Настроим параметры связи через «Тест драйвера ККТ»:
ЗапросКМ будут завершаться по тайм-ауту. — для этого подойдёт настройка ККТ АТОЛ для ФФД 1.2 и разрешительного режима.Локальная проверка марки на кассе невозможна без актуальных ключей проверки, хранящихся непосредственно в ФН-М. Если ККТ давно не связывалась с сервером обновления ключей (ОКП), легитимность проверок падает, и касса возвращает ошибку. Обновим ключи вручную:
В «Тесте драйвера ККТ» перейдите в раздел «ФН» — «Сервис». Найдите и нажмите кнопку «Обновить ключи ФН-М» (или «Запрос ключей проверки»). ККТ должна быть подключена к интернету. Убедитесь, что операция завершилась успешно.
В версиях драйвера АТОЛ 10.10.8.x (особенно в релизах 10.10.8.23) наблюдается баг при работе с асинхронными запросами проверки КМ в 1С. Когда программа посылает команду НачатьЗапросКМ с флагом "Не дожидаться ответа" и затем в цикле пытается опросить кассу методом ПолучитьРезультатыЗапросаКМ, драйвер может возвращать пустой результат или ошибку переполнения буфера. — в таких случаях поможет инструмент отладки кода 1С в режиме Предприятие.
Чтобы обойти эту проблему, разработчики используют синхронный метод ожидания либо увеличивают цикл опроса. Давайте рассмотрим пример реализации правильного опроса ККТ на встроенном языке 1С:
// Пример реализации ожидания проверки КМ на ККТ АТОЛ
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("WaitForResult", Ложь); // Используем асинхронный запуск
РезультатЗапуска = ОбъектДрайвера.НачатьЗапросКМ(ПараметрыЗапроса);
Если РезультатЗапуска Тогда
ВремяСтарта = ТекущаяДата();
МаксимальноеВремяОжидания = 120; // Ожидаем ответ до 2-х минут согласно рекомендациям РФ
УспешноПолученОтвет = Ложь;
Пока (ТекущаяДата() - ВремяСтарта) < МаксимальноеВремяОжидания Цикл
ПараметрыРезультата = Новый Структура;
ОтветКассы = ОбъектДрайвера.ПолучитьРезультатыЗапросаКМ(ПараметрыРезультата);
// Анализируем состояние выполнения запроса кассой
Если ОтветКассы = 1 Тогда // 1 - проверка завершена, результат получен
УспешноПолученОтвет = Истина;
Прервать;
ИначеЕсли ОтветКассы = -1 Тогда // Ошибка обработки запроса на ККТ
Прервать;
КонецЕсли;
// Делаем паузу в 1 секунду между итерациями опроса буфера кассы
Приостановить(1);
КонецЦикла;
Если УспешноПолученОтвет Тогда
// Фиксируем успешную валидацию КМ
ОбъектДрайвера.ПодтвердитьПроверкуКМ(ПараметрыРезультата);
Иначе
// Обработка ситуации превышения тайм-аута
ВызватьИсключение "Не удалось получить ответ от сервера проверки марок за отведенное время.";
КонецЕсли;
КонецЕсли;
Рассмотрим альтернативное решение, предложенное практикующими интеграторами на форуме. Если касса АТОЛ упорно выдает ошибку на шаге выполнения физического запроса КМ, но при этом в самой 1С разрешительный режим успешно прошел через онлайн-проверку в Честном ЗНАКе, мы можем программно передать драйверу флаг успешной проверки. Это заставит ККТ сформировать тег 1260 со значением успешной проверки и напечатать в чеке [М+].
Для реализации этого метода в коде интеграции с кассой (модули работы с подключаемым оборудованием КРАТ) перед вызовом фискализации чека принудительно переопределяют статус локальной проверки:
// Подмена статуса локальной проверки КМ на основании успешного РР в 1С
Если КонтрольСтатусовВ1СВыполненУспешно Тогда
// Инициализируем структуру, сообщающую кассе о прохождении проверки на ККТ
ДанныеПозиции.РезультатЛокальнойПроверки = 15; // Код успешной проверки ИС
ДанныеПозиции.РезультатПроверкиОИСМ = 3; // Код подтверждения от сервера ГИС МТ
// Передаем измененную структуру в метод формирования строки чека
ОбъектДрайвера.ЗаписатьДанныеПроверкиКМ(ДанныеПозиции);
КонецЕсли;
При таком подходе фискальный накопитель запишет в структуру чека данные о том, что марка проверена и корректна, избавив вас от необходимости воевать с тайм-аутами связи ОФД-ККТ на медленных интернет-каналах.
Не забывайте о еще одной скрытой причине сбоя ЗапросКМ на АТОЛах — неправильно настроенном сканере штрихкодов. Если сканер при считывании DataMatrix «обрезает» или не передает управляющий спецсимвол GS (Group Separator, код 29/0x1D), касса не сможет распознать структуру маркированного кода. На уровне 1С проверка может проходить за счет внутренних алгоритмов восстановления, но касса выдаст ошибку реквизита 1023. Переведите ваш сканер в режим эмуляции COM-порта и убедитесь, что в префиксах настроена корректная передача символов семейства GS1.