При интеграции кассового оборудования для работы с разрешительным режимом и проверкой кодов маркировки через ТС ПИоТ разработчики нередко сталкиваются с ситуацией: после запуска системы проверка кодов маркировки работает штатно, однако спустя некоторое время (обычно около часа или при простое кассы) ответы от модуля ЕСМ прекращаются. Начинают возникать ошибки отсутствия связи, пропадает статус лицензии ККТ, а коды маркировки перестают проверяться в ГИС МТ. При этом открытие штатной утилиты «Тест драйвера ККТ» и выполнение любого запроса временно возвращают систему к жизни. Выясним причину такого поведения и подробно разберем, как обеспечить стабильную работу оборудования.
Для понимания корня проблемы проанализируем сетевую модель взаимодействия модулей. Программный комплекс ТС ПИоТ (модуль ЕСМ) не всегда обращается к фискальному регистратору напрямую через последовательный порт. Обмен с устройством разделен на уровни:
Модулю ЕСМ требуется регулярно обновлять криптографические ключи и токены сессии шифрования в фискальном накопителе, а также валидировать ИНН организации. Если касса простаивает, а 1С закрывает сессию работы с драйвером, внутренний агент драйвера засыпает либо освобождает порт 4042. В результате ЕСМ переходит в режим ожидания, теряет лицензию и блокирует проверку кодов.
В типовых конфигурациях и при использовании библиотек БПО вызовы к драйверу ККТ часто инкапсулируются: объект создается, выполняет команду (например, печать чека) и сразу уничтожается сборщиком мусора платформы. При уничтожении объекта драйвера закрывается и локальный сокет агента, необходимый модулю ЕСМ.
Посмотрим, как выглядит активация драйвера и открытие сокета агента в кодовой базе 1С:
// Получаем объект драйвера ККТ через БПО
ПараметрыПодключения = Новый Структура;
// Заполнение параметров подключения к кассе
ОбъектДрайвера = Ждать ПодключаемоеОборудованиеДрайверКлиент.ОбъектДрайвераАсинх(ПараметрыПодключения);
// При первом вызове метода ревизии интерфейса запускается локальный сокет агента (порт 4042)
РезультатВызова = Ждать ОбъектДрайвера.ПолучитьРевизиюИнтерфейсаАсинх();
При вызове метода ПолучитьРевизиюИнтерфейсаАсинх() драйвер активирует локальный порт 127.0.0.1:4042, при этом владельцем процесса выступает сама сессия 1С. Чтобы модуль ЕСМ не терял связь, необходимо:
ОбъектДрайвера после завершения операции печати или открытия смены.Если специфика архитектуры самописной конфигурации требует освобождения ресурсов или архитектура БПО автоматически переподключает кассу, реализуем механизм периодического опроса («heartbeat»). Это предотвратит разрыв сессии шифрования между модулем ЕСМ и фискальным накопителем.
Разберем по шагам создание обработчика ожидания:
&НаКлиенте
Процедура ПриОткрытииРМК()
// Подключаем опрос оборудования каждые 15 минут (900 секунд)
ПодключитьОбработчикОжидания("ФоновыйОпросККТ", 900, Ложь);
КонецПроцедуры
&НаКлиенте
Процедура ФоновыйОпросККТ() Экспорт
Попытка
// Выполняем легкий запрос состояния кассы, не блокирующий работу кассира
Если ОбъектДрайвера <> Неопределено Тогда
ПараметрыСостояния = "";
ОбъектДрайвера.ПолучитьСостояние(ПараметрыСостояния);
КонецЕсли;
Исключение
// Подавление ошибок фонового опроса, чтобы не прерывать ввод данных кассиром
ЗаписьЖурналаРегистрации("ККТ.KeepAlive", УровеньЖурналаРегистрации.Предупреждение,,, ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Такой периодический запрос удерживает vCOM-соединение активным, заставляет агент драйвера обновлять статус устройства и дает возможность модулю ЕСМ без задержек выполнять регламентную синхронизацию ключей.
Помимо доработок программного кода конфигурации 1С, важно исключить аппаратные и системные факторы сброса соединения:
Комплексное удержание ссылки на драйвер в памяти 1С в сочетании с фоновым опросом состояния оборудования полностью решает проблему засыпания модуля ЕСМ и обеспечивает бесперебойную проверку маркированных товаров.