В этой статье я поделюсь решением, которое использую для автоматического создания резервных копий информационных баз «1С:Предприятие» в клиент-серверном режиме. Я расскажу, как запустить службу RAS, как работает мой PowerShell-скрипт, и почему я вынес все настройки в обычный bat-файл.
Все скрипты, которые вы увидите ниже, были разработаны с помощью DeepSeek. Все компоненты проверены на реальном сервере, и я пошагово покажу путь от запуска RAS до получения dt-файлов с ротацией.
1. Вступление и постановка задачи
Передо мной стояла задача организовать регулярное резервное копирование нескольких баз 1С, развёрнутых на одном сервере. Я выбрал штатный механизм выгрузки в *.dt через конфигуратор. Требовалось:
- автоматически, по расписанию, создавать dt‑файлы для каждой базы;
- блокировать сеансы пользователей перед выгрузкой;
- поддерживать ротацию — хранить только последние N копий;
- работать с кодом разрешения блокировки (permission code);
- сделать решение легко переносимым на несколько серверов.
В результате был сгенерирован PowerShell-скрипт, который выполняет всю логику, а параметры для каждого сервера задаются в bat‑файле. Ключевыми элементами стали служба RAS и утилита rac.exe.
2. Для чего нужна служба RAS
RAS (Remote Administration Server) — это компонент сервера 1С, предоставляющий интерфейс для удалённого администрирования кластера. Именно к нему обращается rac.exe, когда нужно получить список кластеров, баз, управлять блокировками и сеансами. Если служба RAS не запущена, автоматизация через rac.exe невозможна. Поэтому начинаю с того, что настраиваю и запускаю RAS на том же хосте, где работает агент сервера 1С. В моём примере агент слушает порт 1540, а RAS — 1545.
3. Запуск службы RAS
Этот bat-файл, который формирует команду запуска, пересоздаёт службу Windows и стартует её. Вот он:
@echo off
:: ============================================
:: Настройки
:: ============================================
:: Версия платформы
set Ver1C=8.3.27.1936
:: Путь к bin (добавлен обратный слеш)
set BinDir=C:\Program Files\1cv8\%Ver1C%\bin
:: Пользователь службы
set SrvUserName=.\USR1CV8
set SrvUserPwd=123mypass
:: Порты
set CtrlPort=1540
set RASPort=1545
set MonitorPort=1555
:: Агент на этой же машине
set AgentName=localhost
:: Имя службы (с пробелами – будем кавычить везде)
set SrvcName=1C:Enterprise 8.3 Remote Server %CtrlPort% %Ver1C%
:: ============================================
:: Формирование команды запуска
:: ============================================
:: Экранируем путь к ras.exe (он содержит пробелы) и все аргументы
set "BinPath=\"%BinDir%\ras.exe\" cluster --service --port=%RASPort% %AgentName%:%CtrlPort% --monitor-port=%MonitorPort%"
:: ============================================
:: Пересоздание службы
:: ============================================
echo Stopping old service...
sc stop "%SrvcName%" 2>nul
echo Deleting old service...
sc delete "%SrvcName%" 2>nul
timeout /t 2 >nul
echo Creating new service...
sc create "%SrvcName%" binPath= "%BinPath%" start= auto obj= "%SrvUserName%" password= %SrvUserPwd% DisplayName= "%SrvcName%"
echo Starting service...
sc start "%SrvcName%"
echo.
echo ===== DONE =====
pause
Запускаю его с правами администратора, предварительно подставив свои значения версии платформы, учётной записи и портов. После этого служба работает постоянно, обеспечивая доступ для rac.exe.
4. Архитектура bat + ps1 и алгоритм резервного копирования
4.1. Почему я разделил bat и PowerShell
Скрипт на PowerShell (backup_1c.ps1) содержит всю логику: поиск кластера, блокировку, выгрузку, ротацию. Все параметры (сервер, список баз, учётные данные, путь к rac.exe и т.д.) он принимает через аргументы командной строки. Чтобы не редактировать длинный ps1-файл для каждого сервера, был создан bat-файл, в котором задаются переменные и вызывается PowerShell. Такой подход даёт мне ряд преимуществ:
- Один и тот же backup_1c.ps1 использую для любого количества серверов — достаточно создать bat с нужными настройками.
- Все параметры собраны в одном месте, их легко менять.
- Планировщик задач Windows запускает bat-файл без лишних сложностей.
4.2. Как работает скрипт
1. Скрипт подключается к RAS и определяет GUID кластера по порту агента (например, 1541). RAS-порт вычисляется автоматически: clusterPort + 4.
2. Для каждой базы из списка, разделённого запятыми:
- ищется GUID базы в кластере;
- проверяется свободное место на диске (оценка делается по размеру предыдущего dt‑файла, а для новой базы резервируется 3 ГБ);
- включается блокировка сеансов с заданным кодом разрешения (регламентные задания тоже приостанавливаются);
- все активные сессии принудительно завершаются;
- через 1cv8.exe DESIGNER с ключом /UC и кодом разрешения выполняется выгрузка dt‑файла;
- блокировка снимается;
- старые dt‑файлы удаляются, остаётся только заданное в KEEP_COUNT количество последних копий.
3. Все действия протоколируются в backup.log, который лежит в папке с бэкапами.
Код разрешения — это пароль, который задаётся при настройке блокировки. Пользователи, знающие его, могут войти в заблокированную базу (например, я, чтобы сделать выгрузку). В скрипте этот код используется и для блокировки, и для снятия, и в ключе /UC.
5. Полный код моего решения
Оба файла сгенерированы с помощью DeepSeek. Ниже привожу их полностью.
5.1. PowerShell-скрипт backup_1c.ps1
Его можно посмотреть, скачав от сюда:
ибо Дзен сильно искривляет отступы в коде, читать код неудобно.
5.2. Bat-файл для запуска
@echo off
setlocal EnableExtensions
:: ========== SETTINGS ==========
set ONEC_SERVER=localhost:1541
set BACKUP_PATH=D:\1C_Backups
set KEEP_COUNT=5
set IB_USER=backup
set IB_PASS=123mypass
set BASES=test-buh,zup-test,buhtest1
set RAC_PATH=C:\Program Files\1cv8\8.3.27.1936\bin\rac.exe
set PERMISSION_CODE=12345679
:: ==============================
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0backup_1c.ps1" ^
-OneCServer "%ONEC_SERVER%" ^
-Bases "%BASES%" ^
-BackupPath "%BACKUP_PATH%" ^
-KeepCount %KEEP_COUNT% ^
-InfobaseUser "%IB_USER%" ^
-InfobasePassword "%IB_PASS%" ^
-RacPath "%RAC_PATH%" ^
-PermissionCode "%PERMISSION_CODE%"
Поясню, что задаётся в bat-файле:
- ONEC_SERVER — адрес агента сервера 1С в формате хост:порт. Именно этот порт (1541) используется для поиска кластера, а порт RAS вычисляется как порт + 4 (т.е. 1545).
- BASES — имена баз в кластере, разделённые запятыми.
- BACKUP_PATH — каталог для бэкапов и лога.
- KEEP_COUNT — сколько последних копий оставлять.
- IB_USER и IB_PASS — учётная запись с правами администратора базы для выполнения выгрузки.
- RAC_PATH — полный путь к rac.exe, должен соответствовать версии платформы на сервере.
- PERMISSION_CODE — код разрешения блокировки, который я установил. Он же используется в /UC при запуске конфигуратора.
6. Как я развернул и запустил всё по расписанию
- Сначала запустил bat-файл для создания службы RAS и убедился, что она работает.
- Создал папку C:\1C_Backup_Scripts, поместил туда backup_1c.ps1 и run_backup.bat. Они должны лежать вместе в одном каталоге.
- Убедился, что учётная запись, от которой работает планировщик, имеет доступ к rac.exe, право на выполнение PowerShell и запись в D:\1C_Backups.
- В планировщике Windows создал задачу: запуск cmd.exe /c "C:\1C_Backup_Scripts\run_backup.bat" с ежедневным расписанием (например, в 2:00 ночи).
- Для другого сервера 1С я просто сделал копию bat-файла, исправил в нём параметры ONEC_SERVER, RAC_PATH, BASES и т.д., а ps1-скрипт остался тем же.
7. Заключение
Описанный подход проверил и начал использовать в реальной работе. Ключевые преимущества, которые я для себя выделил:
- Полная автоматизация с корректной блокировкой и завершением сессий.
- Единый PowerShell-скрипт, не требующий правок при добавлении новых серверов — все настройки вынесены в bat-файлы.
- Безопасная работа с блокировками благодаря коду разрешения: база выгружается, когда она закрыта для обычных пользователей.
- Ротация копий не даёт бесконтрольно расти занимаемому месту.
- Подробный лог помогает быстро найти причину, если что-то пошло не так.
Донаты принимаются на кошельки:
Yoomoney:
4100118091867315
Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077
Карта Альфа-Банк:
2200 1539 1357 2013