В процессе администрирования и разработки на платформе 1С:Предприятие 8 часто возникает необходимость программно определить, кто из пользователей в данный момент работает в системе. Это может потребоваться для реализации механизмов автоматического завершения сеансов, мониторинга активности, ведения статистики использования лицензий или подготовки базы к техническому обслуживанию. В рамках данной статьи мы подробно разберем, как получить доступ к списку активных сеансов, какие данные можно извлечь из каждого сеанса и какие нюансы прав доступа следует учитывать.
Основным инструментом для решения нашей задачи является метод глобального контекста ПолучитьСеансыИнформационнойБазы(). Этот метод возвращает массив объектов типа СеансИнформационнойБазы. Каждый такой объект представляет собой отдельное соединение пользователя с базой данных.
Рассмотрим простейший пример получения общего количества активных пользователей. Проанализируем следующий фрагмент кода:
СписокСеансов = ПолучитьСеансыИнформационнойБазы();
КоличествоПользователей = СписокСеансов.Количество();
Сообщить("В данный момент в базе работает " + КоличествоПользователей + " пользователей.");
Важно понимать, что один и тот же пользователь может открыть несколько сеансов (например, одновременно работать в тонком клиенте и в конфигураторе). Поэтому количество сеансов не всегда равно количеству уникальных пользователей. Если нам нужно посчитать именно уникальных людей, мы должны будем проанализировать свойство Пользователь каждого сеанса.
Давайте подробнее изучим структуру данных, которую нам предоставляет платформа. Объект СеансИнформационнойБазы содержит множество полезных свойств, позволяющих идентифицировать подключение. Выясним назначение ключевых свойств:
ПользовательИнформационнойБазы. Из него мы можем получить имя пользователя (Имя) и его уникальный идентификатор.Тонкий клиент, Толстый клиент, Веб-клиент или использует Конфигуратор.Теперь создадим более сложный алгоритм, который выведет детальную информацию обо всех подключенных пользователях в таблицу или окно сообщений. Проанализируем реализацию:
Сеансы = ПолучитьСеансыИнформационнойБазы();
Для Каждого ТекущийСеанс Из Сеансы Цикл
ИмяПользователя = ТекущийСеанс.Пользователь.Имя;
Если ПустаяСтрока(ИмяПользователя) Тогда
ИмяПользователя = "Служебный сеанс";
КонецЕсли;
Информация = "Пользователь: " + ИмяПользователя +
", Компьютер: " + ТекущийСеанс.ИмяКомпьютера +
", Зашел в: " + ТекущийСеанс.НачалоСеанса +
", Тип клиента: " + ТекущийСеанс.ИмяПриложения;
Сообщить(Информация);
КонецЦикла;
Рассмотрим важный аспект безопасности. Метод ПолучитьСеансыИнформационнойБазы() доступен далеко не каждому пользователю. Для его успешного выполнения у текущего пользователя должны быть установлены административные права. Если вызвать этот метод под обычным пользователем без соответствующих разрешений, система может вернуть пустой список или вызвать исключение в зависимости от версии платформы и режима работы.
Также стоит обратить внимание на контекст выполнения кода. В клиент-серверном варианте работы этот метод рекомендуется выполнять на сервере. Это обеспечит более высокую скорость работы и доступ ко всем свойствам сеансов без лишних сетевых пересылок данных между клиентом и сервером приложений.
Когда мы анализируем свойство ИмяПриложения (или Приложение), платформа возвращает идентификатор типа клиента. Разберем основные значения, которые мы можем встретить:
1CV8 — толстый клиент.1CV8C — тонкий клиент.WebClient — подключение через браузер.Designer — работа в конфигураторе.COMConsole — внешнее соединение через COM-объект.BackgroundJob — выполнение фонового задания.Знание типа приложения позволяет нам отфильтровать, например, системные процессы от реальных действий пользователей. Посмотрим на пример кода, который подсчитывает только тех, кто работает в пользовательском режиме (исключая конфигуратор и фоновые задания):
ВсегоПользователей = 0;
Сеансы = ПолучитьСеансыИнформационнойБазы();
Для Каждого Сеанс Из Сеансы Цикл
Если Сеанс.ИмяПриложения = "1CV8" Или Сеанс.ИмяПриложения = "1CV8C" Или Сеанс.ИмяПриложения = "WebClient" Тогда
ВсегоПользователей = ВсегоПользователей + 1;
КонецЕсли;
КонецЦикла;
Сообщить("Активных интерактивных сеансов: " + ВсегоПользователей);
Помимо стандартного метода ПолучитьСеансыИнформационнойБазы(), существуют и другие способы мониторинга. В крупных корпоративных системах часто используют администрирование через COM-соединение или RAS (Remote Administration Service). Эти инструменты позволяют не только просматривать список пользователей, но и принудительно разрывать соединения, что невозможно сделать простыми средствами встроенного языка без дополнительных манипуляций.
Однако для большинства задач автоматизации внутри конфигурации метода ПолучитьСеансыИнформационнойБазы() вполне достаточно. Он прост в использовании, не требует подключения внешних библиотек и предоставляет всю необходимую информацию для базового анализа активности.
Резюмируя вышесказанное: для получения списка пользователей мы используем массив сеансов, перебираем его в цикле и анализируем свойства каждого объекта СеансИнформационнойБазы. Это позволяет нам строить гибкие отчеты по загрузке системы и управлять доступом к базе данных в автоматическом режиме.