Как исправить ошибку «порт занят или нет связи» при работе с кассой Атол по IP в 1С:Управление торговлей 10.3 через RDP?

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

При работе с торговым оборудованием в терминальном режиме (RDP) пользователи часто сталкиваются с ситуацией, когда фискальный регистратор, подключенный по протоколу TCP/IP, периодически становится недоступным. Характерный симптом: смена открывается штатно, первые чеки пробиваются без проблем, но после небольшой паузы в работе 1С выдает ошибку «Порт занят или нет связи». Перезапуск программы временно решает проблему, но затем она повторяется снова.

Проанализируем причины этого поведения и рассмотрим пошаговое решение проблемы для конфигурации «Управление торговлей», редакция 10.3 при использовании драйверов АТОЛ 10-й версии.

Выясним причину возникновения ошибки

Основная сложность заключается в том, как 1С идентифицирует рабочее место кассира в терминальной сессии. В типовой логике 1С:УТ 10.3 настройки торгового оборудования привязываются к имени компьютера. Для этого используется стандартная функция ИмяКомпьютера().

Когда несколько пользователей работают на одном сервере через RDP, функция ИмяКомпьютера() для каждого из них возвращает одно и то же сетевое имя сервера. В результате возникают следующие конфликты:

  1. Конкуренция сессий: Несколько пользователей одновременно пытаются инициализировать соединение с ККТ под одним и тем же «именем компьютера». Драйвер АТОЛ открывает TCP-сокет, который удерживается сессией одного пользователя, блокируя доступ остальным.
  2. Зависание порта: При простое сессии или микросбоях сети драйвер может не успеть корректно освободить порт на стороне кассы. Поскольку идентификатор рабочего места в 1С дублируется, система «путается» в открытых соединениях.
  3. Спящий режим сетевого интерфейса: Если в настройках ККТ или драйвера не активированы механизмы поддержания связи (Keep-Alive), соединение разрывается по тайм-ауту со стороны роутера или ОС сервера.

Способ 1. Модификация кода определения рабочего места (Рекомендуется)

Разберем самый эффективный способ решения проблемы — разделение настроек оборудования по именам локальных компьютеров пользователей (клиентских машин), а не сервера. Для этого нам необходимо внести изменения в общую обработку ТОСервер.

Рассмотрим алгоритм действий:

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

Проанализируем пример кода для реализации этой логики:


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

        // Если работа идет не в терминале или имя не получено, используем стандартный метод
        Если ПустаяСтрока(мИмяКомпьютера) Или мИмяКомпьютера = "CONSOLE" Тогда
            мИмяКомпьютера = ВРег(ИмяКомпьютера());
        КонецЕсли;
    КонецЕсли;

    Возврат мИмяКомпьютера;

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

Важно: После внесения этих изменений в конфигурацию необходимо зайти в 1С под каждым пользователем и заново создать записи в справочнике «Торговое оборудование». Теперь для каждого кассира в базе будет создана отдельная привязка (например, "ИМЯ_СЕРВЕРА_USER_PC1"), что исключит конфликты доступа к драйверу.

Способ 2. Настройка параметров драйвера АТОЛ 10

Если правка кода невозможна или не полностью устранила проблему «засыпания» порта, проанализируем настройки самого драйвера. В современных версиях драйверов АТОЛ (10.x) есть параметры, отвечающие за управление соединением.

  1. Откроем настройки торгового оборудования в 1С (Форма настройки параметров связи с ККТ).
  2. Найдем параметр «Временный разрыв связи» (в некоторых версиях обработок обслуживания это может называться «Не удерживать связь» или «Автоматическое освобождение порта»).
  3. Установим флаг в это состояние. Это заставит драйвер закрывать TCP-соединение сразу после завершения печати чека.

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

Способ 3. Использование Web-сервера АТОЛ

Для крупных инсталляций с большим количеством RDP-пользователей рассмотрим использование Web-сервера АТОЛ. Это промежуточное ПО (служба), которое устанавливается на сервере и берет на себя все взаимодействие с ККТ.

Разберем преимущества этой схемы:

Для реализации этого метода потребуется современная обработка обслуживания для УТ 10.3, поддерживающая работу через JSON API (обычно поставляется вместе с драйверами версии 10.4.x и выше).

Дополнительные рекомендации по стабильности сети

Проанализируем ситуацию с сетевой стороны. Поскольку касса АТОЛ 22Ф подключена через Ethernet к роутеру, стабильность канала критически важна.

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

← На главную