Администраторы 1С часто сталкиваются с необходимостью автоматизировать обслуживание баз данных: резервное копирование, обновление конфигурации, выполнение регламентных задач во внерабочее время. Для этого требуется сначала завершить работу всех активных пользователей, а после выполнения процедур — корректно закрыть саму программу. Проблема заключается в том, что стандартная утилита Windows taskkill /F /IM 1cv8.exe завершает абсолютно все запущенные сеансы 1С на компьютере или сервере, что может привести к потере несохраненных данных у пользователей, работающих в других базах.
Давайте подробно разберем, как точечно закрыть только одну конкретную базу 1С, не затрагивая остальные запущенные процессы. Мы проанализируем как простые варианты, предложенные участниками форума, так и профессиональные системные решения.
Если задача состоит в том, чтобы автоматически запускать 1С для выполнения регламентных задач (например, резервного копирования или обмена данными) и затем гарантированно закрывать именно этот служебный сеанс, мы можем использовать механизм разделения прав на уровне операционной системы.
Суть метода заключается в том, что служебная база запускается под специально созданной учетной записью Windows. В таком случае процесс 1С будет ассоциирован именно с этим пользователем ОС, и мы сможем завершить его, используя фильтрацию в утилите taskkill.
Выполним настройку по шагам:
1CRobot).1CRobot. Строка запуска в планировщике будет выглядеть стандартно:
"C:\Program Files (x86)\1cv8\common\1cestart.exe" ENTERPRISE /S"server\base" /N"Admin" /P"password"
taskkill /fi "username eq 1CRobot" /IM 1cv8.exe /F
Преимущество метода: Абсолютная безопасность для других пользователей. Команда принудительно закроет только те окна 1С, которые были запущены под учетной записью робота, не мешая реальным сотрудникам в соседних базах.
Рассмотрим штатный вариант закрытия системы изнутри самой платформы 1С. Этот метод отлично подходит, если нам нужно открыть базу, выполнить в ней определенные действия (например, групповую обработку справочников или проведение документов) и сразу же закрыть программу.
Для реализации этого сценария мы используем параметр запуска /Execute, который позволяет выполнить внешнюю обработку сразу после открытия информационной базы.
Разберем по шагам создание такой схемы:
.epf). Сохраним ее на диске под именем, например, close.epf.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Здесь можно разместить код автоматического выполнения задач
// ...
// После выполнения задач корректно закрываем 1С
ЗавершитьРаботуСистемы(Ложь);
EndProcedure
/Execute:
"C:\Program Files (x86)\1cv8\common\1cestart.exe" ENTERPRISE /S"server\base" /N"Admin" /P"password" /Execute "D:\close.epf"
Преимущество метода: Это самый «чистый» способ завершения работы. Платформа 1С закрывается штатно: завершаются все фоновые транзакции, освобождаются лицензии на сервере, не повреждаются кэш-файлы и базы данных.
Утверждение о том, что процессы запущенных баз в диспетчере задач ничем не отличаются, ошибочно. Каждая запущенная копия 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}"
Давайте проанализируем, как работает эта команда:
Get-CimInstance Win32_Process -Filter "name='1cv8.exe'" — запрашивает у операционной системы список всех запущенных процессов платформы 1С.Where-Object {$_.CommandLine -like '*server\base*'} — фильтрует полученный список, оставляя только те процессы, в командной строке запуска которых фигурирует имя нашей целевой базы server\base.ForEach-Object {Stop-Process -Id $_.ProcessId -Force} — отправляет команду принудительного завершения для каждого найденного по фильтру процесса.Преимущество метода: Не требует создания дополнительных пользователей в Windows, не требует написания внешних обработок 1С. Метод работает «на лету» и закрывает сеансы конкретной базы у текущего пользователя ОС.
Для клиент-серверных версий 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)
}
}
}
}
}
Преимущество метода: Позволяет гарантированно закрыть сеансы абсолютно всех пользователей, работающих в данный момент с базой на сервере (а не только процесс на локальном компьютере администратора). Это идеальный способ подготовки базы к монопольному обслуживанию.
Если вы работаете с типовой конфигурацией 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 минут) для сохранения данных, корректно закроет их сеансы и установит блокировку на новые подключения.
Мы подробно разобрали несколько способов решения проблемы. Выбор конкретного метода зависит от вашей архитектуры: