Почему ККТ АТОЛ в 1С:УТ 11.5 печатает в чеке [М] вместо [М+] при проверке кодов маркировки и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Приветствуем вас! При переходе на формат фискальных данных ФФД 1.2 и внедрении разрешительного режима (РР) розничные продавцы часто сталкиваются с неприятной ситуацией: на кассах одного производителя (например, Штрих-М) чеки бьются со статусом [М+], а на ККТ АТОЛ упорно печатается статус [М] — есть готовая настройка печати маркировки на кассе при распределении продаж. При этом сам товар в оборот возвращается и выбывает без ошибок, но покупатели или контролирующие органы могут задавать лишние вопросы. Давайте подробно разберем, почему так происходит, проанализируем взаимосвязь учетной системы с кассовым ядром и выясним, как настроить систему для получения заветного плюса на чеках.

Различие между разрешительным режимом (РР) и проверкой КМ средствами ККТ

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

  1. Проверка в разрешительном режиме (на стороне 1С). Этот процесс выполняется непосредственно в товароучетной системе перед формированием чека. 1С отправляет прямой запрос на CDN-площадки системы «Честный ЗНАК» по API, используя токен авторизации розничного продавца. Если код маркировки (КМ) не прошел проверку (например, истек срок годности или товар не введен в оборот), 1С просто блокирует добавление позиции в чек.
  2. Локальная и онлайн-проверка КМ (на стороне ККТ). Этот процесс регламентируется требованиями ФФД 1.2. Касса через установленный внутри фискальный накопитель ФН-М отправляет запросы ЗапросКМ и ПолучитьРезультатыЗапросаКМ через оператора фискальных данных (ОФД) напрямую в ИС Маркировки (сервер ОИСМ). Именно по результатам этой проверки на чековой ленте печатается символ статуса:
    • [М+] — проверка в фискальном накопителе и на сервере маркировки прошла успешно (подлинность кода подтверждена).
    • [М] — ККТ не успела получить ответ от сервера маркировки за отведенное время, но локальная проверка структуры кода на ФН-М завершилась успешно. По закону это не является нарушением, но сигнализирует о технических проблемах со связью или настройками.
    • [М-] — проверка завершилась отрицательно.

Шаг 1. Проверяем настройки контроля статусов в 1С

Выясним причину, почему 1С может принудительно давать команду кассе не дожидаться ответа от сервера ИСМ. Для этого перейдем в настройки программы:

Откроем раздел «НСИ и администрирование» — «Настройки интеграции» — «Интеграция с ИС МП» — «Настройки сканирования кодов маркировки». Проанализируем состояние двух флагов:

Шаг 2. Анализируем параметры связи ККТ АТОЛ с сервером ИСМ

Если в 1С все настройки выставлены верно, но АТОЛ все равно выдает только [М], проблема кроется в таблицах самой кассы или в параметрах связи с ОИСМ — здесь пригодится централизованное управление кассами и драйверами из 1С. Фискальный накопитель пытается отправить запрос, но сервер не отвечает, либо ККТ не знает, куда отправлять этот запрос. Настроим параметры связи через «Тест драйвера ККТ»:

  1. Запустите утилиту «Тест драйвера ККТ» (версии 10.x).
  2. Перейдите в раздел «Свойства» и подключитесь к вашей кассе.
  3. Откройте вкладку «Параметры ККТ» и найдите раздел «Работа с КМ» (в некоторых версиях прошивок он называется «ИС МП»).
  4. Внимательно изучите поля «Адрес ИСМ» и «Порт ИСМ». Если эти поля пустые, касса не может отправить сетевой запрос проверки. У каждого ОФД адрес и порт сервера ИСМ индивидуальны. Возьмите эти параметры с официального сайта вашего ОФД и пропишите их вручную.
  5. Убедитесь, что ККТ имеет прямой выход в интернет. Канал связи (EoU, EoT или Wi-Fi) должен быть стабильным, иначе запросы ЗапросКМ будут завершаться по тайм-ауту. — для этого подойдёт настройка ККТ АТОЛ для ФФД 1.2 и разрешительного режима.

Шаг 3. Обновление ключей проверки ФН-М (ОКП)

Локальная проверка марки на кассе невозможна без актуальных ключей проверки, хранящихся непосредственно в ФН-М. Если ККТ давно не связывалась с сервером обновления ключей (ОКП), легитимность проверок падает, и касса возвращает ошибку. Обновим ключи вручную:

В «Тесте драйвера ККТ» перейдите в раздел «ФН» — «Сервис». Найдите и нажмите кнопку «Обновить ключи ФН-М» (или «Запрос ключей проверки»). ККТ должна быть подключена к интернету. Убедитесь, что операция завершилась успешно.

Шаг 4. Решаем проблему зависания асинхронных запросов в драйвере 10.10.8.x

