При работе с торговым оборудованием в терминальном режиме (RDP) пользователи часто сталкиваются с ситуацией, когда фискальный регистратор, подключенный по протоколу TCP/IP, периодически становится недоступным. Характерный симптом: смена открывается штатно, первые чеки пробиваются без проблем, но после небольшой паузы в работе 1С выдает ошибку «Порт занят или нет связи». Перезапуск программы временно решает проблему, но затем она повторяется снова.
Проанализируем причины этого поведения и рассмотрим пошаговое решение проблемы для конфигурации «Управление торговлей», редакция 10.3 при использовании драйверов АТОЛ 10-й версии.
Основная сложность заключается в том, как 1С идентифицирует рабочее место кассира в терминальной сессии. В типовой логике 1С:УТ 10.3 настройки торгового оборудования привязываются к имени компьютера. Для этого используется стандартная функция ИмяКомпьютера().
Когда несколько пользователей работают на одном сервере через RDP, функция ИмяКомпьютера() для каждого из них возвращает одно и то же сетевое имя сервера. В результате возникают следующие конфликты:
Разберем самый эффективный способ решения проблемы — разделение настроек оборудования по именам локальных компьютеров пользователей (клиентских машин), а не сервера. Для этого нам необходимо внести изменения в общую обработку ТОСервер.
Рассмотрим алгоритм действий:
ТОСервер.ПолучитьИмяКомпьютераТО().ClientName.Проанализируем пример кода для реализации этой логики:
Функция ПолучитьИмяКомпьютераТО() Экспорт
Если мИмяКомпьютера = Неопределено Тогда
// Попытаемся получить имя клиентского ПК в RDP-сессии
Попытка
WSS = Новый COMОбъект("WScript.Shell");
WSSE = WSS.Environment("Process");
мИмяКомпьютера = ВРег(WSSE.Item("ClientName"));
Исключение
мИмяКомпьютера = "";
КонецПопытки;
// Если работа идет не в терминале или имя не получено, используем стандартный метод
Если ПустаяСтрока(мИмяКомпьютера) Или мИмяКомпьютера = "CONSOLE" Тогда
мИмяКомпьютера = ВРег(ИмяКомпьютера());
КонецЕсли;
КонецЕсли;
Возврат мИмяКомпьютера;
КонецФункции
Важно: После внесения этих изменений в конфигурацию необходимо зайти в 1С под каждым пользователем и заново создать записи в справочнике «Торговое оборудование». Теперь для каждого кассира в базе будет создана отдельная привязка (например, "ИМЯ_СЕРВЕРА_USER_PC1"), что исключит конфликты доступа к драйверу.
Если правка кода невозможна или не полностью устранила проблему «засыпания» порта, проанализируем настройки самого драйвера. В современных версиях драйверов АТОЛ (10.x) есть параметры, отвечающие за управление соединением.
Посмотрим, как это работает: при пробитии чека 1С дает команду драйверу «Подключиться», печатает фискальный документ и тут же дает команду «Отключиться». Порт на кассе освобождается, и при следующей покупке (даже через час) драйвер инициирует новое чистое соединение, избегая ошибки занятого порта.
Для крупных инсталляций с большим количеством RDP-пользователей рассмотрим использование Web-сервера АТОЛ. Это промежуточное ПО (служба), которое устанавливается на сервере и берет на себя все взаимодействие с ККТ.
Разберем преимущества этой схемы:
Для реализации этого метода потребуется современная обработка обслуживания для УТ 10.3, поддерживающая работу через JSON API (обычно поставляется вместе с драйверами версии 10.4.x и выше).
Проанализируем ситуацию с сетевой стороны. Поскольку касса АТОЛ 22Ф подключена через Ethernet к роутеру, стабильность канала критически важна.
KeepAliveTime и KeepAliveInterval. Это заставит операционную систему чаще проверять состояние сетевых сокетов и не закрывать их принудительно при кратковременных простоях.Используя предложенные методы (особенно модификацию функции ПолучитьИмяКомпьютераТО), вы обеспечите стабильную и бесперебойную работу кассового оборудования в терминальной среде 1С.