В процессе администрирования систем на базе 1С:Предприятие часто возникает необходимость автоматизировать управление пользовательскими сеансами. Это может быть связано с выполнением регламентных работ, обновлением конфигурации или специфическими бизнес-процессами, когда конкретного пользователя нужно «выбить» из системы в определенный момент времени. В данной статье мы подробно разберем, как реализовать эту задачу программно, проанализируем возможные ошибки и рассмотрим альтернативные современные подходы.
Самый распространенный способ управления сеансами, обсуждаемый в технических сообществах, заключается в использовании COM-интерфейса платформы 1С. Мы будем обращаться к объекту V83.COMConnector (или V82.COMConnector, в зависимости от установленной версии платформы) для взаимодействия с сервером администрирования.
Рассмотрим по шагам алгоритм работы скрипта, который позволяет найти и завершить сеансы определенного пользователя:
ragent.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, входящая в состав платформы.
Для исправления ситуации выполним следующие действия:
cd "C:\Program Files\1cv8\8.3.XX.XXXX\bin".regsvr32 comcntrl.dll.Важный нюанс: Если ваш сервер 1С имеет 64-битную разрядность, а вызывающее приложение (например, внешняя обработка или регламентное задание) работает в 32-битном контексте (или наоборот), простая регистрация может не помочь. В этом случае рекомендуется настроить COM+ Application в службах компонентов Windows, чтобы обеспечить взаимодействие между процессами разной разрядности.
Начиная с версии 8.3, 1С предлагает более надежный инструмент администрирования — сервер RAS (Remote Administration Server) и утилиту командной строки RAC. Этот способ избавляет разработчика от «мучений» с COM-объектами и зависимостями Windows.
Для завершения сеанса через RAC выполним следующие шаги:
ras запущена на сервере (по умолчанию порт 1545).ID сеанса нужного пользователя.В коде 1С это можно реализовать через ЗапуститьПриложение:
Команда = "rac session --cluster=<ID_Кластера> terminate --session=<ID_Сеанса>";
ЗапуститьПриложение(Команда, , Истина);
Этот метод считается более стабильным, так как он не зависит от регистрации DLL и корректно работает даже в средах Linux, где COM-объекты недоступны.
Если ваша конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), то задача значительно упрощается. Разберем, какие инструменты предоставляет БСП.
В составе БСП есть общий модуль СоединенияИСеансы. С его помощью можно управлять блокировками и завершением работы пользователей без написания низкоуровневых скриптов. Например, функция УстановитьБлокировкуСеансов() позволяет не только запретить новые подключения, но и передать параметр ПараметрСообщенияЗавершения, который заставит клиентские приложения закрыться через определенное время.
При написании кода важно не путать Соединение (физический канал связи) и Сеанс (логическая сущность в кластере). В версии 8.3 один сеанс пользователя может использовать разные соединения в процессе работы. Для надежного «выбивания» пользователя из системы следует стремиться к завершению именно Сеанса через интерфейс администрирования кластера, иначе система может попытаться восстановить связь по другому каналу.
Иногда принудительное «убийство» процесса может привести к потере данных или незавершенным транзакциям. Рассмотрим более безопасный, «мягкий» способ:
ЗавершитьРаботуСистемы(Ложь).Этот подход позволяет пользователю сохранить изменения (если добавить интерактивное предупреждение) и гарантирует корректное завершение всех процессов в базе данных.
Выяснив причины и способы решения, мы можем сделать вывод: для разовых задач в среде Windows проще всего использовать COMConnector с предварительной регистрацией библиотеки. Для крупных, высоконагруженных или кроссплатформенных систем лучшим выбором будет использование RAC/RAS или встроенных механизмов БСП.