В версиях драйвера АТОЛ 10.10.8.x (особенно в релизах 10.10.8.23) наблюдается баг при работе с асинхронными запросами проверки КМ в 1С. Когда программа посылает команду НачатьЗапросКМ с флагом "Не дожидаться ответа" и затем в цикле пытается опросить кассу методом ПолучитьРезультатыЗапросаКМ, драйвер может возвращать пустой результат или ошибку переполнения буфера. — в таких случаях поможет инструмент отладки кода 1С в режиме Предприятие.

Чтобы обойти эту проблему, разработчики используют синхронный метод ожидания либо увеличивают цикл опроса. Давайте рассмотрим пример реализации правильного опроса ККТ на встроенном языке 1С:


// Пример реализации ожидания проверки КМ на ККТ АТОЛ
ПараметрыЗапроса = Новый Структура;
ПараметрыЗапроса.Вставить("WaitForResult", Ложь); // Используем асинхронный запуск

РезультатЗапуска = ОбъектДрайвера.НачатьЗапросКМ(ПараметрыЗапроса);

Если РезультатЗапуска Тогда
    ВремяСтарта = ТекущаяДата();
    МаксимальноеВремяОжидания = 120; // Ожидаем ответ до 2-х минут согласно рекомендациям РФ
    УспешноПолученОтвет = Ложь;
    
    Пока (ТекущаяДата() - ВремяСтарта) < МаксимальноеВремяОжидания Цикл
        
        ПараметрыРезультата = Новый Структура;
        ОтветКассы = ОбъектДрайвера.ПолучитьРезультатыЗапросаКМ(ПараметрыРезультата);
        
        // Анализируем состояние выполнения запроса кассой
        Если ОтветКассы = 1 Тогда // 1 - проверка завершена, результат получен
            УспешноПолученОтвет = Истина;
            Прервать;
        ИначеЕсли ОтветКассы = -1 Тогда // Ошибка обработки запроса на ККТ
            Прервать;
        КонецЕсли;
        
        // Делаем паузу в 1 секунду между итерациями опроса буфера кассы
        Приостановить(1); 
    КонецЦикла;
    
    Если УспешноПолученОтвет Тогда
        // Фиксируем успешную валидацию КМ
        ОбъектДрайвера.ПодтвердитьПроверкуКМ(ПараметрыРезультата);
    Иначе
        // Обработка ситуации превышения тайм-аута
        ВызватьИсключение "Не удалось получить ответ от сервера проверки марок за отведенное время.";
    КонецЕсли;
КонецЕсли;

Шаг 5. Программный обходной путь (костыль для вывода [М+])

Рассмотрим альтернативное решение, предложенное практикующими интеграторами на форуме. Если касса АТОЛ упорно выдает ошибку на шаге выполнения физического запроса КМ, но при этом в самой 1С разрешительный режим успешно прошел через онлайн-проверку в Честном ЗНАКе, мы можем программно передать драйверу флаг успешной проверки. Это заставит ККТ сформировать тег 1260 со значением успешной проверки и напечатать в чеке [М+].

Для реализации этого метода в коде интеграции с кассой (модули работы с подключаемым оборудованием КРАТ) перед вызовом фискализации чека принудительно переопределяют статус локальной проверки:


// Подмена статуса локальной проверки КМ на основании успешного РР в 1С
Если КонтрольСтатусовВ1СВыполненУспешно Тогда
    // Инициализируем структуру, сообщающую кассе о прохождении проверки на ККТ
    ДанныеПозиции.РезультатЛокальнойПроверки = 15; // Код успешной проверки ИС
    ДанныеПозиции.РезультатПроверкиОИСМ = 3;       // Код подтверждения от сервера ГИС МТ
    // Передаем измененную структуру в метод формирования строки чека
    ОбъектДрайвера.ЗаписатьДанныеПроверкиКМ(ДанныеПозиции);
КонецЕсли;

При таком подходе фискальный накопитель запишет в структуру чека данные о том, что марка проверена и корректна, избавив вас от необходимости воевать с тайм-аутами связи ОФД-ККТ на медленных интернет-каналах.

Рекомендации по настройке сканера штрихкодов

Не забывайте о еще одной скрытой причине сбоя ЗапросКМ на АТОЛах — неправильно настроенном сканере штрихкодов. Если сканер при считывании DataMatrix «обрезает» или не передает управляющий спецсимвол GS (Group Separator, код 29/0x1D), касса не сможет распознать структуру маркированного кода. На уровне 1С проверка может проходить за счет внутренних алгоритмов восстановления, но касса выдаст ошибку реквизита 1023. Переведите ваш сканер в режим эмуляции COM-порта и убедитесь, что в префиксах настроена корректная передача символов семейства GS1.

← На главную