Как настроить ККТ Атол на сервере терминалов RDP и решить проблемы «Нет связи» и «Порт занят»?

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

Подключение фискальных регистраторов (ККТ) в терминальном режиме (RDP) — одна из наиболее частых и сложных задач, с которой сталкиваются системные администраторы и специалисты по автоматизации 1С. Типичная ситуация: на локальном компьютере ККТ Атол отлично работает, утилита «Тест драйвера» на сервере терминалов успешно видит кассу, но при попытке выполнить тест подключения или пробить чек в самой 1С возникает ошибка «Нет связи», «Порт занят» или «Порт недоступен». Иногда дело доходит до аварийного завершения работы платформы 1С (APPCRASH) с ошибкой в библиотеке FprnMSM.dll.

В этой статье мы подробно разберем, почему возникают подобные проблемы, проанализируем ошибки совместного доступа к портам и рассмотрим несколько эффективных способов настройки стабильной работы ККТ Атол (на примере популярной модели Атол 30Ф) на сервере терминалов под управлением Windows Server.

Решение 1: Обязательный выбор модели ККТ в параметрах торгового оборудования в 1С

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

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

  1. Откроем в 1С форму настройки параметров торгового оборудования (меню «Сервис» — «Торговое оборудование» — «Подключение и настройка торгового оборудования»).
  2. Перейдем в параметры конкретной кассы ККТ.
  3. Найдем выпадающий список «Модель». По умолчанию там может быть пусто или установлено обобщенное значение. Нам необходимо принудительно выбрать точную модель подключенного устройства (например, АТОЛ-30Ф).
  4. Установим параметры порта, скорости обмена и таймаута в соответствии с настройками, которые успешно отработали в локальном тесте драйвера.
  5. Нажмем кнопку «Записать» и проведем тест устройства повторно.

Как показывает практика, именно этот неочевидный нюанс решает проблему «Нет связи» в большинстве случаев использования стандартных обработок обслуживания ККТ (таких как ATOLkkt.epf).

Решение 2: Переход на современный Драйвер торгового оборудования (ДТО 10)

Проанализируем архитектуру используемого программного обеспечения. В старых темах часто упоминаются версии драйверов линейки ДТО 8 (например, 8.14 или 8.16). Поддержка этой линейки производителем давно прекращена, и использовать её в современных реалиях категорически не рекомендуется.

Основная проблема ДТО 8 на сервере терминалов заключается в использовании устаревших 32-битных библиотек, которые нестабильно работают в многопользовательской среде x64 и часто вызывают утечки памяти. Переход на ДТО 10 решает целый спектр проблем:

При переходе на ДТО 10 на сервере терминалов устанавливается полноценный дистрибутив драйвера, а в 1С обновляется обработка подключения оборудования на современную, поддерживающую стандарт «1С:Совместимо» для ДТО 10. Для интеграции без изменения конфигурации можно использовать обработку обслуживания ДТО 10 для обычных форм 1С.

Решение 3: Отказ от проброса портов и VSPE в пользу сетевых решений (TCP/IP)

Рассмотрим ситуацию, когда к одному серверу RDP подключаются несколько удаленных пользователей со своими кассами ККТ. При использовании классического проброса COM-портов через свойства RDP-подключения или сторонних утилит эмуляции (например, VSPE — Virtual Serial Ports Emulator) неизбежно возникают конфликты. Система блокирует порты, выдает ошибки «Порт занят», а первый вошедший пользователь монополизирует доступ к оборудованию, блокируя работу остальных коллег.

Чтобы раз и навсегда решить проблему совместного доступа и нестабильного проброса портов, переведем обмен данными с физического уровня COM-портов на сетевой протокол TCP/IP. Для этого воспользуемся встроенными механизмами АТОЛ.

Вариант А: Использование веб-службы «АТОЛ Веб-сервер» (ATOL Fiscal Printer Web-Server)

Этот способ позволяет превратить локально подключенную кассу кассира в полноценное сетевое устройство, доступное по IP-адресу.

  1. На локальном компьютере, к которому физически по USB подключен ККТ Атол, устанавливаем ДТО 10.
  2. Запускаем службу «Веб-сервер АТОЛ». По умолчанию служба начинает слушать входящие подключения на порту 16732.
  3. В брандмауэре Windows на локальном компьютере открываем входящий порт 16732 для IP-адреса сервера терминалов.
  4. В 1С, запущенной в терминальной сессии на сервере, при настройке торгового оборудования выбираем тип подключения «ККМ Web-служба».
  5. В качестве адреса подключения указываем статический локальный или внешний IP-адрес компьютера кассира и порт 16732.

При такой схеме команды на печать отправляются в виде быстрых HTTP-запросов, что полностью исключает конфликты виртуальных портов внутри RDP-канала. Для реализации этой схемы в базах на обычных формах подойдёт обработка обслуживания ККТ через веб-сервер АТОЛ.

Вариант Б: Настройка RPC-сервера удаленного подключения (Remote Connection)

