Как программно завершить сеанс определенного пользователя в системе 1С

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

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

Метод 1: Использование COM-соединения для управления кластером

Самый распространенный способ управления сеансами, обсуждаемый в технических сообществах, заключается в использовании COM-интерфейса платформы 1С. Мы будем обращаться к объекту V83.COMConnector (или V82.COMConnector, в зависимости от установленной версии платформы) для взаимодействия с сервером администрирования.

Рассмотрим по шагам алгоритм работы скрипта, который позволяет найти и завершить сеансы определенного пользователя:

  1. Создание COM-объекта: Инициализируем соединение с сервером.
  2. Подключение к агенту сервера: Устанавливаем связь с процессом ragent.
  3. Получение кластера: Выбираем нужный кластер серверов (обычно он один).
  4. Авторизация в кластере: Вводим логин и пароль администратора кластера.
  5. Поиск сеансов: Перебираем все активные соединения базы и находим те, которые принадлежат целевому пользователю.
  6. Отключение: Вызываем метод Disconnect() для удаления сеанса.

Проанализируем программный код, который реализует эту логику:


// Инициализируем COM-соединение
Попытка
    COM = Новый COMОбъект("V83.COMConnector");
Исключение
    Сообщить("Не удалось создать COM-объект. Проверьте регистрацию библиотеки.");
    Возврат;
КонецПопытки;

// Подключаемся к агенту сервера. "ServerName" - имя вашего сервера 1С
Агент = COM.ConnectAgent("ServerName");
Кластеры = Агент.GetClusters();

// Работаем с первым кластером (индекс 0)
Кластер = Кластеры.GetValue(0);
Агент.Authenticate(Кластер, "AdminUser", "AdminPassword");

// Получаем список рабочих процессов
РабочиеПроцессы = Агент.GetWorkingProcesses(Кластер);

Для Каждого Процесс Из РабочиеПроцессы Цикл
    // Формируем строку соединения с рабочим процессом
    СтрокаСоединенияРП = Процесс.HostName + ":" + Формат(Процесс.MainPort, "ЧГ=");
    СоединениеРП = COM.ConnectWorkingProcess(СтрокаСоединенияРП);
    
    // Авторизация в конкретной информационной базе
    СоединениеРП.AddAuthentication("BaseUser", "BasePassword");
    
    ОписаниеИБ = СоединениеРП.CreateInfoBaseInfo();
    ОписаниеИБ.Name = "YourBaseName"; // Имя базы в кластере
    
    // Получаем все соединения базы
    Соединения = СоединениеРП.GetInfoBaseConnections(ОписаниеИБ);
    
    Для Каждого Соединение Из Соединения Цикл
        // Проверяем имя пользователя или AppID
        Если Соединение.UserName = "НужныйПользователь" Тогда
            // Исключаем отключение собственной консоли администратора
            Если Соединение.AppID <> "COMConsole" Тогда
                СоединениеРП.Disconnect(Соединение);
                Сообщить("Пользователь " + Соединение.UserName + " отключен.");
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

Решение ошибки «Класс не зарегистрирован»

Часто при выполнении вышеуказанного кода возникает ошибка 0x80040154 (Класс не зарегистрирован). Проанализируем причины ее появления. Как правило, это происходит потому, что в операционной системе не зарегистрирована динамическая библиотека comcntrl.dll, входящая в состав платформы.

Для исправления ситуации выполним следующие действия:

  1. Запустите командную строку от имени администратора.
  2. Перейдите в каталог установленной платформы, например: cd "C:\Program Files\1cv8\8.3.XX.XXXX\bin".
  3. Выполните регистрацию команды: regsvr32 comcntrl.dll.

Важный нюанс: Если ваш сервер 1С имеет 64-битную разрядность, а вызывающее приложение (например, внешняя обработка или регламентное задание) работает в 32-битном контексте (или наоборот), простая регистрация может не помочь. В этом случае рекомендуется настроить COM+ Application в службах компонентов Windows, чтобы обеспечить взаимодействие между процессами разной разрядности.

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

Начиная с версии 8.3, 1С предлагает более надежный инструмент администрирования — сервер RAS (Remote Administration Server) и утилиту командной строки RAC. Этот способ избавляет разработчика от «мучений» с COM-объектами и зависимостями Windows.

Для завершения сеанса через RAC выполним следующие шаги:

  1. Убедитесь, что служба ras запущена на сервере (по умолчанию порт 1545).
  2. Используйте команду для получения списка сеансов, чтобы узнать ID сеанса нужного пользователя.
  3. Выполните команду терминации сеанса.

В коде 1С это можно реализовать через ЗапуститьПриложение:


Команда = "rac session --cluster=<ID_Кластера> terminate --session=<ID_Сеанса>";
ЗапуститьПриложение(Команда, , Истина);

Этот метод считается более стабильным, так как он не зависит от регистрации DLL и корректно работает даже в средах Linux, где COM-объекты недоступны.

Метод 3: Программный интерфейс БСП

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

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

Сравнение понятий: Соединение vs Сеанс

При написании кода важно не путать Соединение (физический канал связи) и Сеанс (логическая сущность в кластере). В версии 8.3 один сеанс пользователя может использовать разные соединения в процессе работы. Для надежного «выбивания» пользователя из системы следует стремиться к завершению именно Сеанса через интерфейс администрирования кластера, иначе система может попытаться восстановить связь по другому каналу.

«Мягкое» завершение сеанса

Иногда принудительное «убийство» процесса может привести к потере данных или незавершенным транзакциям. Рассмотрим более безопасный, «мягкий» способ:

  1. В конфигурации создается регистр сведений, куда записываются пользователи, которых нужно отключить.
  2. В модуле управляемого приложения подключается обработчик ожидания (например, раз в 5 минут).
  3. Процедура обработчика проверяет наличие текущего пользователя в «черном списке» регистра.
  4. Если пользователь найден, вызывается штатная функция ЗавершитьРаботуСистемы(Ложь).

Этот подход позволяет пользователю сохранить изменения (если добавить интерактивное предупреждение) и гарантирует корректное завершение всех процессов в базе данных.

Выяснив причины и способы решения, мы можем сделать вывод: для разовых задач в среде Windows проще всего использовать COMConnector с предварительной регистрацией библиотеки. Для крупных, высоконагруженных или кроссплатформенных систем лучшим выбором будет использование RAC/RAS или встроенных механизмов БСП.

← На главную