Почему в RDP-сессиях у разных пользователей совпадает ИдентификаторКлиента и как это исправить?

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

При работе в терминальном режиме (RDP) часто возникает критическая проблема: разные пользователи, заходя под своими доменными учетными записями, получают одинаковый ИдентификаторКлиента. В системе 1С этот идентификатор напрямую связан со справочником Рабочие места. Если идентификаторы совпадают, программа считает, что два разных человека работают за одним компьютером. В результате один пользователь может «подхватить» настройки кассового аппарата или сканера штрихкодов другого пользователя, что приводит к хаосу при пробитии чеков и работе с оборудованием.

В этой статье мы подробно разберем, почему возникает эта ситуация, как работает механизм идентификации в 1С и какими способами можно гарантированно разделить сеансы пользователей.

Выясняем причину: механизм работы файла 1cv8u.pfl

Проанализируем, откуда 1С берет этот уникальный номер. При первом запуске платформы на конкретном компьютере система генерирует уникальный идентификатор (GUID) и сохраняет его в специальный файл настроек 1cv8u.pfl. В дальнейшем при каждом обращении к свойству СистемнаяИнформация.ИдентификаторКлиента 1С просто считывает данные из этого файла.

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

  1. Клонирование профилей: Системный администратор подготовил «эталонный» профиль пользователя (Default User) на терминальном сервере, предварительно запустив там 1С. Файл 1cv8u.pfl был создан и при копировании профиля попал ко всем новым пользователям.
  2. Использование перемещаемых профилей: Если в сети используются Roaming Profiles или User Profile Disks (UPD), созданные на основе одного шаблона с уже имеющимся файлом настроек 1С.
  3. Копирование папки AppData: Ручной перенос настроек между пользователями.

Способ 1. Очистка файла настроек (Быстрое решение)

Рассмотрим самое простое и эффективное решение, которое помогает в большинстве случаев. Нам необходимо заставить 1С перегенерировать уникальный идентификатор для каждого проблемного пользователя. Для этого выполним следующие шаги:

  1. Завершим работу всех сеансов 1С у пользователя, у которого наблюдается проблема.
  2. Перейдем в каталог локальных настроек пользователя по пути: C:\Users\ИмяПользователя\AppData\Local\1C\1cv8\.
  3. Найдем файл с именем 1cv8u.pfl.
  4. Удалим этот файл. Не стоит беспокоиться — это обычный текстовый файл с настройками JSON, при следующем запуске 1С создаст его автоматически с новым, действительно уникальным GUID.

Важно: Иногда файл может дублироваться и в роуминговой части профиля. Проанализируем также путь %APPDATA%\1C\1cv8\ и при необходимости проведем очистку и там.

Способ 2. Настройка БПО (Библиотеки подключаемого оборудования)

Если мы работаем в современных конфигурациях (например, УТ 11, Розница 2/3 или ERP), разберем возможности штатной настройки без изменения программного кода. В этих конфигурациях за идентификацию отвечает справочник Рабочие места.

Посмотрим на настройки справочника. Часто там можно выбрать режим идентификации. Если стандартный ИдентификаторКлиента подводит, попробуем изменить логику привязки оборудования:

Способ 3. Программная доработка идентификации через RDP-переменные

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

Рассмотрим пример кода, который позволяет получить сетевое имя реального физического компьютера, с которого подключился пользователь (переменная CLIENTNAME):


Попытка
    ОбъектШелл = Новый COMОбъект("WScript.Shell");
    ИмяКлиентскойМашины = ОбъектШелл.ExpandEnvironmentStrings("%CLIENTNAME%");
    
    Если ИмяКлиентскойМашины = "%CLIENTNAME%" Тогда
        // Это значит, что сессия запущена локально, а не через RDP
        ИмяКлиентскойМашины = ИмяКомпьютера();
    КонецЕсли;
Исключение
    ИмяКлиентскойМашины = ИмяКомпьютера();
КонецПопытки;

Используя этот подход, мы можем привязать оборудование к конкретному физическому месту (терминалу), независимо от того, какой идентификатор прописан в файле .pfl. Это особенно актуально, если за одной кассой по очереди работают разные сотрудники под разными логинами.

Способ 4. Использование идентификатора сессии

В ситуациях, когда один и тот же пользователь запускает несколько сеансов RDP (что бывает редко, но возможно), нам поможет SESSIONNAME. Это позволит разделить даже сеансы одного и того же человека. Проанализируем, как получить это значение:


ОбъектШелл = Новый COMОбъект("WScript.Shell");
ИмяСессии = ОбъектШелл.ExpandEnvironmentStrings("%SESSIONNAME%");
// Результат будет вида "RDP-Tcp#1", "RDP-Tcp#2" и т.д.

Рекомендации по администрированию

Чтобы избежать повторения проблемы в будущем, проанализируем процесс создания новых пользователей на сервере:

  1. При настройке шаблонов профилей убедитесь, что в них отсутствует папка 1C в каталогах Local и Roaming.
  2. Если вы используете скрипты для развертывания рабочих мест, добавьте в них команду удаления файла 1cv8u.pfl при первом входе пользователя.
  3. Помните, что ИдентификаторКлиента также важен для некоторых систем лицензирования (например, СЛК). Его дублирование может вызвать проблемы с получением программных лицензий 1С.

Таким образом, комбинируя очистку кэша настроек (удаление .pfl) и правильную настройку параметров Библиотеки подключаемого оборудования, мы можем обеспечить стабильную работу 20 и более кассовых аппаратов на одном терминальном сервере без конфликтов между пользователями.

← На главную