Как закрыть конкретную базу 1С через BAT-файл?

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

Администраторы 1С часто сталкиваются с необходимостью автоматизировать обслуживание баз данных: резервное копирование, обновление конфигурации, выполнение регламентных задач во внерабочее время. Для этого требуется сначала завершить работу всех активных пользователей, а после выполнения процедур — корректно закрыть саму программу. Проблема заключается в том, что стандартная утилита Windows taskkill /F /IM 1cv8.exe завершает абсолютно все запущенные сеансы 1С на компьютере или сервере, что может привести к потере несохраненных данных у пользователей, работающих в других базах.

Давайте подробно разберем, как точечно закрыть только одну конкретную базу 1С, не затрагивая остальные запущенные процессы. Мы проанализируем как простые варианты, предложенные участниками форума, так и профессиональные системные решения.

Способ 1. Изоляция процессов через отдельного пользователя Windows

Если задача состоит в том, чтобы автоматически запускать 1С для выполнения регламентных задач (например, резервного копирования или обмена данными) и затем гарантированно закрывать именно этот служебный сеанс, мы можем использовать механизм разделения прав на уровне операционной системы.

Суть метода заключается в том, что служебная база запускается под специально созданной учетной записью Windows. В таком случае процесс 1С будет ассоциирован именно с этим пользователем ОС, и мы сможем завершить его, используя фильтрацию в утилите taskkill.

Выполним настройку по шагам:

  1. Создадим в операционной системе Windows локального или доменного пользователя (например, с именем 1CRobot).
  2. Настроим запуск 1С через Планировщик заданий Windows (Task Scheduler). В параметрах задачи укажем, что запуск должен производиться от имени созданного пользователя 1CRobot. Строка запуска в планировщике будет выглядеть стандартно:
    
    "C:\Program Files (x86)\1cv8\common\1cestart.exe" ENTERPRISE /S"server\base" /N"Admin" /P"password"
    
  3. Для закрытия этого процесса создадим BAT-файл со специальным фильтром по имени пользователя ОС: taskkill /fi "username eq 1CRobot" /IM 1cv8.exe /F

Преимущество метода: Абсолютная безопасность для других пользователей. Команда принудительно закроет только те окна 1С, которые были запущены под учетной записью робота, не мешая реальным сотрудникам в соседних базах.

Способ 2. Запуск внешней обработки с автозавершением работы (Параметр /Execute)

Рассмотрим штатный вариант закрытия системы изнутри самой платформы 1С. Этот метод отлично подходит, если нам нужно открыть базу, выполнить в ней определенные действия (например, групповую обработку справочников или проведение документов) и сразу же закрыть программу.

Для реализации этого сценария мы используем параметр запуска /Execute, который позволяет выполнить внешнюю обработку сразу после открытия информационной базы.

Разберем по шагам создание такой схемы:

  1. Откроем 1С в режиме «Конфигуратор» и создадим новую внешнюю обработку (файл с расширением .epf). Сохраним ее на диске под именем, например, close.epf.
  2. В модуле формы обработки пропишем процедуру, которая будет выполняться при открытии и завершать работу программы. Пример кода для управляемых форм:
    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        // Здесь можно разместить код автоматического выполнения задач
        // ...
        // После выполнения задач корректно закрываем 1С
        ЗавершитьРаботуСистемы(Ложь);
    EndProcedure
    
  3. Настроим BAT-файл для запуска этой схемы. Мы передаем учетные данные администратора и путь к нашей обработке через ключ /Execute:
    
    "C:\Program Files (x86)\1cv8\common\1cestart.exe" ENTERPRISE /S"server\base" /N"Admin" /P"password" /Execute "D:\close.epf"
    

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

Способ 3. Точечное закрытие процесса через PowerShell (Фильтрация по CommandLine)

Утверждение о том, что процессы запущенных баз в диспетчере задач ничем не отличаются, ошибочно. Каждая запущенная копия 1С хранит в операционной системе параметры командной строки, с которыми она была открыта. В этой строке содержится уникальный путь к базе (например, /S"server\base" для клиент-серверного варианта или /F"C:\1C_Bases\trade" для файлового).

Мы можем использовать современный инструмент автоматизации PowerShell, чтобы найти процесс 1cv8.exe, запущенный с параметрами конкретной базы, и завершить только его.

Создадим PowerShell скрипт (файл с расширением .ps1) или вызовем его напрямую из нашего BAT-файла:


powershell -Command "Get-CimInstance Win32_Process -Filter \"name='1cv8.exe'\" | Where-Object {$_.CommandLine -like '*server\base*'} | ForEach-Object {Stop-Process -Id $_.ProcessId -Force}"

Давайте проанализируем, как работает эта команда:

Преимущество метода: Не требует создания дополнительных пользователей в Windows, не требует написания внешних обработок 1С. Метод работает «на лету» и закрывает сеансы конкретной базы у текущего пользователя ОС.

Способ 4. Программное отключение сеансов через COM-соединение

Для клиент-серверных версий 1С самым надежным административным решением является отключение сеансов на стороне сервера приложений 1С:Предприятие. Для этого мы можем написать скрипт на VBScript или PowerShell, который будет подключаться к кластеру серверов 1С через COM-объект V83.COMConnector.

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


$ServerName = "Имя_Сервера_1С"
$BaseName = "Имя_Базы_Данных"

# Создаем COM-объект для подключения к кластеру
$Connector = New-Object -ComObject "V83.COMConnector"
$Agent = $Connector.ConnectAgent($ServerName)
$Clusters = $Agent.GetClusters()

# Проходим по кластерам (обычно он один)
foreach ($Cluster in $Clusters) {
    $Agent.Authenticate($Cluster, "", "")
    $Bases = $Agent.GetInfoBases($Cluster)
    
    # Ищем нашу базу по имени
    foreach ($Base in $Bases) {
        if ($Base.Name -eq $BaseName) {
            # Получаем все активные сеансы базы
            $Sessions = $Agent.GetInfoBaseSessions($Cluster, $Base)
            foreach ($Session in $Sessions) {
                # Завершаем каждый сеанс, кроме фоновых заданий планировщика (при необходимости)
                if ($Session.AppID -ne "ScheduledJobsServer") {
                    $Agent.TerminateSession($Cluster, $Session)
                }
            }
        }
    }
}

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

Способ 5. Использование штатных параметров блокировки БСП

Если вы работаете с типовой конфигурацией 1С (например, «Бухгалтерия предприятия», «Управление торговлей», «ERP Управление предприятием»), в них по умолчанию встроена Библиотека Стандартных Подсистем (БСП). В БСП уже реализован готовый механизм выгона пользователей и блокировки соединений.

Мы можем запустить 1С из BAT-файла в специальном режиме административного управления. Для этого используются специальные параметры запуска:


"C:\Program Files (x86)\1cv8\common\1cestart.exe" ENTERPRISE /S"server\base" /N"Admin" /P"password" /C"ЗавершитьРаботуПользователей" /Out"C:\Log\block_log.txt" -NoKeepRelations

Параметр /C ЗавершитьРаботуПользователей передает в код конфигурации команду на инициализацию штатной блокировки. Система разошлет всем активным пользователям предупреждение, подождет установленное время (по умолчанию 5 минут) для сохранения данных, корректно закроет их сеансы и установит блокировку на новые подключения.

Резюме

Мы подробно разобрали несколько способов решения проблемы. Выбор конкретного метода зависит от вашей архитектуры:

← На главную