При работе в терминальном режиме (через удаленный рабочий стол или RDP) многие технические специалисты сталкиваются с классической проблемой: 1С «путает» настройки торгового оборудования для разных пользователей. В случае со сканерами штрихкода это проявляется так: вы настраиваете сканер для одного сотрудника на COM3, а эти настройки автоматически применяются ко всем остальным пользователям, работающим на том же сервере. В итоге у других сотрудников возникают ошибки типа «Порт занят» или «Устройство не найдено», так как система пытается найти физически отсутствующий сканер по тому же адресу.
В этой статье мы подробно разберем, почему это происходит и как программно или административно разделить настройки оборудования, чтобы каждый сканер работал строго на своем рабочем месте.
Разберем ситуацию: в конфигурации «Управление торговлей 10.3» (и других решениях на обычных формах) привязка настроек торгового оборудования осуществляется к имени компьютера. Когда пользователь запускает 1С локально, функция ИмяКомпьютера() возвращает уникальное сетевое имя его ПК. Однако в режиме RDP для всех сессий функция ИмяКомпьютера() будет возвращать одно и то же значение — имя сервера.
С точки зрения 1С, все пользователи зашли с одного огромного компьютера, поэтому программа подтягивает для них одну общую запись из справочника «Торговое оборудование». Наша задача — заставить 1С различать пользователей не по имени сервера, а по имени того клиентского устройства, с которого выполнено подключение.
Проанализируем программный способ решения, который считается наиболее надежным. Нам необходимо внести изменения в логику определения имени компьютера в системе 1С. Для этого нам понадобится доступ к конфигуратору.
Основная логика работы с торговым оборудованием в УТ 10.3 сосредоточена в обработке ТОСервер. Нам нужно найти функцию, отвечающую за получение имени компьютера, и заставить её запрашивать переменную окружения %CLIENTNAME%, которую создает Windows при RDP-подключении.
Рассмотрим пошагово реализацию этого механизма:
ТОСервер (или аналогичный общий модуль, отвечающий за торговое оборудование).ПолучитьИмяКомпьютераТО().WScript.Shell, чтобы получить имя удаленного клиента.Разберем пример кода, который позволит системе корректно определять рабочее место:
Функция ПолучитьИмяКомпьютераТО() Экспорт
Если мИмяКомпьютера = Неопределено Тогда
ПеременныеОкружения = ПолучитьПеременныеОкружения();
мИмяКомпьютера = ВРег(ПеременныеОкружения.Получить("ИмяКомпьютера"));
КонецЕсли;
Возврат мИмяКомпьютера;
КонецФункции
Функция ПолучитьПеременныеОкружения() Экспорт
ПеременныеОкружения = Новый Соответствие;
Попытка
WshShell = Новый COMОбъект("WScript.Shell");
ИмяЛокальногоКомпьютера = WshShell.ExpandEnvironmentStrings("%ComputerName%");
ИмяУдаленногоКомпьютера = WshShell.ExpandEnvironmentStrings("%ClientName%");
// Если 1С запущена в RDP-сессии, переменная %ClientName% будет содержать имя ПК пользователя
// Если запущена локально, переменная вернет саму строку "%ClientName%" или будет пустой
Если ИмяУдаленногоКомпьютера = "%ClientName%" Или ПустаяСтрока(ИмяУдаленногоКомпьютера) Тогда
ИмяКомпьютераРезультат = ИмяЛокальногоКомпьютера;
Иначе
ИмяКомпьютераРезультат = ИмяУдаленногоКомпьютера;
КонецЕсли;
ПеременныеОкружения.Вставить("ИмяКомпьютера", ИмяКомпьютераРезультат);
Исключение
// В случае ошибки COM-объекта используем стандартный метод
ПеременныеОкружения.Вставить("ИмяКомпьютера", ИмяКомпьютера());
КонецПопытки;
Возврат ПеременныеОкружения;
КонецФункции
Важный нюанс: при использовании такого подхода для каждого пользователя в справочнике «Торговое оборудование» создастся отдельная запись, привязанная к его локальному имени ПК. Это позволит индивидуально указать номера COM-портов и настройки драйвера.
Если вы не хотите менять код конфигурации, можно попытаться решить проблему административными методами. Основная сложность здесь заключается в том, чтобы развести сканеры по разным номерам портов на самом сервере.
Выясним, как это реализовать:
COM10, у Пользователя №2 — COM11, у Пользователя №3 — COM12.mstsc.exe) на вкладке «Локальные ресурсы» нажмем «Подробнее» и убедимся, что установлена галочка «Порты».При таком подходе, даже если 1С видит все три сканера одновременно, каждый пользователь будет использовать только свою запись. Однако это решение менее стабильно, так как при переименовании портов или смене рабочего места настройки придется переделывать вручную.
Рассмотрим ситуацию, когда проброс COM-портов работает нестабильно (например, из-за плохой связи или ограничений прав доступа). В этом случае можно перевести сканер в режим «Keyboard Wedge» (разрыв клавиатуры).
Проанализируем шаги настройки:
Enter (код 13).Преимущество: RDP-сессия передает нажатия клавиш без необходимости сложной настройки проброса портов. Данные будут попадать в то поле, где установлен курсор.
Недостаток: Если у пользователя открыта не карточка подбора товара, а, например, текстовый редактор, данные уйдут туда. Также при медленном интернет-соединении символы штрихкода могут «рассыпаться» или приходить не полностью.
Как отмечают участники обсуждения, иногда самым простым выходом является отказ от работы в терминале для тех пользователей, кому критично использование торгового оборудования. Если база данных 1С находится на SQL-сервере, можно установить платформу 1С на локальный компьютер пользователя и подключиться к базе напрямую (через сервер 1С). В этом случае 1С будет видеть локальные ресурсы компьютера напрямую, и проблема с именами в RDP исчезнет сама собой.
Для стабильной работы большого количества сканеров в терминальной среде мы рекомендуем:
%CLIENTNAME%. Это единственный способ заставить 1С штатно разделять настройки для разных RDP-сессий.Применяя эти методы, вы сможете настроить бесперебойную работу торгового оборудования даже в сложных распределенных инфраструктурах.