При администрировании серверных баз данных 1С системные администраторы часто сталкиваются с необходимостью регулярного создания резервных копий в формате .dt. Однако корректно выполнить выгрузку в режиме конфигуратора бывает непросто из-за постоянной активности фоновых заданий. Платформа 1С непрерывно инициирует регламентные процессы: синхронизацию данных, обновление индексов, загрузку курсов валют и другие системные задачи. Активные сеансы фоновых заданий мешают монопольному доступу к базе данных, что приводит к ошибкам при попытке выгрузки информационной базы.
В этой статье мы подробно рассмотрим несколько практических способов, которые позволяют корректно завершить фоновые задания и заблокировать их повторный запуск непосредственно из скрипта автоматизации перед началом выгрузки в .dt.
Если мы попытаемся выполнить стандартную команду выгрузки через командную строку конфигуратора, при наличии активных фоновых заданий система вернет ошибку совместного доступа. Регламентные задания могут запускаться каждую минуту, поэтому просто "поймать" момент простоя практически невозможно. Нам необходимо принудительно запретить запуск новых фоновых заданий, завершить текущие активные сессии, выполнить резервное копирование и вернуть базу в исходное рабочее состояние. Разберем наиболее эффективные и безопасные способы реализации этого сценария. Для решения этой задачи также можно задействовать скрипт для резервного копирования баз 1С в DT-файл без закрытия сеансов.
Использование консольной утилиты rac.exe — это наиболее технологичный и гибкий способ управления сервером 1С:Предприятия. Данный метод позволяет управлять сеансами и свойствами информационной базы "на лету", не требуя перезапуска службы сервера 1С.
Рассмотрим алгоритм действий для CMD-скрипта:
Для реализации этого сценария на сервере должна быть запущена служба утилиты администрирования 1С (ras.exe). Посмотрим на пример CMD-скрипта, реализующего данную схему:
@echo off
set CLUSTER_ID=00000000-0000-0000-0000-000000000000
set IB_ID=11111111-1111-1111-1111-111111111111
set SERVER_ADDR=localhost:1545
set ADMIN_USER=Admin
set ADMIN_PASS=MyPassword
echo Устанавливаем блокировку регламентных заданий и новых сеансов...
rac infobase update --cluster=%CLUSTER_ID% --infobase=%IB_ID% --infobase-user=%ADMIN_USER% --infobase-pwd=%ADMIN_PASS% --scheduled-jobs-deny=on --sessions-deny=on --denied-message="Выполняется резервное копирование ИБ" %SERVER_ADDR%
echo Завершаем активные фоновые задания...
:: Скрипт запрашивает список сеансов и завершает те, которые запущены фоновыми процессами (BackgroundJob)
for /f "tokens=1,2 delims=:" %%a in ('rac session list --cluster=%CLUSTER_ID% %SERVER_ADDR%') do (
if "%%a"=="session" set SESSION_ID=%%b
if "%%a"=="app-id" (
if "%%b"=="BackgroundJob" (
rac session terminate --cluster=%CLUSTER_ID% --session=%SESSION_ID% %SERVER_ADDR%
)
)
)
echo Запускаем выгрузку базы в DT...
"C:\Program Files\1cv8\8.3.22.1709\bin\1cv8.exe" DESIGNER /S "localhost\MyBaseName" /N "%ADMIN_USER%" /P "%ADMIN_PASS%" /DumpIB "C:\Backup\base.dt" /Out "C:\Backup\log.txt" -NoTruncate
echo Снимаем блокировку с информационной базы...
rac infobase update --cluster=%CLUSTER_ID% --infobase=%IB_ID% --infobase-user=%ADMIN_USER% --infobase-pwd=%ADMIN_PASS% --scheduled-jobs-deny=off --sessions-deny=off %SERVER_ADDR%
Важно: Перед запуском этого скрипта убедитесь, что вы заменили идентификаторы CLUSTER_ID и IB_ID на реальные GUID вашего кластера и информационной базы. Получить их можно с помощью команды rac cluster list и rac infobase list.
Если на вашем сервере по каким-то причинам не настроена служба ras, для отключения сеансов фоновых заданий можно использовать прямое COM-подключение к агенту сервера 1С. Этот метод отлично интегрируется в сценарии автоматизации через запуск VBScript из CMD-файла.
Проанализируем пример скрипта на VBScript (назовем его kill_jobs.vbs), который находит все активные фоновые процессы и завершает их работу:
Dim Connector, Agent, Clusters, Cluster, Sessions, Session
Dim ServerName, BaseName, AdminUser, AdminPass
ServerName = "localhost"
BaseName = "MyBaseName"
AdminUser = "Admin"
AdminPass = "MyPassword"
Set Connector = CreateObject("V83.COMConnector")
Set Agent = Connector.ConnectAgent(ServerName)
Clusters = Agent.GetClusters()
' Подключаемся к первому кластеру на сервере
Set Cluster = Clusters(0)
Agent.Authenticate Cluster, "", ""
' Получаем список всех активных сессий в кластере
Sessions = Agent.GetInfoBaseSessions(Cluster)
For Each Session In Sessions
' Проверяем, относится ли сессия к нашей базе данных
If LCase(Session.InfoBase.Name) = LCase(BaseName) Then
' Фильтруем сессии по типу приложения
' "BackgroundJob" - фоновые задания, "SystemBackgroundJob" - системные фоновые задания
If Session.AppID = "BackgroundJob" Or Session.AppID = "SystemBackgroundJob" Then
Agent.TerminateSession Cluster, Session
End If
End If
Next
WScript.Echo "Все фоновые задания успешно завершены!"
Вызвать данный скрипт из вашего основного CMD-батника перед строкой выгрузки в .dt можно стандартной командой:
cscript //nologo C:\Scripts\kill_jobs.vbs
Это более радикальный, но исключительно надежный метод, который гарантирует 100% очистку всех зависших сессий и остановку регламентных процедур. Основная сложность здесь заключается в том, что стандартная команда sc stop выполняется асинхронно — скрипт продолжает работу, в то время как процессы rphost.exe и rmngr.exe все еще могут завершать работу в памяти и держать открытыми файлы кэша сеансов.
Рекомендуется использовать CMD-скрипт с циклом ожидания реального закрытия процессов 1С и последующей очисткой папки сеансовых данных snccntx. Разберем этот алгоритм по шагам:
@echo off
echo Останавливаем службу сервера 1С...
sc stop "1C:Enterprise 8.3 Server Agent (x86-64)"
echo Ожидаем полного завершения процессов rphost и rmngr...
:wait_processes
tasklist /fi "imagename eq rmngr.exe" | find /i "rmngr.exe" >nul
if %errorlevel%==0 (
timeout /t 2 /nobreak >nul
goto wait_processes
)
tasklist /fi "imagename eq rphost.exe" | find /i "rphost.exe" >nul
if %errorlevel%==0 (
timeout /t 2 /nobreak >nul
goto wait_processes
)
echo Процессы завершены. Очищаем кэш сеансовых данных (snccntx)...
:: Путь к папке srvinfo может отличаться в зависимости от ваших настроек установки
rd /s /q "C:\Program Files\1cv8\srvinfo\reg_1541\snccntx"
echo Запускаем службу сервера 1С...
sc start "1C:Enterprise 8.3 Server Agent (x86-64)"
echo Ожидаем инициализации службы (15 секунд)...
timeout /t 15 /nobreak >nul
echo Теперь запускаем выгрузку базы в DT...
"C:\Program Files\1cv8\8.3.22.1709\bin\1cv8.exe" DESIGNER /S "localhost\MyBaseName" /N "Admin" /P "MyPassword" /DumpIB "C:\Backup\base.dt" /Out "C:\Backup\log.txt" -NoTruncate
Этот способ идеален в тех случаях, когда кэш сеансов забивается, и фоновые задания начинают сбоить или "зависать", не реагируя на стандартные команды отмены. Для очистки сеансовых данных на сервере пригодится скрипт автоматической очистки серверного кэша 1С.
Если у вас есть возможность запустить сеанс под административными правами перед выгрузкой, либо вы хотите настроить регламентное задание внутри самой конфигурации, можно использовать объект платформы БлокировкаУстановкиСоединений. Это гарантирует, что новые фоновые процессы не запустятся, а пользователи получат соответствующее предупреждение.
Рассмотрим пример кода на встроенном языке 1С:
Блокировка = Новый БлокировкаУстановкиСоединений;
Блокировка.Начало = ТекущаяДата() + 60; // Блокировка начнется через 1 минуту
Блокировка.Конец = ТекущаяДата() + 1800; // Устанавливаем блокировку на 30 минут
Блокировка.КодРазрешения = "MySecretBackupKey";
Блокировка.Сообщение = "База временно заблокирована для проведения резервного копирования.";
Блокировка.Установлена = Истина;
УстановитьБлокировкуУстановкиСоединений(Блокировка);
Для того чтобы запустить конфигуратор для последующей выгрузки в .dt в обход установленной блокировки, в строке подключения обязательно нужно использовать параметр /UC "MySecretBackupKey". Пример строки выгрузки в таком случае:
1cv8.exe DESIGNER /S "localhost\MyBase" /N "Admin" /P "Pass" /UC "MySecretBackupKey" /DumpIB "C:\Backup\base.dt"
Помните, что если вы разворачиваете полученный .dt файл на тестовом сервере или локальном ПК для проверки, при первом же открытии базы платформа автоматически попытается запустить все регламентные задания (например, рассылку отчетов клиентам, синхронизацию с сайтом или банком). Это может привести к повреждению реальных рабочих данных во внешних системах.
Чтобы гарантированно запустить восстановленную из .dt базу в режиме Предприятия без старта фоновых заданий, используйте специальный ключ командной строки /AllowExecuteScheduledJobs -Off:
1cv8.exe ENTERPRISE /F "C:\Base\TestBase" /N "Admin" /P "Pass" /AllowExecuteScheduledJobs -Off
Мы детально изучили четыре основных подхода к решению проблемы фоновых заданий при автоматической выгрузке базы 1С. Для крупных промышленных систем наиболее безопасным и технологичным решением является использование связки RAC/RAS (Способ 1) или COM-соединения (Способ 2), так как они позволяют точечно управлять сеансами без прерывания работы всего сервера 1С. В небольших компаниях или при наличии проблем со стабильностью кэша сервера отличным решением станет скрипт с перезапуском службы и очисткой папки snccntx (Способ 3).