Если конфигурация 1С требует прямого взаимодействия с драйвером без использования веб-сервисов, мы можем использовать службу удаленного подключения АТОЛ (RPC):

  1. На локальном ПК кассира активируем службу ATOL Fiscal Printer Remote Server (работает по умолчанию на порту 19524).
  2. В утилите «Тест драйвера» на сервере терминалов выбираем способ связи «TCP/IP», указываем IP-адрес локального компьютера кассира и порт 19524.
  3. В настройках оборудования 1С на сервере указываем аналогичные параметры подключения по TCP/IP.

Этот подход гарантирует, что каждый пользователь RDP работает изолированно со своим устройством, а задержки при отправке чека на печать сокращаются с десятков секунд до долей секунды.

Решение 4: Разделение портов службы ОФД и управления кассой (EoU и EoT)

Часто ошибка «Порт занят» возникает из-за некорректной настройки службы отправки чеков оператору фискальных данных — EoU (Ethernet over USB). При подключении кассы Атол по USB в диспетчере устройств Windows появляются два виртуальных COM-порта. Если служба EoU настроена неправильно, она может пытаться использовать тот же порт, через который 1С управляет кассой.

Разберем, как исправить эту ситуацию:

  1. Откроем «Диспетчер устройств» на локальном ПК и зафиксируем номера портов ККТ (например, COM3 и COM4).
  2. Один из портов (обычно меньший по номеру, например, COM3) выделим под управление кассой из 1С.
  3. Второй порт (например, COM4) назначим исключительно для службы передачи данных EoU.
  4. Перейдем в каталог установки драйвера, найдем конфигурационный файл службы EoU (обычно это settings.xml) и проверим, чтобы в нем был жестко прописан именно второй порт (в нашем примере — COM4):

<settings>
    <connection>
        <port>4</port>
        <baudrate>115200</baudrate>
    </connection>
</settings>

Альтернативный и современный вариант: переход на EoT (Ethernet over Transport)

В современных версиях ДТО 10 рекомендуется полностью отказаться от службы EoU в пользу технологии EoT (Ethernet over Transport). При активации EoT передача данных в ОФД осуществляется непосредственно через основной канал управления кассой (тот же порт, по которому идет печать). Это позволяет освободить второй виртуальный порт и полностью избежать конфликтов блокировки портов.

Решение 5: Устранение критической ошибки APPCRASH библиотеки FprnMSM.dll

Проанализируем природу сбоя, когда при закрытии 1С на сервере терминалов возникает ошибка завершения программы с указанием сбойного модуля FprnMSM.dll (код исключения c0000005 - нарушение прав доступа к памяти). Эта проблема характерна для устаревших драйверов ДТО 8.х.

Причина кроется в том, что при завершении сеанса 1С или закрытии RDP-сессии операционная система принудительно разрывает проброшенные каналы COM-портов, а загруженная в память 1С библиотека драйвера пытается обратиться к уже несуществующим адресам портов, вызывая краш процесса 1cv8.exe.

Для устранения этой проблемы выполним следующие действия:

  1. Обновим драйвер торгового оборудования до ДТО 10. В десятой версии архитектура библиотек полностью изменена, и проблема с FprnMSM.dll исчезнет сама собой.
  2. Если обновление до ДТО 10 невозможно по техническим причинам (например, из-за жестких ограничений старой доработанной конфигурации 1С), попробуем запускать клиентское приложение 1С на сервере терминалов без прав администратора. Иногда избыточные привилегии процесса приводят к конфликтам блокировок памяти при завершении работы драйвера.
  3. Используем внешние программные прослойки, такие как kkmserver. В этом случае библиотека Атол загружается не в адресное пространство процесса 1С, а работает в рамках отдельной службы. 1С общается с кассой по протоколу HTTP, что делает работу платформы абсолютно стабильной и предотвращает любые падения системы при закрытии сеансов.

Рассмотрим пример кода инициализации и безопасного подключения торгового оборудования ККТ Атол через штатные механизмы 1С на обычных формах, чтобы исключить зависания при запуске сессий:


// Пример безопасного подключения обработки обслуживания ККТ
Процедура ПодключитьКассуНаСервере()
    Попытка
        ПутьКДрайверу = "C:\Program Files (x86)\ATOL\Drivers8\Utils\bin\FprnMSM.dll";
        ЗагрузитьВнешнююКомпоненту(ПутьКДрайверу);
        ККТ = Новый ("AddIn.FPrnM45");
        
        // Установка параметров связи
        ККТ.Model = 67; // Код модели для АТОЛ 30Ф
        ККТ.PortNumber = 1000; // Проброшенный порт (например, COM1000)
        ККТ.BaudRate = 115200;
        
        ККТ.DeviceEnabled = Истина;
        Если ККТ.ResultCode <> 0 Тогда
            ВызватьИсключение ККТ.ResultDescription;
        КонецЕсли;
        
        Сообщить("ККТ успешно подключена и готова к работе!");
    Исключение
        ЗаписатьЛогОшибок(ОписаниеОшибки());
        Сообщить("Ошибка подключения ККТ: " + ОписаниеОшибки(), СтатусСообщения.Важное);
    КонецПопытки;
КонецПроцедуры

Используя приведенные инструкции, мы сможем гарантировать бесперебойную и стабильную работу кассового оборудования АТОЛ в любой терминальной среде, независимо от количества одновременно работающих пользователей и удаленности филиалов.

← На главную