Как избавиться от зависаний и потери связи с кассами АТОЛ на терминальном сервере в 1С:УТ 10.3?

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

При работе с несколькими контрольно-кассовыми машинами (ККТ) АТОЛ, подключенными по Ethernet, в терминальном режиме (RDP) пользователи 1С:УТ 10.3 часто сталкиваются с неприятными проблемами. Разберем типичные симптомы: долгое открытие нового чека или реализации, зависание интерфейса программы, появление ошибки «Ошибка при подключении устройства. Необходимо убедиться, что устройство правильно настроено и соответствующий порт не занят другим приложением». Также в момент пробития чека может возникать сбой связи с сообщением «Не удалось получить объект драйвера».

Проанализируем ситуацию и выясним причину. По умолчанию в старых конфигурациях 1С, таких как УТ 10.3, торговое оборудование привязывается к имени компьютера (сервера), а монопольный захват порта происходит сразу при открытии формы документа. Если один пользователь открыл чек, порт кассы блокируется, и другие пользователи RDP встают в очередь или получают ошибки. Рассмотрим подробнее, как системно решить эти проблемы и настроить стабильную работу.

Привязка оборудования к имени сессии RDP-клиента

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

Необходимо заменить типовую функцию ПолучитьИмяКомпьютераТО() на следующий вариант:


Функция ПолучитьИмяКомпьютераТО() Экспорт

    // Если мИмяКомпьютера = Неопределено Тогда
    //     мИмяКомпьютера = ВРег(ИмяКомпьютера());
    // КонецЕсли;
    
    Если мИмяКомпьютера = Неопределено Тогда
        WSS = Новый COMОбъект("WScript.Shell");
        WSSE = WSS.Environment("Process");
        мИмяКомпьютера = ВРег(WSSE.Item("ClientName"));
        
        Если ПустаяСтрока(мИмяКомпьютера) Тогда
            мИмяКомпьютера = ВРег(ИмяКомпьютера());
        КонецЕсли;
    КонецЕсли;
    
    // Если зайти в терминальной сессии консольно, то получим "CONSOLE"
    // В этом случае применяем типовую функцию
    Если мИмяКомпьютера = "CONSOLE" Тогда  
        мИмяКомпьютера = ВРег(ИмяКомпьютера());
    КонецЕсли;
    
    Возврат мИмяКомпьютера;

КонецФункции

Важный нюанс: учитывайте, что если пользователь переподключится к открытой RDP-сессии с другого компьютера, функция может вернуть имя компа от первого подключения. Альтернативным вариантом идентификации может служить связка ИмяКомпьютера + ИмяПользователя.

Изменение логики удержания соединения (Подключение при печати)

Разберем по шагам логику захвата оборудования. Ошибки занятого порта возникают из-за того, что 1С держит соединение с ККТ всё время, пока открыт документ. На терминальном сервере это недопустимо. Переработаем механизм: касса не должна опрашиваться при открытии формы.

  1. Отключите инициализацию и подключение торгового оборудования в процедурах ПриОткрытии форм документов (Чек ККМ, ПКО, Оплата от покупателя платежной картой).
  2. Перенесите вызов подключения непосредственно в обработчик нажатия кнопки Пробить чек.
  3. Сразу после получения ответа от кассы (неважно, успешного пробития или возврата ошибки) принудительно вызывайте метод отключения драйвера, чтобы освободить порт для других RDP-пользователей.

Использование Web-сервера АТОЛ (диспетчер очередей)

Если вы используете современные драйверы (ДТО 10), рассмотрим более продвинутый архитектурный подход. Компания АТОЛ добавила функционал собственного веб-сервера. Вместо прямого COM-соединения, которое работает монопольно, терминальная сессия 1С может отправлять HTTP-запросы в формате JSON.

Веб-сервер АТОЛ выступает в роли диспетчера очереди: он прозрачно собирает чеки от всех пользователей на терминальном сервере и поочередно отправляет их на физическую ККТ. Аналогичным образом работают сторонние решения, такие как KKMServer. Этот подход гарантированно решает конфликты доступа к портам.

Отключение конфликтующих служб (Служба EoU)

Проанализируем фоновые процессы на сервере. Часто внезапная потеря связи («Не удалось получить объект драйвера») вызвана тем, что параллельные службы пытаются опросить кассу. Вместе с драйверами АТОЛ устанавливается служба EoU (Ethernet over USB). Даже при работе по чистому Ethernet эта служба может периодически перехватывать связь.

Зайдите в управление службами Windows на терминальном сервере. Найдите службу EoU (или ComProxy, если она установлена), остановите ее и переведите тип запуска в состояние «Отключена». Это избавит систему от внутренних конфликтов за доступ к оборудованию.

Удаление следов старых драйверов и настройка таймаутов

Поскольку 1С:УТ 10.3 — старая конфигурация, на сервере часто остаются компоненты от прошлых версий драйверов (ДТО 8 или ДТО 9). Система может путаться в версиях dll-библиотек.

  1. Полностью деинсталлируйте все старые версии драйверов АТОЛ через Панель управления.
  2. Удалите оставшиеся dll в каталогах платформы и очистите кэш 1С.
  3. Установите актуальную версию ДТО 10.
  4. В настройках параметров связи теста драйвера АТОЛ вручную увеличьте сетевой Таймаут (например, до 3000-5000 мс). Это защитит от потери объекта драйвера при кратковременных микрозадержках в локальной Ethernet-сети.

Применив эти решения в комплексе — изменив логику определения рабочего места, настроив подключение только в момент печати и наведя порядок в драйверах и службах — вы получите стабильно работающую связку касс АТОЛ и 1С на терминальном сервере без зависаний и потери чеков.

← На главную