В процессе администрирования баз данных 1С часто возникает необходимость автоматизировать процесс управления сеансами. Это может потребоваться для выполнения регламентных работ, обновления конфигурации или принудительного освобождения лицензий. В рамках данной статьи мы подробно разберем, какими инструментами располагает программист 1С для решения этих задач, изучим программные способы и готовые скрипты, позволяющие эффективно «выгнать» пользователей из базы.
Для начала выясним причину, по которой стандартных средств мониторинга в консоли администрирования бывает недостаточно. Часто требуется программная логика: например, если количество активных сеансов превышает лимит. В таких случаях автоматический мониторинг и завершение неактивных сеансов позволяет существенно оптимизировать использование клиентских лицензий, выявляя пользователей, которые не проявляли активность более определенного времени. Рассмотрим основные способы получения информации о текущих соединениях.
Первый и самый простой способ — использование метода ПолучитьСеансыИнформационнойБазы(). Этот метод доступен во встроенном языке и возвращает массив объектов типа СеансИнформационнойБазы. Проанализируем пример кода, который позволяет вывести список всех подключенных пользователей в окно сообщений:
СписокСеансов = ПолучитьСеансыИнформационнойБазы();
Для Каждого ТекущийСеанс Из СписокСеансов Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Пользователь: " + ТекущийСеанс.Пользователь.Имя +
", Начало сеанса: " + ТекущийСеанс.НачалоСеанса +
", Номер сеанса: " + ТекущийСеанс.НомерСеанса;
Сообщение.Сообщить();
КонецЦикла;
Важно отметить, что данный метод работает на стороне сервера. Объект СеансИнформационнойБазы содержит полезные свойства, такие как ИмяКомпьютера, Приложение (например, "Тонкий клиент" или "BackgroundJob") и Соединение. Однако стоит помнить, что простое получение списка не дает возможности принудительно "выгнать" пользователя из базы штатными средствами этого объекта.
Разберем ситуацию, когда нам необходимо не просто увидеть список, но и прервать работу определенных пользователей. Для этого потребуется обращение к кластеру серверов 1С. Самый распространенный метод — использование COM-объекта V83.COMConnector. Этот метод программного завершения сеансов и блокировки базы позволяет подключиться к агенту сервера, найти нужную информационную базу и управлять ее сеансами.
Посмотрим на алгоритм действий при работе с кластером:
V83.COMConnector.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 бита) клиента и сервера.
Начиная с версии 8.3.15, 1С предоставляет более современные способы управления кластером. Если мы проанализируем альтернативные способы, то увидим, что использование консольной утилиты rac позволяет выполнять те же действия без необходимости регистрации COM-компонентов. Это особенно актуально, когда требуется управление кластером 1С 8.3 на Linux или в другой кроссплатформенной среде. Для упрощения этой задачи можно использовать сценарий Python для автоматизации установки 1С и настройки службы RAS в Astra Linux.
Процесс завершения сеанса через rac по шагам:
ras (Remote Administration Service) на сервере 1С.rac session --ib-name=ИмяБазы list.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.
При написании подобных обработок всегда предусматривайте обработку исключений через блок Попытка... Исключение. Также, наряду с завершением сеансов, хорошей практикой является автоматическая очистка серверного кэша с помощью скриптов, что помогает избежать многих ошибок после обновления конфигурации. Не забывайте закрывать все созданные соединения и освобождать память после завершения работы алгоритма.