Как программно получить список активных пользователей в 1С

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

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

Использование метода ПолучитьСеансыИнформационнойБазы

Основным инструментом для решения нашей задачи является метод глобального контекста ПолучитьСеансыИнформационнойБазы(). Этот метод возвращает массив объектов типа СеансИнформационнойБазы. Каждый такой объект представляет собой отдельное соединение пользователя с базой данных.

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


СписокСеансов = ПолучитьСеансыИнформационнойБазы();
КоличествоПользователей = СписокСеансов.Количество();
Сообщить("В данный момент в базе работает " + КоличествоПользователей + " пользователей.");

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

Разбор свойств объекта СеансИнформационнойБазы

Давайте подробнее изучим структуру данных, которую нам предоставляет платформа. Объект СеансИнформационнойБазы содержит множество полезных свойств, позволяющих идентифицировать подключение. Выясним назначение ключевых свойств:

  1. Пользователь — содержит объект типа ПользовательИнформационнойБазы. Из него мы можем получить имя пользователя (Имя) и его уникальный идентификатор.
  2. ИмяКомпьютера — сетевое имя рабочей станции, с которой было выполнено подключение. Это критически важно для поиска "зависших" сеансов на конкретных терминальных серверах.
  3. НачалоСеанса — дата и время входа пользователя в систему. Помогает выявить пользователей, которые не закрывают программу сутками.
  4. Приложение — строковое представление типа клиента. Это позволяет нам понять, зашел ли пользователь через Тонкий клиент, Толстый клиент, Веб-клиент или использует Конфигуратор.
  5. НомерСеанса — уникальный номер, присвоенный сеансу сервером 1С.

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


Сеансы = ПолучитьСеансыИнформационнойБазы();

Для Каждого ТекущийСеанс Из Сеансы Цикл
    ИмяПользователя = ТекущийСеанс.Пользователь.Имя;
    Если ПустаяСтрока(ИмяПользователя) Тогда
        ИмяПользователя = "Служебный сеанс";
    КонецЕсли;
    
    Информация = "Пользователь: " + ИмяПользователя + 
                 ", Компьютер: " + ТекущийСеанс.ИмяКомпьютера + 
                 ", Зашел в: " + ТекущийСеанс.НачалоСеанса + 
                 ", Тип клиента: " + ТекущийСеанс.ИмяПриложения;
    
    Сообщить(Информация);
КонецЦикла;

Особенности прав доступа и контекста выполнения

Рассмотрим важный аспект безопасности. Метод ПолучитьСеансыИнформационнойБазы() доступен далеко не каждому пользователю. Для его успешного выполнения у текущего пользователя должны быть установлены административные права. Если вызвать этот метод под обычным пользователем без соответствующих разрешений, система может вернуть пустой список или вызвать исключение в зависимости от версии платформы и режима работы.

Также стоит обратить внимание на контекст выполнения кода. В клиент-серверном варианте работы этот метод рекомендуется выполнять на сервере. Это обеспечит более высокую скорость работы и доступ ко всем свойствам сеансов без лишних сетевых пересылок данных между клиентом и сервером приложений.

Классификация типов приложений

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

Знание типа приложения позволяет нам отфильтровать, например, системные процессы от реальных действий пользователей. Посмотрим на пример кода, который подсчитывает только тех, кто работает в пользовательском режиме (исключая конфигуратор и фоновые задания):


ВсегоПользователей = 0;
Сеансы = ПолучитьСеансыИнформационнойБазы();

Для Каждого Сеанс Из Сеансы Цикл
    Если Сеанс.ИмяПриложения = "1CV8" Или Сеанс.ИмяПриложения = "1CV8C" Или Сеанс.ИмяПриложения = "WebClient" Тогда
        ВсегоПользователей = ВсегоПользователей + 1;
    КонецЕсли;
КонецЦикла;

Сообщить("Активных интерактивных сеансов: " + ВсегоПользователей);

Альтернативные способы управления сеансами

Помимо стандартного метода ПолучитьСеансыИнформационнойБазы(), существуют и другие способы мониторинга. В крупных корпоративных системах часто используют администрирование через COM-соединение или RAS (Remote Administration Service). Эти инструменты позволяют не только просматривать список пользователей, но и принудительно разрывать соединения, что невозможно сделать простыми средствами встроенного языка без дополнительных манипуляций.

Однако для большинства задач автоматизации внутри конфигурации метода ПолучитьСеансыИнформационнойБазы() вполне достаточно. Он прост в использовании, не требует подключения внешних библиотек и предоставляет всю необходимую информацию для базового анализа активности.

Резюмируя вышесказанное: для получения списка пользователей мы используем массив сеансов, перебираем его в цикле и анализируем свойства каждого объекта СеансИнформационнойБазы. Это позволяет нам строить гибкие отчеты по загрузке системы и управлять доступом к базе данных в автоматическом режиме.

← На главную