Подключение фискальных регистраторов (ККТ) в терминальном режиме (RDP) — одна из наиболее частых и сложных задач, с которой сталкиваются системные администраторы и специалисты по автоматизации 1С. Типичная ситуация: на локальном компьютере ККТ Атол отлично работает, утилита «Тест драйвера» на сервере терминалов успешно видит кассу, но при попытке выполнить тест подключения или пробить чек в самой 1С возникает ошибка «Нет связи», «Порт занят» или «Порт недоступен». Иногда дело доходит до аварийного завершения работы платформы 1С (APPCRASH) с ошибкой в библиотеке FprnMSM.dll.
В этой статье мы подробно разберем, почему возникают подобные проблемы, проанализируем ошибки совместного доступа к портам и рассмотрим несколько эффективных способов настройки стабильной работы ККТ Атол (на примере популярной модели Атол 30Ф) на сервере терминалов под управлением Windows Server.
Выясним причину самой первой и банальной проблемы, с которой часто сталкиваются пользователи обычных форм (например, в конфигурации «1С:Управление торговлей 10.3»). Симптомы просты: утилита тестирования драйвера Атол на сервере видит кассу и успешно связывается с ней через проброшенный COM-порт, но при проверке из 1С система упорно выдает сообщение «Нет связи».
Многие ошибочно полагают, что если модель ККТ указана в общей карточке торгового оборудования в 1С, этого достаточно. Однако для корректной инициализации внешней компоненты драйвера модель необходимо продублировать непосредственно в окне параметров подключения:
АТОЛ-30Ф).Как показывает практика, именно этот неочевидный нюанс решает проблему «Нет связи» в большинстве случаев использования стандартных обработок обслуживания ККТ (таких как ATOLkkt.epf).
Проанализируем архитектуру используемого программного обеспечения. В старых темах часто упоминаются версии драйверов линейки ДТО 8 (например, 8.14 или 8.16). Поддержка этой линейки производителем давно прекращена, и использовать её в современных реалиях категорически не рекомендуется.
Основная проблема ДТО 8 на сервере терминалов заключается в использовании устаревших 32-битных библиотек, которые нестабильно работают в многопользовательской среде x64 и часто вызывают утечки памяти. Переход на ДТО 10 решает целый спектр проблем:
При переходе на ДТО 10 на сервере терминалов устанавливается полноценный дистрибутив драйвера, а в 1С обновляется обработка подключения оборудования на современную, поддерживающую стандарт «1С:Совместимо» для ДТО 10. Для интеграции без изменения конфигурации можно использовать обработку обслуживания ДТО 10 для обычных форм 1С.
Рассмотрим ситуацию, когда к одному серверу RDP подключаются несколько удаленных пользователей со своими кассами ККТ. При использовании классического проброса COM-портов через свойства RDP-подключения или сторонних утилит эмуляции (например, VSPE — Virtual Serial Ports Emulator) неизбежно возникают конфликты. Система блокирует порты, выдает ошибки «Порт занят», а первый вошедший пользователь монополизирует доступ к оборудованию, блокируя работу остальных коллег.
Чтобы раз и навсегда решить проблему совместного доступа и нестабильного проброса портов, переведем обмен данными с физического уровня COM-портов на сетевой протокол TCP/IP. Для этого воспользуемся встроенными механизмами АТОЛ.
Вариант А: Использование веб-службы «АТОЛ Веб-сервер» (ATOL Fiscal Printer Web-Server)
Этот способ позволяет превратить локально подключенную кассу кассира в полноценное сетевое устройство, доступное по IP-адресу.
16732.16732 для IP-адреса сервера терминалов.16732.При такой схеме команды на печать отправляются в виде быстрых HTTP-запросов, что полностью исключает конфликты виртуальных портов внутри RDP-канала. Для реализации этой схемы в базах на обычных формах подойдёт обработка обслуживания ККТ через веб-сервер АТОЛ.
Вариант Б: Настройка RPC-сервера удаленного подключения (Remote Connection)
Если конфигурация 1С требует прямого взаимодействия с драйвером без использования веб-сервисов, мы можем использовать службу удаленного подключения АТОЛ (RPC):
ATOL Fiscal Printer Remote Server (работает по умолчанию на порту 19524).19524.Этот подход гарантирует, что каждый пользователь RDP работает изолированно со своим устройством, а задержки при отправке чека на печать сокращаются с десятков секунд до долей секунды.
Часто ошибка «Порт занят» возникает из-за некорректной настройки службы отправки чеков оператору фискальных данных — EoU (Ethernet over USB). При подключении кассы Атол по USB в диспетчере устройств Windows появляются два виртуальных COM-порта. Если служба EoU настроена неправильно, она может пытаться использовать тот же порт, через который 1С управляет кассой.
Разберем, как исправить эту ситуацию:
COM3 и COM4).COM3) выделим под управление кассой из 1С.COM4) назначим исключительно для службы передачи данных 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 передача данных в ОФД осуществляется непосредственно через основной канал управления кассой (тот же порт, по которому идет печать). Это позволяет освободить второй виртуальный порт и полностью избежать конфликтов блокировки портов.
Проанализируем природу сбоя, когда при закрытии 1С на сервере терминалов возникает ошибка завершения программы с указанием сбойного модуля FprnMSM.dll (код исключения c0000005 - нарушение прав доступа к памяти). Эта проблема характерна для устаревших драйверов ДТО 8.х.
Причина кроется в том, что при завершении сеанса 1С или закрытии RDP-сессии операционная система принудительно разрывает проброшенные каналы COM-портов, а загруженная в память 1С библиотека драйвера пытается обратиться к уже несуществующим адресам портов, вызывая краш процесса 1cv8.exe.
Для устранения этой проблемы выполним следующие действия:
FprnMSM.dll исчезнет сама собой.Рассмотрим пример кода инициализации и безопасного подключения торгового оборудования ККТ Атол через штатные механизмы 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;
КонецЕсли;
Сообщить("ККТ успешно подключена и готова к работе!");
Исключение
ЗаписатьЛогОшибок(ОписаниеОшибки());
Сообщить("Ошибка подключения ККТ: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецПроцедуры
Используя приведенные инструкции, мы сможем гарантировать бесперебойную и стабильную работу кассового оборудования АТОЛ в любой терминальной среде, независимо от количества одновременно работающих пользователей и удаленности филиалов.