При работе в терминальном режиме (RDP) часто возникает критическая проблема: разные пользователи, заходя под своими доменными учетными записями, получают одинаковый ИдентификаторКлиента. В системе 1С этот идентификатор напрямую связан со справочником Рабочие места. Если идентификаторы совпадают, программа считает, что два разных человека работают за одним компьютером. В результате один пользователь может «подхватить» настройки кассового аппарата или сканера штрихкодов другого пользователя, что приводит к хаосу при пробитии чеков и работе с оборудованием.
В этой статье мы подробно разберем, почему возникает эта ситуация, как работает механизм идентификации в 1С и какими способами можно гарантированно разделить сеансы пользователей.
Проанализируем, откуда 1С берет этот уникальный номер. При первом запуске платформы на конкретном компьютере система генерирует уникальный идентификатор (GUID) и сохраняет его в специальный файл настроек 1cv8u.pfl. В дальнейшем при каждом обращении к свойству СистемнаяИнформация.ИдентификаторКлиента 1С просто считывает данные из этого файла.
Проблема дублирования в среде RDP обычно возникает по одной из следующих причин:
1cv8u.pfl был создан и при копировании профиля попал ко всем новым пользователям.Рассмотрим самое простое и эффективное решение, которое помогает в большинстве случаев. Нам необходимо заставить 1С перегенерировать уникальный идентификатор для каждого проблемного пользователя. Для этого выполним следующие шаги:
C:\Users\ИмяПользователя\AppData\Local\1C\1cv8\.1cv8u.pfl.Важно: Иногда файл может дублироваться и в роуминговой части профиля. Проанализируем также путь %APPDATA%\1C\1cv8\ и при необходимости проведем очистку и там.
Если мы работаем в современных конфигурациях (например, УТ 11, Розница 2/3 или ERP), разберем возможности штатной настройки без изменения программного кода. В этих конфигурациях за идентификацию отвечает справочник Рабочие места.
Посмотрим на настройки справочника. Часто там можно выбрать режим идентификации. Если стандартный ИдентификаторКлиента подводит, попробуем изменить логику привязки оборудования:
Если типовые средства не помогают или нам требуется более надежная привязка, программно изменим способ определения рабочего места. В RDP-сессии стандартная функция ИмяКомпьютера() часто возвращает имя сервера, а не клиентской машины. Чтобы отличить пользователей, обратимся к переменным окружения Windows.
Рассмотрим пример кода, который позволяет получить сетевое имя реального физического компьютера, с которого подключился пользователь (переменная CLIENTNAME):
Попытка
ОбъектШелл = Новый COMОбъект("WScript.Shell");
ИмяКлиентскойМашины = ОбъектШелл.ExpandEnvironmentStrings("%CLIENTNAME%");
Если ИмяКлиентскойМашины = "%CLIENTNAME%" Тогда
// Это значит, что сессия запущена локально, а не через RDP
ИмяКлиентскойМашины = ИмяКомпьютера();
КонецЕсли;
Исключение
ИмяКлиентскойМашины = ИмяКомпьютера();
КонецПопытки;
Используя этот подход, мы можем привязать оборудование к конкретному физическому месту (терминалу), независимо от того, какой идентификатор прописан в файле .pfl. Это особенно актуально, если за одной кассой по очереди работают разные сотрудники под разными логинами.
В ситуациях, когда один и тот же пользователь запускает несколько сеансов RDP (что бывает редко, но возможно), нам поможет SESSIONNAME. Это позволит разделить даже сеансы одного и того же человека. Проанализируем, как получить это значение:
ОбъектШелл = Новый COMОбъект("WScript.Shell");
ИмяСессии = ОбъектШелл.ExpandEnvironmentStrings("%SESSIONNAME%");
// Результат будет вида "RDP-Tcp#1", "RDP-Tcp#2" и т.д.
Чтобы избежать повторения проблемы в будущем, проанализируем процесс создания новых пользователей на сервере:
1C в каталогах Local и Roaming.1cv8u.pfl при первом входе пользователя.ИдентификаторКлиента также важен для некоторых систем лицензирования (например, СЛК). Его дублирование может вызвать проблемы с получением программных лицензий 1С.Таким образом, комбинируя очистку кэша настроек (удаление .pfl) и правильную настройку параметров Библиотеки подключаемого оборудования, мы можем обеспечить стабильную работу 20 и более кассовых аппаратов на одном терминальном сервере без конфликтов между пользователями.