Как настроить автоматическое ночное обновление самописной конфигурации 1С?

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

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

Мы разберем как классический подход с использованием командных файлов (скриптов командной строки) и планировщика задач Windows, так и более современные стандарты автоматизации сборки и доставки изменений (CI/CD) на базе Jenkins, OneScript и специализированных библиотек.

Решение 1. Классический сценарий обновления через bat-файл и Хранилище конфигурации

Если в компании используется классическая схема разработки, когда программисты ведут работу в Хранилище конфигурации 1С, ночное обновление рабочей базы можно полностью автоматизировать с помощью стандартного командного интерфейса платформы 1С:Предприятие. Рассмотрим подробный пример скрипта автоматизации.

Для корректной и безопасной работы нам понадобятся следующие параметры командной строки конфигуратора 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%

При использовании этого скрипта крайне важно предварительно выгнать всех пользователей из базы данных и установить блокировку соединений. Иначе конфигуратор вернет ошибку монопольного доступа и обновление завершится неудачей.

Решение 2. Корректное отключение пользователей и блокировка соединений через БСП и RAS/RAC

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

Разберем по шагам, как правильно заблокировать базу данных перед ночным накатом конфигурации:

  1. Использование Библиотеки стандартных подсистем (БСП): Если ваша самописная конфигурация использует БСП, вы можете задействовать функционал подсистемы "Завершение работы пользователей". Программно создается запись в регистре сведений ПараметрыБлокировкиСеансов. При этом у пользователей на экранах появится предупреждение, система даст им штатно сохранить данные и закроет клиентские сеансы.
  2. Использование утилиты RAC/RAS: Для серверных баз наиболее надежным инструментом администрирования является консольная утилита 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)

Решение 3. Современный DevOps-подход: Использование Jenkins и OneScript

В крупных командах разработки bat-скрипты быстро становятся неуправляемыми. Современный стандарт автоматизации ночных сборок и обновлений строится на базе DevOps-инструментов. В качестве сервера автоматизации используется Jenkins (или GitLab CI), а вместо стандартного командного интерпретатора Windows применяется кроссплатформенный скриптовый движок OneScript (oscript).

В экосистеме OneScript разработаны готовые проверенные библиотеки, которые делают процесс ночного обновления надежным и легко читаемым:

Выясним преимущества такого подхода:

Рассмотрим, как выглядит концептуальный сценарий шагов (Pipeline) в Jenkins для ночного обновления:

  1. Триггер запуска: Задача стартует автоматически по расписанию в 3:00 ночи.
  2. Резервное копирование: Скрипт на базе PowerShell или СУБД делает бэкап SQL-базы.
  3. Блокировка базы: С помощью библиотеки Deployka или вызовов RAC база переводится в монопольный режим. Устанавливается код разрешения /UC.
  4. Получение новой версии: Извлекается последняя версия конфигурации из Хранилища 1С (или собирается свежий .cf из ветки master в Git).
  5. Обновление конфигурации: Конфигуратор натывает изменения и обновляет конфигурацию базы данных.
  6. Запуск в режиме Предприятия: Производится технологический запуск базы 1С с ключом /C ЗапуститьОбновлениеИнформационнойБазы для выполнения отложенных обработчиков БСП (это очень важно, чтобы пользователи утром не ждали выполнения длительных процедур миграции данных при входе в программу).
  7. Снятие блокировки: База разблокируется, доступ открывается для пользователей.
  8. Отправка отчета: Jenkins формирует статус выполнения и отправляет лог разработчикам.

Использование связки автоматизированного развертывания позволяет минимизировать человеческий фактор, гарантировать наличие свежих резервных копий перед каждым обновлением и обеспечить стабильную работоспособность системы к началу рабочего дня.

← На главную