При работе с торговым оборудованием в 1С часто возникает ситуация, когда кассир пытается пробить чек, а фискальный регистратор отключен, не включен в сеть или проброшенный через RDP COM-порт «завис». В результате платформа выдает критические ошибки вроде «Порт недоступен» или «Устройство не включено», восстановить работу после которых бывает трудно без перезагрузки сеанса или сервера.
Разберем, как программными средствами 1С предварительно проверить готовность фискального регистратора к работе перед пробитием чека, проанализируем причины сбоев при пробросе портов и рассмотрим решение частых сопутствующих ошибок при работе с ККМ АТОЛ.
Выясним основные причины, из-за которых 1С теряет связь с фискальным регистратором или не может занять COM-порт:
rdpdr.sys. Внешняя компонента не может повторно инициализировать интерфейс, возвращая код ошибки -3 (Порт недоступен).fptr_log.txt или fptr10_log, другие пользователи получают отказ в доступе.Для предотвращения аварийного завершения операций реализуем предварительную проверку оборудования. Она состоит из двух этапов:
DeviceEnabled = 1) и считывание статуса ошибки.Рассмотрим функцию проверки сетевой доступности узла по IP-адресу или имени компьютера:
Функция ДоступностьIP_Адреса(IP_Адрес = "", ТекстСообщения = "") Экспорт
Если ПустаяСтрока(IP_Адрес) Тогда
ТекстСообщения = "Не указан IP-адрес оборудования";
Возврат Ложь;
ИначеЕсли НРег(СокрЛП(IP_Адрес)) = НРег(СокрЛП(ИмяКомпьютера())) Тогда
Возврат Истина;
КонецЕсли;
objShell = Новый COMОбъект("WScript.Shell");
objScriptExec = objShell.Exec("ping.exe -n 1 " + IP_Адрес);
strPingResults = НРег(objScriptExec.StdOut.ReadAll());
Результат = Найти(strPingResults, "ttl=") > 0;
Если Не Результат Тогда
ТекстСообщения = "Компьютер/ККМ '" + ВРег(IP_Адрес) + "' недоступен по сети!";
КонецЕсли;
Возврат Результат;
КонецФункции
Посмотрим на основную функцию проверки готовности самого фискального регистратора через драйвер АТОЛ (работает с объектом AddIn.FprnM45 или AddIn.FPrnM8):
Функция ПроверкаСвязиФР(IP_Адрес = "", ТекстСообщения = "", ПортЗанятДопустимо = Истина) Экспорт
Если ПустаяСтрока(IP_Адрес) Тогда
ТекстСообщения = "Не указан IP-адрес ФР";
Возврат Ложь;
КонецЕсли;
// Проверяем доступность ПК по сети
Если СтрЧислоВхождений(IP_Адрес, ".") < 3 И Не ДоступностьIP_Адреса(IP_Адрес, ТекстСообщения) Тогда
Возврат Ложь;
КонецЕсли;
// Загрузка компоненты драйвера
Попытка
ФР = Новый("AddIn.FprnM45");
Исключение
Попытка
ЗагрузитьВнешнююКомпоненту("C:\Program Files (x86)\ATOL\Drivers8\Bin\FPrnM1C.dll");
ФР = Новый("AddIn.FprnM45");
Исключение
ТекстСообщения = "Не удалось загрузить внешнюю компоненту драйвера ККТ";
Возврат Ложь;
КонецПопытки;
КонецПопытки;
// Настраиваем адрес подключения к TCP-серверу драйвера
ФР.АдресХоста = IP_Адрес + ":6220";
// Пробуем занять порт
ФР.DeviceEnabled = 1;
Результат = ФР.ResultCode;
// Анализируем результат соединения
Если Результат <> 0 Тогда
// Если порт занят фоновым процессом 1С, но устройство подключено — считаем успешным
Если ПортЗанятДопустимо И Найти(ФР.ResultDescription, "Порт занят") > 0 Тогда
ФР.DeviceEnabled = 0;
Возврат Истина;
Иначе
ТекстСообщения = "Ошибка ККМ (" + Строка(Результат) + "): " + ФР.ResultDescription;
ФР.DeviceEnabled = 0;
Возврат Ложь;
КонецЕсли;
КонецЕсли;
// Освобождаем порт для работы основного кассового модуля
ФР.DeviceEnabled = 0;
Возврат Истина;
КонецФункции
Проанализируем системные методы защиты от ошибок подключения кассы в RDP-среде, когда программных проверок недостаточно:
EthernetOverUSB (EoU) или встроенный Ethernet/Wi-Fi модуль кассы. В этом случае 1С на сервере отправляет команды непосредственно на IP-адрес кассы без участия проброса портов Windows.Диспетчер устройств, зайдём в свойства всех объектов раздела «Контроллеры USB» (USB-корневой концентратор) и на вкладке «Управление электропитанием» снимем флаг «Разрешить отключение этого устройства для экономии энергии».UmRdpService (Перенаправитель портов режима пользователя служб удаленных рабочих столов) или завершить процесс dllhost.exe текущего сеанса.Ещё одна распространенная проблема при пробитии чеков — ошибка драйвера с описанием В ККМ нет денег для выплаты. Она возникает, если кассир пытается оформить возврат товара наличными в начале смены.
Разберем причины и способы устранения:
Параметры ККТ -> Основные (или Таблица 2 «Режимы работы», Ряд 1, Поле 115 в драйвере v.8) и отключим опцию «Производить инкассацию» (автоматическое обнуление).