В процессе обслуживания серверных баз 1С часто возникает необходимость обеспечить монопольный доступ. Это требуется для обновления конфигурации, исправления критических ошибок или проведения регламентных операций на уровне СУБД. Если у системного администратора или программиста нет прав администратора в операционной системе Windows, но есть административные права в самой 1С, стандартные методы через оснастку mmc могут быть недоступны — поможет утилита администрирования баз и сеансов 1С. В такой ситуации на помощь приходит командная строка.
Рассмотрим подробнее основные способы автоматизации изгнания пользователей с помощью батников (.bat или .cmd файлов) и специализированных скриптов. Мы проанализируем ситуацию, когда нам нужно программно «попросить» пользователей выйти или принудительно разорвать их соединения — для этого подойдёт обработка принудительного завершения сеансов пользователей 1С.
Одним из самых мощных и современных способов является использование среды выполнения OneScript или 1C:Executor. Эти инструменты позволяют писать скрипты на привычном языке 1С и запускать их из консоли. Разберем пример скрипта, который подключается к кластеру серверов и завершает активные сеансы.
Для реализации этого метода нам потребуется скрипт (например, drop_sessions.sbsl). Давайте изучим его структуру:
метод DropSessions(Сервер: Строка, База: Строка)
Консоль.Записать("Сервер: %Сервер База: %База Удаляем сессии...")
// Инициализируем объект администрирования
знч АдминистрированиеСервера = новый АдминистрированиеСервераV8(Сервер, 1545)
знч Кластеры = АдминистрированиеСервера.ПолучитьКластеры()
для Кластер из Кластеры
Кластер.ВыполнитьАутентификацию()
знч ИнформационныеБазы = Кластер.ПолучитьИнфобазы()
для ИнформационнаяБазаОписание из ИнформационныеБазы
если ИнформационнаяБазаОписание.Имя == База
// Авторизуемся в конкретной базе
знч ИнформационнаяБаза = ИнформационнаяБазаОписание.ВыполнитьАутентификацию("Админ", "Пароль")
знч Сеансы = ИнформационнаяБаза.ПолучитьСеансы()
для Сеанс из Сеансы
// Отсекаем только клиентские сеансы, чтобы не прервать важные фоновые задания
если Сеанс.ИмяПриложения == "1CV8C"
Консоль.Записать("Завершаем сеанс: " + Сеанс.ИмяПользователя)
Сеанс.ЗавершитьСеанс("Плановое обслуживание базы")
конецесли;
конеццикла;
конецесли;
конеццикла;
конеццикла;
АдминистрированиеСервера.Закрыть()
конецметода;
Запуск такого скрипта из командного файла .bat будет выглядеть следующим образом:
executor.cmd .\drop_sessions.sbsl::DropSessions -Сервер "MyServer" -База "WorkDB"
Преимущество этого метода в том, что он кроссплатформенный и работает через Java, не требуя специфических прав в Windows. Мы используем объект АдминистрированиеСервераV8, который предоставляет полный контроль над кластером.
Если установка дополнительных сред выполнения (как OneScript) запрещена, воспользуемся штатным средством платформы 8.3 — утилитой rac.exe. Она работает через службу ras (Remote Administration Service), которая по умолчанию слушает порт 1545.
Проанализируем алгоритм действий для создания универсального батника:
rac работает с UUID, а не с именами.UUID нашей базы.rac session --cluster={ID_кластера} list выдаст список всех подключений.terminate.Пример команды для мгновенного завершения конкретного сеанса:
rac session --cluster={UUID} terminate --session={UUID_сеанса}
Важный нюанс: Чтобы автоматизировать это в цикле внутри .bat файла, потребуется использовать команду for /f для парсинга вывода rac. Это несколько сложнее в написании, но не требует ничего, кроме самой установленной платформы 1С.
Просто «выгнать» пользователей часто недостаточно. Современные тонкие клиенты имеют свойство автоматически переподключаться при разрыве соединения. Поэтому правильная стратегия включает установку блокировки. Выясним, как это сделать программно.
Мы должны установить признак SessionsDenied = True. Существует обработка для установки блокировок, но через rac это делается одной командой:
rac infobase --cluster={ID} update --infobase={ID_IB} --sessions-denied=on --denied-message="База на обслуживании" --permission-code="12345"
Рассмотрим параметры подробнее:
UC), который позволит вам как администратору войти в заблокированную базу для проведения работ.После установки блокировки все существующие сеансы нужно завершить методами, описанными в Способе 1 или 2. Только тогда база станет действительно пустой.
Если на компьютере зарегистрирована библиотека comcntr.dll, мы можем использовать PowerShell для управления сервером 1С. Этот метод удобен тем, что PowerShell встроен в любую современную Windows.
Разберем пример логики на PowerShell:
$Connector = New-Object -ComObject "V83.COMConnector"
$ServerAgent = $Connector.ConnectAgent("MyServerName")
$Clusters = $ServerAgent.GetClusters()
# Выбираем нужный кластер (обычно первый)
$Cluster = $Clusters[0]
$ServerAgent.Authenticate($Cluster, "ClusterAdmin", "ClusterPass")
$IBs = $ServerAgent.GetInfoBases($Cluster)
foreach ($IB in $IBs) {
if ($IB.Name -eq "WorkDB") {
$Sessions = $ServerAgent.GetInfoBaseSessions($Cluster, $IB)
foreach ($Session in $Sessions) {
$ServerAgent.TerminateSession($Cluster, $Session)
}
}
}
Внимание: Начиная с версии платформы 8.3.20, работа с COM-объектами может быть ограничена настройками безопасности. Проверьте, что у вас есть доступ к компоненте V83.COMConnector.
Выяснив все доступные варианты, можно сделать следующие выводы. Если вам нужно надежное и простое решение для батника, лучшим выбором будет использование OneScript или 1C:Executor, так как они позволяют писать читаемый код на языке 1С. Если установка стороннего ПО запрещена, используйте rac.exe.
Не забудьте, что после завершения регламентных работ блокировку нужно снять, выполнив команду обновления параметров информационной базы с ключом --sessions-denied=off. В противном случае пользователи не смогут войти в систему даже после перезагрузки сервера.