В повседневной работе системных администраторов и разработчиков 1С часто возникает задача оперативного управления активными пользователями. Стандартный механизм в меню Администрирование — Обслуживание — Активные пользователи удобен, но обладает существенным недостатком: при каждой попытке завершить сеанс система запрашивает логин и пароль администратора кластера серверов. В этой статье мы разберем, как автоматизировать этот процесс, где найти нужный код в конфигураторе и как безопасно хранить учетные данные.
Для начала проанализируем, где именно в системе реализована логика работы с сеансами. В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), этот функционал не является жестко зашитым в платформу. Его можно найти и модифицировать.
Выясним, какие объекты метаданных отвечают за этот интерфейс:
АктивныеПользователи: здесь находится сама форма списка пользователей.СоединенияИСеансы: это «сердце» подсистемы. В нем сосредоточены процедуры для получения списка активных соединений и команды на их удаление.СоединенияИСеансыВызовСервера: используется для связи интерфейса формы с серверной логикой.Разберем по шагам, что происходит при нажатии кнопки Завершить сеанс. Программа обращается к процедурам модуля СоединенияИСеансы, которые проверяют наличие сохраненных параметров администрирования в текущем сеансе. Если параметры отсутствуют, вызывается форма ВводПараметровАдминистрированияКластера. Наша задача — подставить данные программно, чтобы эта форма не открывалась.
Хранить пароль администратора кластера в обычных константах или справочниках в открытом виде крайне небезопасно. Рассмотрим более надежный метод, предоставляемый БСП — Безопасное хранилище данных.
Этот механизм позволяет записывать конфиденциальную информацию в зашифрованном виде. Проанализируем пример кода для записи и чтения пароля из безопасного хранилища:
// Запись пароля в хранилище (выполняется один раз администратором)
КлючОбъекта = "ПараметрыАдминистратораКластера";
СтруктураДанных = Новый Структура("Логин, Пароль", "admin", "P@ssw0rd123");
ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(КлючОбъекта, СтруктураДанных);
// Чтение данных при необходимости завершить сеанс
Данные = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(КлючОбъекта);
Если Данные <> Неопределено Тогда
ЛогинАдмина = Данные.Логин;
ПарольАдмина = Данные.Пароль;
КонецЕсли;
Использование этого метода позволяет скрыть пароль от обычных пользователей и даже от тех, кто имеет доступ к Функциям для технического специалиста, так как данные не хранятся в явном виде в таблицах базы данных.
Чтобы реализовать собственную кнопку завершения сеанса без лишних диалоговых окон, мы можем использовать один из трех основных способов взаимодействия с сервером 1С.
Этот метод является классическим для Windows-окружения. Мы создаем объект, который подключается к агенту сервера и выполняет команды администрирования. Рассмотрим пример кода:
Функция ЗавершитьСеансЧерезCOM(ИмяСервера, ПортКластера, ИмяБазы, ЛогинАдмина, ПарольАдмина, НомерСеанса)
Connector = Новый COMОбъект("V83.COMConnector");
// Подключаемся к агенту сервера
AgentConnection = Connector.ConnectAgent(ИмяСервера);
// Получаем кластеры
Clusters = AgentConnection.GetClusters();
Для Каждого Cluster Из Clusters Цикл
AgentConnection.Authenticate(Cluster, ЛогинАдмина, ПарольАдмина);
// Ищем нужную информационную базу
WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster);
Для Каждого Process Из WorkingProcesses Цикл
// Подключаемся к рабочему процессу
ConnectString = Process.HostName + ":" + Формат(Process.MainPort, "ЧГ=0");
WorkingProcess = Connector.ConnectWorkingProcess(ConnectString);
WorkingProcess.AuthenticateAdmin(ЛогинАдмина, ПарольАдмина);
// Ищем сеанс и удаляем его
Sessions = WorkingProcess.GetSessions(Cluster);
Для Каждого Session Из Sessions Цикл
Если Session.SessionID = НомерСеанса Тогда
WorkingProcess.TerminateSession(Cluster, Session);
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
КонецФункции
Важный момент: Для работы этого кода на сервере должен быть зарегистрирован COM-объект соответствующей версии платформы.
Если ваша система работает на Linux или вы хотите уйти от использования COM, рекомендуется использовать Remote Administration Server (RAS). Вызов команд осуществляется через утилиту rac.
Посмотрим на алгоритм действий:
ras (по умолчанию порт 1545).ЗапуститьПриложение.Пример формирования строки команды:
rac session --cluster=ID_КЛАСТЕРА --terminate --session=ID_СЕАНСА --cluster-user=admin --cluster-pwd=password localhost:1545
В типовых конфигурациях уже реализован механизм сохранения пароля администратора кластера для выполнения регламентных работ (например, для блокировки соединений перед обновлением). Выясним, как это использовать.
Если вы один раз заполните данные в форме Настройка блокировки соединений, БСП сохранит эти параметры. Вы можете найти в модуле СоединенияИСеансы процедуры, которые извлекают эти параметры (обычно это структура ПараметрыАдминистрирования). Используя их как шаблон, можно модифицировать код завершения сеанса так, чтобы он всегда брал логин и пароль из этого «штатного» места хранения.
Автоматизация ввода пароля — это всегда компромисс между удобством и безопасностью. Проанализируем возможные риски:
РольДоступна("ПолныеПрава") или создайте специальную роль.&НаСервере). Не передавайте пароль в переменные на клиентскую сторону.Таким образом, мы выяснили, что задача автоматического завершения сеансов решается через модификацию модулей БСП с применением безопасного хранилища данных или программного интерфейса управления кластером. Это позволяет существенно ускорить администрирование системы без ущерба для безопасности, если соблюдать правила разграничения прав доступа.