Как выгнать пользователей из серверной базы 1С через командную строку?

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

В процессе обслуживания серверных баз 1С часто возникает необходимость обеспечить монопольный доступ. Это требуется для обновления конфигурации, исправления критических ошибок или проведения регламентных операций на уровне СУБД. Если у системного администратора или программиста нет прав администратора в операционной системе Windows, но есть административные права в самой 1С, стандартные методы через оснастку mmc могут быть недоступны — поможет утилита администрирования баз и сеансов 1С. В такой ситуации на помощь приходит командная строка.

Рассмотрим подробнее основные способы автоматизации изгнания пользователей с помощью батников (.bat или .cmd файлов) и специализированных скриптов. Мы проанализируем ситуацию, когда нам нужно программно «попросить» пользователей выйти или принудительно разорвать их соединения — для этого подойдёт обработка принудительного завершения сеансов пользователей 1С.

Способ 1: Использование 1C:Executor или OneScript

Одним из самых мощных и современных способов является использование среды выполнения OneScript или 1C:Executor. Эти инструменты позволяют писать скрипты на привычном языке 1С и запускать их из консоли. Разберем пример скрипта, который подключается к кластеру серверов и завершает активные сеансы.

Для реализации этого метода нам потребуется скрипт (например, drop_sessions.sbsl). Давайте изучим его структуру:


метод DropSessions(Сервер: Строка, База: Строка)
    Консоль.Записать("Сервер: %Сервер База: %База Удаляем сессии...")
    // Инициализируем объект администрирования
    знч АдминистрированиеСервера = новый АдминистрированиеСервераV8(Сервер, 1545)
    знч Кластеры = АдминистрированиеСервера.ПолучитьКластеры()
    
    для Кластер из Кластеры 
        Кластер.ВыполнитьАутентификацию()
        знч ИнформационныеБазы = Кластер.ПолучитьИнфобазы()
        
        для ИнформационнаяБазаОписание из ИнформационныеБазы
            если ИнформационнаяБазаОписание.Имя == База
                // Авторизуемся в конкретной базе
                знч ИнформационнаяБаза = ИнформационнаяБазаОписание.ВыполнитьАутентификацию("Админ", "Пароль")
                
                знч Сеансы = ИнформационнаяБаза.ПолучитьСеансы()
                для Сеанс из Сеансы
                    // Отсекаем только клиентские сеансы, чтобы не прервать важные фоновые задания
                    если Сеанс.ИмяПриложения == "1CV8C"
                        Консоль.Записать("Завершаем сеанс: " + Сеанс.ИмяПользователя)
                        Сеанс.ЗавершитьСеанс("Плановое обслуживание базы")
                    конецесли;
                конеццикла;
            конецесли;
        конеццикла;
    конеццикла;
    АдминистрированиеСервера.Закрыть()
конецметода;

Запуск такого скрипта из командного файла .bat будет выглядеть следующим образом:

executor.cmd .\drop_sessions.sbsl::DropSessions -Сервер "MyServer" -База "WorkDB"

Преимущество этого метода в том, что он кроссплатформенный и работает через Java, не требуя специфических прав в Windows. Мы используем объект АдминистрированиеСервераV8, который предоставляет полный контроль над кластером.

Способ 2: Утилита RAC (Remote Administration Client)

Если установка дополнительных сред выполнения (как OneScript) запрещена, воспользуемся штатным средством платформы 8.3 — утилитой rac.exe. Она работает через службу ras (Remote Administration Service), которая по умолчанию слушает порт 1545.

Проанализируем алгоритм действий для создания универсального батника:

  1. Получение ID кластера: Сначала нужно узнать идентификатор кластера, так как rac работает с UUID, а не с именами.
  2. Получение ID информационной базы: Аналогично находим UUID нашей базы.
  3. Получение списка сеансов: Команда rac session --cluster={ID_кластера} list выдаст список всех подключений.
  4. Завершение сеансов: Перебираем полученные идентификаторы и вызываем terminate.

Пример команды для мгновенного завершения конкретного сеанса:

rac session --cluster={UUID} terminate --session={UUID_сеанса}

Важный нюанс: Чтобы автоматизировать это в цикле внутри .bat файла, потребуется использовать команду for /f для парсинга вывода rac. Это несколько сложнее в написании, но не требует ничего, кроме самой установленной платформы 1С.

Способ 3: Блокировка соединений (SessionsDenied)

Просто «выгнать» пользователей часто недостаточно. Современные тонкие клиенты имеют свойство автоматически переподключаться при разрыве соединения. Поэтому правильная стратегия включает установку блокировки. Выясним, как это сделать программно.

Мы должны установить признак SessionsDenied = True. Существует обработка для установки блокировок, но через rac это делается одной командой:

rac infobase --cluster={ID} update --infobase={ID_IB} --sessions-denied=on --denied-message="База на обслуживании" --permission-code="12345"

Рассмотрим параметры подробнее:

После установки блокировки все существующие сеансы нужно завершить методами, описанными в Способе 1 или 2. Только тогда база станет действительно пустой.

Способ 4: Использование COM-соединения и PowerShell

Если на компьютере зарегистрирована библиотека 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. В противном случае пользователи не смогут войти в систему даже после перезагрузки сервера.

← На главную