Как программно проверить доступность и подключение фискального регистратора в 1С

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

При работе с торговым оборудованием в 1С часто возникает ситуация, когда кассир пытается пробить чек, а фискальный регистратор отключен, не включен в сеть или проброшенный через RDP COM-порт «завис». В результате платформа выдает критические ошибки вроде «Порт недоступен» или «Устройство не включено», восстановить работу после которых бывает трудно без перезагрузки сеанса или сервера.

Разберем, как программными средствами 1С предварительно проверить готовность фискального регистратора к работе перед пробитием чека, проанализируем причины сбоев при пробросе портов и рассмотрим решение частых сопутствующих ошибок при работе с ККМ АТОЛ.

Причины сбоев связи и ошибки «Порт недоступен»

Выясним основные причины, из-за которых 1С теряет связь с фискальным регистратором или не может занять COM-порт:

  1. Нестабильность проброса COM-портов в RDP: При физическом обрыве связи или некорректном переподключении терминальной сессии перенаправленный COM-порт остаётся заблокированным службой rdpdr.sys. Внешняя компонента не может повторно инициализировать интерфейс, возвращая код ошибки -3 (Порт недоступен).
  2. Энергосбережение USB-контроллеров: На клиентском компьютере Windows может отключать питание USB-порта при простое оборудования. При попытке отправки чека касса оказывается «не готовой».
  3. Блокировка лог-файлов драйвера: В терминальном режиме несколько сеансов могут обращаться к одной внешней компоненте АТОЛ. Если один процесс заблокировал файл fptr_log.txt или fptr10_log, другие пользователи получают отказ в доступе.

Алгоритм программной проверки доступности ККМ

Для предотвращения аварийного завершения операций реализуем предварительную проверку оборудования. Она состоит из двух этапов:

  1. Проверка сетевой доступности компьютера, к которому подключен фискальный регистратор (через утилиту ping или WMI).
  2. Инициализация внешней компоненты драйвера ККТ, попытка временного захвата порта (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;
    Возврат Истина;
КонецФункции

Способы исключения зависаний COM-портов в терминале

Проанализируем системные методы защиты от ошибок подключения кассы в RDP-среде, когда программных проверок недостаточно:

  1. Переход на прямые сетевые протоколы (TCP/IP, EthernetOverUSB, EoT): Вместо проброса COM-порта через RDP настраивают работу драйвера ККТ по IP-адресу через службу EthernetOverUSB (EoU) или встроенный Ethernet/Wi-Fi модуль кассы. В этом случае 1С на сервере отправляет команды непосредственно на IP-адрес кассы без участия проброса портов Windows.
  2. Отключение экономии энергии USB-портов: На физическом компьютере, где подключена касса, откроем Диспетчер устройств, зайдём в свойства всех объектов раздела «Контроллеры USB» (USB-корневой концентратор) и на вкладке «Управление электропитанием» снимем флаг «Разрешить отключение этого устройства для экономии энергии».
  3. Сброс зависшей службы перенаправления без перезагрузки сервера: Если порт все же заблокировался, администратору достаточно перезапустить службу UmRdpService (Перенаправитель портов режима пользователя служб удаленных рабочих столов) или завершить процесс dllhost.exe текущего сеанса.

Решение ошибки «В ККМ нет денег для выплаты» при возврате

Ещё одна распространенная проблема при пробитии чеков — ошибка драйвера с описанием В ККМ нет денег для выплаты. Она возникает, если кассир пытается оформить возврат товара наличными в начале смены.

Разберем причины и способы устранения:

← На главную