Как настроить раздельное подключение касс в 1С:Управление торговлей 10.3 при работе через терминальный сервер (RDP)?

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

При автоматизации розничных магазинов на базе конфигурации 1С:Управление торговлей 10.3 в терминальном режиме часто возникает проблема: к серверу подключаются несколько пользователей с разных физических рабочих станций, но программа не позволяет привязать отдельный фискальный регистратор к конкретному пользователю или рабочему месту. При настройке кассы под одной учетной записью у других кассиров флаги подключения сбиваются, а 1С выдает ошибки о недоступности COM-порта.

Разберем, почему возникает этот конфликт, и рассмотрим по шагам, как программно и аппаратно разделить торговое оборудование между терминальными сессиями.

Причина конфликта оборудования в терминальном режиме

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

В результате все пользователи в терминале получают одинаковое имя компьютера. Программа считает, что все кассиры работают за одним физическим ПК, и при открытии документов пытается одновременно подключить все зарегистрированные кассы и сканеры к одним и тем же портам сервера, вызывая ошибку блокировки порта.

Способ 1. Переопределение функции получения имени компьютера (Рекомендуемый способ)

Для корректного разделения рабочих мест в терминале необходимо определять сетевое имя клиентской рабочей станции, с которой инициирована RDP-сессия. В операционной системе Windows для этого используется переменная окружения CLIENTNAME.

Рассмотрим доработку общего модуля или модуля обработки обслуживания торгового оборудования. Найдем функцию ПолучитьИмяКомпьютераТО() и модифицируем её так, чтобы она считывала имя клиентской машины через WScript.Shell:


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

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

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

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

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

Разберем логику работы этого фрагмента:

  1. Создается COM-объект WScript.Shell, который считывает значение переменной ClientName из окружения текущего процесса терминальной сессии.
  2. Если сеанс запущен локально (на самом сервере или без RDP), переменная возвращает пустое значение или системную строку "CONSOLE". В этом случае срабатывает стандартный вызов ИмяКомпьютера().
  3. Для терминальных пользователей функция возвращает уникальное имя физического компьютера, благодаря чему в регистре сведений торгового оборудования создаются независимые записи для каждой кассы.

Способ 2. Фильтрация оборудования по имени клиента в процедуре подключения

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

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

// Проверка соответствия физического клиента в терминальной сессии
Если ЗначениеЗаполнено(СтрокаТО.ИмяКлиента) Тогда
    Попытка
        WshShell = Новый COMОбъект("WScript.Shell");
        ИмяКомпьютераКлиента = ВРег(WshShell.ExpandEnvironmentStrings("%CLIENTNAME%"));
    Исключение
        ИмяКомпьютераКлиента = "";
    КонецПопытки;

    Если Не СтрокаТО.ИмяКлиента = ИмяКомпьютераКлиента Тогда
        Продолжить; // Пропускаем оборудование, подключенное к другому клиенту
    КонецЕсли;
КонецЕсли;

Способ 3. Подключение фискальных регистраторов по сети (TCP/IP / Ethernet)

При частых разрывах RDP-соединений или нестабильной работе проброса портов через \\tsclient\COMx наиболее надежным решением является отказ от виртуальных COM-портов в пользу прямого сетевого подключения.

Рассмотрим шаги по сетевой интеграции касс:

  1. Подключим кассовые аппараты в локальную сеть магазина через Ethernet-разъем или Wi-Fi-модуль.
  2. В маршрутизаторе зафиксируем статические IP-адреса для каждого кассового аппарата.
  3. В настройках торгового оборудования в 1С вместо COM-порта укажем протокол TCP/IP, зададим соответствующий IP-адрес кассы и сетевой порт драйвера производителя.

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

Порядок настройки оборудования на рабочих местах

После внесения программных изменений настроим рабочие места по следующему алгоритму:

  1. Зайдем в терминальную сессию с физического компьютера первой кассы под учетной записью первого кассира.
  2. Откроем форму Подключение и настройка торгового оборудования в 1С. Убедимся, что определилось имя локального компьютера, а не сервера.
  3. Добавим фискальный регистратор для Кассы №1, выберем нужную обработку обслуживания, настроим параметры порта и выполним тест устройства.
  4. Повторим аналогичную процедуру последовательно на каждом физическом компьютере под соответствующими учетными записями кассиров.
← На главную