В процессе активной разработки и сопровождения самописных или значительно измененных конфигураций 1С встает задача регулярного обновления рабочей базы. Выполнять эту процедуру вручную в конце каждого рабочего дня крайне неэффективно: программисту или администратору приходится задерживаться на работе, вручную выгонять пользователей, блокировать регламентные задания, делать резервные копии и запускать обновление конфигурации базы данных. Чтобы решить эту проблему, рассмотрим проверенные методы автоматизации процесса ночного обновления рабочей базы данных без участия человека.
Мы разберем как классический подход с использованием командных файлов (скриптов командной строки) и планировщика задач Windows, так и более современные стандарты автоматизации сборки и доставки изменений (CI/CD) на базе Jenkins, OneScript и специализированных библиотек.
Если в компании используется классическая схема разработки, когда программисты ведут работу в Хранилище конфигурации 1С, ночное обновление рабочей базы можно полностью автоматизировать с помощью стандартного командного интерфейса платформы 1С:Предприятие. Рассмотрим подробный пример скрипта автоматизации.
Для корректной и безопасной работы нам понадобятся следующие параметры командной строки конфигуратора 1С:
CONFIG — запуск системы 1С в режиме конфигуратора./S — адрес базы данных на сервере 1С:Предприятия./N и /P — имя пользователя и пароль администратора базы 1С с правами на обновление./DisableStartupMessages — подавление всех предупреждающих и диалоговых окон при запуске 1С./ConfigurationRepositoryF — путь к каталогу Хранилища конфигурации (сетевой или локальный путь)./ConfigurationRepositoryN и /ConfigurationRepositoryP — имя пользователя и пароль администратора в самом Хранилище./ConfigurationRepositoryUpdateCfg — команда получения последних изменений из Хранилища и их наката на основную конфигурацию. Ключ -force позволяет игнорировать возможные предупреждения платформы./UpdateDBCfg — обновление конфигурации базы данных (применение изменений на уровне СУБД)./UC — код разрешения для обхода блокировки базы данных (позволяет конфигуратору войти в базу, когда для обычных пользователей она заблокирована)./DumpResult — путь к файлу, в который запишется код результата выполнения операции (0 в случае успеха)./Out — путь к файлу лога, куда перенаправляется весь консольный вывод 1С.Проанализируем пример готового bat-файла, который можно запускать по расписанию через Планировщик задач Windows (Task Scheduler) в 2:00 ночи:
@echo off
chcp 1251 > nul
set BIN_PATH="C:\Program Files\1cv8\8.3.21.1622\bin\1cv8.exe"
set CONNECTION_STR="SERVER-1C\WorkBase"
set ADMIN_USER="UpdateAdmin"
set ADMIN_PASS="SuperSecurePassword123"
set CODE_LOCK="NightUpdateCode"
set REPO_PATH="\\BackupServer\1c_repository\OurCustomApp"
set REPO_USER="RepoAdmin"
set REPO_PASS="RepoPassword789"
set LOG_DIR=C:\1C_Logs\Updates
if not exist %LOG_DIR% mkdir %LOG_DIR%
set LOG_FILE="%LOG_DIR%\update_%date%.log"
set RESULT_FILE="%LOG_DIR%\result_%date%.txt"
echo [%time%] Начало процесса обновления... >> %LOG_FILE%
rem Запуск обновления конфигурации из хранилища и обновление БД
%BIN_PATH% CONFIG /S %CONNECTION_STR% /N %ADMIN_USER% /P %ADMIN_PASS% /DisableStartupMessages /ConfigurationRepositoryF %REPO_PATH% /ConfigurationRepositoryN %REPO_USER% /ConfigurationRepositoryP %REPO_PASS% /ConfigurationRepositoryUpdateCfg -force /UpdateDBCfg /UC%CODE_LOCK% /DumpResult %RESULT_FILE% /Out %LOG_FILE%
rem Проверка результата работы
if exist %RESULT_FILE% (
set /p RES_CODE=<%RESULT_FILE%
if "%RES_CODE%"=="0" (
echo [%time%] Обновление успешно применено. >> %LOG_FILE%
) else (
echo [%time%] Ошибка обновления! Код ошибки: %RES_CODE% >> %LOG_FILE%
)
) else (
echo [%time%] Не удалось получить файл результатов обновления! >> %LOG_FILE%
)
echo [%time%] Завершение процесса обновления. >> %LOG_FILE%
При использовании этого скрипта крайне важно предварительно выгнать всех пользователей из базы данных и установить блокировку соединений. Иначе конфигуратор вернет ошибку монопольного доступа и обновление завершится неудачей.
Простое аварийное завершение процессов пользователей через команду операционной системы (например, taskkill) может привести к повреждению файловой базы данных или некорректному прерыванию активных транзакций в СУБД. Рекомендуется использовать штатные механизмы платформы 1С.
Разберем по шагам, как правильно заблокировать базу данных перед ночным накатом конфигурации:
ПараметрыБлокировкиСеансов. При этом у пользователей на экранах появится предупреждение, система даст им штатно сохранить данные и закроет клиентские сеансы.rac.exe, поставляемая вместе с платформой 1С. С ее помощью перед обновлением мы можем программно установить блокировку базы данных и принудительно завершить все зависшие сеансы.Рассмотрим пример PowerShell-скрипта, который отключает сеансы пользователей и устанавливает блокировку новых подключений с кодом разрешения:
# Переменные администрирования кластера
$ClusterServer = "localhost"
$ClusterPort = "1545"
$BaseName = "WorkBase"
$LockCode = "NightUpdateCode"
$ClusterAdminUser = "ClusterAdmin"
$ClusterAdminPass = "ClusterAdminPass"
# Путь к утилите rac.exe
$RacPath = "C:\Program Files\1cv8\8.3.21.1622\bin\rac.exe"
# 1. Подключаемся к кластеру и получаем идентификаторы
# В реальном сценарии может потребоваться авторизация в кластере
& $RacPath cluster list "$($ClusterServer):$($ClusterPort)"
# Допустим, мы знаем ID кластера и ID информационной базы. Установим блокировку новых сеансов:
& $RacPath infobase update --cluster=<ID_Кластера> --infobase=<ID_Базы> --infobase-user=$ClusterAdminUser --infobase-pwd=$ClusterAdminPass --sessions-deny=on --start-service-from=(Get-Date).AddMinutes(1).ToString("yyyy-MM-ddTHH:mm:ss") --denied-message="База находится на обслуживании. Попробуйте войти позже." --permission-code=$LockCode "$($ClusterServer):$($ClusterPort)"
# 2. Принудительно завершаем активные сеансы пользователей
$Sessions = & $RacPath session list --cluster=<ID_Кластера> --infobase=<ID_Базы> "$($ClusterServer):$($ClusterPort)"
# (В цикле разбираем вывод утилиты и завершаем сеансы с помощью команды session terminate)
В крупных командах разработки bat-скрипты быстро становятся неуправляемыми. Современный стандарт автоматизации ночных сборок и обновлений строится на базе DevOps-инструментов. В качестве сервера автоматизации используется Jenkins (или GitLab CI), а вместо стандартного командного интерпретатора Windows применяется кроссплатформенный скриптовый движок OneScript (oscript).
В экосистеме OneScript разработаны готовые проверенные библиотеки, которые делают процесс ночного обновления надежным и легко читаемым:
Выясним преимущества такого подхода:
.cf непосредственно из исходных кодов в репозитории Git перед накатом на рабочую базу.Рассмотрим, как выглядит концептуальный сценарий шагов (Pipeline) в Jenkins для ночного обновления:
Deployka или вызовов RAC база переводится в монопольный режим. Устанавливается код разрешения /UC..cf из ветки master в Git)./C ЗапуститьОбновлениеИнформационнойБазы для выполнения отложенных обработчиков БСП (это очень важно, чтобы пользователи утром не ждали выполнения длительных процедур миграции данных при входе в программу).Использование связки автоматизированного развертывания позволяет минимизировать человеческий фактор, гарантировать наличие свежих резервных копий перед каждым обновлением и обеспечить стабильную работоспособность системы к началу рабочего дня.