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

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

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

Методы получения списка активных пользователей

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

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


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

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

Принудительное завершение сеансов через COM-соединение

Разберем ситуацию, когда нам необходимо не просто увидеть список, но и прервать работу определенных пользователей. Для этого потребуется обращение к кластеру серверов 1С. Самый распространенный метод — использование COM-объекта V83.COMConnector. Этот метод программного завершения сеансов и блокировки базы позволяет подключиться к агенту сервера, найти нужную информационную базу и управлять ее сеансами.

Посмотрим на алгоритм действий при работе с кластером:

  1. Создание объекта V83.COMConnector.
  2. Установка соединения с рабочим процессом сервера.
  3. Аутентификация в кластере (если установлены пароли администратора кластера).
  4. Поиск текущей информационной базы в списке баз кластера.
  5. Получение массива сеансов и их удаление методом TerminateSession.

Рассмотрим подробнее пример кода для реализации этого сценария. Предположим, нам нужно завершить все сеансы, кроме текущего:


// Инициализация параметров подключения
ИмяСервера = "Server1C";
ПортКластера = "1540";
ИмяБазы = "Trade_Base";
АдминБазы = "Admin";
ПарольАдминБазы = "12345";

// Создаем соединитель
Connector = Новый COMОбъект("V83.COMConnector");
// Подключаемся к агенту сервера
AgentConnection = Connector.ConnectAgent(ИмяСервера);

// Получаем кластеры (обычно он один)
Clusters = AgentConnection.GetClusters();
Cluster = Clusters.GetValue(0); // Берем первый кластер

// Аутентифицируемся в кластере
AgentConnection.Authenticate(Cluster, "", "");

// Получаем список рабочих процессов
WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster);

Для Каждого Process Из WorkingProcesses Цикл
    // Подключаемся к рабочему процессу
    ConnectString = Process.HostName + ":" + XMLСтрока(Process.MainPort);
    WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString);
    
    // Аутентифицируемся в информационной базе
    WorkingProcessConnection.AddAuthentication(АдминБазы, ПарольАдминБазы);
    
    // Ищем нашу базу среди баз рабочего процесса
    InfoBases = WorkingProcessConnection.GetInfoBases();
    Для Каждого IB Из InfoBases Цикл
        Если ВРег(IB.Name) = ВРег(ИмяБазы) Тогда
            // Получаем все сеансы этой базы
            Sessions = WorkingProcessConnection.GetInfoBaseSessions(IB);
            Для Каждого Session Из Sessions Цикл
                // Здесь можно добавить условие фильтрации
                // Например, не завершать фоновые задания или текущий сеанс
                Если Session.AppID <> "COMConsole" Тогда
                    WorkingProcessConnection.TerminateSession(IB, Session);
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Важный момент: использование V83.COMConnector требует наличия установленной и зарегистрированной библиотеки comcntr.dll на сервере или компьютере, с которого запускается код. Также необходимо учитывать разрядность (32/64 бита) клиента и сервера.

Современный подход: Использование утилиты RAS и RAC

Начиная с версии 8.3.15, 1С предоставляет более современные способы управления кластером. Если мы проанализируем альтернативные способы, то увидим, что использование консольной утилиты rac позволяет выполнять те же действия без необходимости регистрации COM-компонентов. Это особенно актуально, когда требуется управление кластером 1С 8.3 на Linux или в другой кроссплатформенной среде. Для упрощения этой задачи можно использовать сценарий Python для автоматизации установки 1С и настройки службы RAS в Astra Linux.

Процесс завершения сеанса через rac по шагам:

  1. Запуск службы ras (Remote Administration Service) на сервере 1С.
  2. Выполнение команды получения списка сеансов: rac session --ib-name=ИмяБазы list.
  3. Парсинг идентификаторов сеансов (UUID).
  4. Выполнение команды удаления: rac session --ib-name=ИмяБазы terminate --session=UUID.

Рассмотрим, как вызвать эту утилиту прямо из кода 1С с помощью объекта ЗапуститьПриложение. Стоит учитывать, что корректное выполнение команд командной строки Windows позволяет не только запускать утилиты, но и получать результат их работы обратно в переменные 1С.


Команда = """C:\Program Files\1cv8\8.3.XX.XXXX\bin\rac.exe"" session --cluster=" + ИдентификаторКластера + " terminate --session=" + ИдентификаторСеанса;
ЗапуститьПриложение(Команда, , Истина);

Обработка ошибок и права доступа

Выясним причину возможных неудач при выполнении вышеуказанного кода. Чаще всего программисты сталкиваются с ошибкой "Нарушение прав доступа". Для работы с методами GetInfoBaseSessions и TerminateSession пользователь должен обладать правами администратора информационной базы и кластера.

Также следует учитывать, что принудительное завершение сеанса может привести к потере не сохраненных данных. Рекомендуется предварительно отправлять пользователям уведомление. В 1С это можно реализовать через механизм ЗаблокироватьУстановкуСоединений. Для систем на базе открытого ПО будет полезна обработка для установки и снятия блокировок БД на сервере под Linux.

Проанализируем пример установки блокировки:


Блокировка = Новый БлокировкаУстановкиСоединений;
Блокировка.Установлена = Истина;
Блокировка.Начало = ТекущаяДата();
Блокировка.Конец = ТекущаяДата() + 3600; // на один час
Блокировка.Сообщение = "Внимание! База будет недоступна в связи с техническими работами. Пожалуйста, завершите работу.";
Блокировка.КодРазрешения = "ServiceMode";

УстановитьБлокировкуУстановкиСоединений(Блокировка);

Использование кода разрешения позволяет администратору зайти в базу даже при активной блокировке, запустив клиент с параметром /UC ServiceMode.

Резюме и рекомендации

Мы рассмотрели несколько способов взаимодействия с активными сеансами в 1С 8.3. Выбор конкретного метода зависит от архитектуры вашей системы. Для простых задач мониторинга достаточно встроенных методов, а для жесткого управления — COM-соединения или rac.

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

← На главную