Динамическое и пакетное обновление информационной базы 1С без ручной работы

· 9 мин

Содержание

Обновить базу 1С динамически — значит применить изменённую конфигурацию к базе данных, не выгоняя пользователей. В Конфигураторе это делает команда Конфигурация → Обновить конфигурацию базы данных при открытых сеансах, а в скриптах — ключ /UpdateDBCfg -Dynamic+ пакетного режима 1cv8.exe.

Работает это не всегда. Если изменения затрагивают структуру хранения данных (новые реквизиты, измерения регистров, новые объекты), платформа потребует монопольный доступ. Поэтому на практике автоматизация обновления — это связка: блокировка сеансов, пакетный запуск Конфигуратора, контроль кода возврата и лога.

Что умеет динамическое обновление и где его предел

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

Что обычно проходит динамически:

  • ✅ правки модулей, форм, макетов печатных форм;
  • ✅ изменение прав ролей и командного интерфейса;
  • ✅ правки, не требующие реструктуризации таблиц.

Что потребует монопольного режима:

  • ⛔ добавление или удаление реквизитов, табличных частей, измерений и ресурсов;
  • ⛔ создание новых объектов метаданных с хранимыми данными;
  • ⛔ изменение типов реквизитов, при котором меняется структура таблиц.

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

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

Сценарии автоматизации обновления

Выберите сценарий до того, как писать скрипт. От него зависит, нужна ли блокировка и когда запускать задание.

СценарийКогда подходитРиски
Динамическое обновление днёмПравка кода, форм, прав без изменения структурыСеансы на разных версиях, ошибки у тех, кто не перезашёл
Пакетное обновление ночьюНовые релизы типовых, изменения структурыНужна блокировка сеансов и фоновых заданий
Фоновое обновление (клиент-сервер)Большая база, долгая реструктуризацияФинальный этап всё равно монопольный, но короткий
Обновление из хранилищаКоманда разработки, тестовые и рабочие базыНужно следить, какая версия хранилища попала в базу

Фоновое обновление стоит отметить отдельно. В клиент-серверном варианте платформа умеет выполнять подготовку реструктуризации в фоне, пока пользователи работают. Монопольный доступ нужен только на финальном шаге принятия изменений. В пакетном режиме этим управляют параметры -BackgroundStart, -BackgroundFinish, -BackgroundCancel у ключа /UpdateDBCfg.

Ключи командной строки 1cv8 для обновления базы

Всё обновление можно выполнить без интерфейса: Конфигуратор запускается с ключом DESIGNER, делает работу и закрывается. Основные ключи:

КлючЧто делает
/F"путь"Файловая база в указанном каталоге
/S"сервер\база"Клиент-серверная база
/N"имя" /P"пароль"Пользователь с правами администратора
/UC"код"Код разрешения входа при заблокированных сеансах
/DisableStartupDialogsНе показывать диалоги при запуске
/Out"файл"Писать сообщения в лог-файл
/LoadCfg"файл.cf"Загрузить конфигурацию целиком из .cf
/UpdateCfg"файл.cfu"Обновить конфигурацию на поддержке файлом .cf или .cfu
/UpdateDBCfgПрименить конфигурацию к базе данных
-Dynamic+ / -Dynamic-Разрешить или запретить динамическое обновление
/DumpIB"файл.dt"Выгрузить базу в .dt перед обновлением

Порядок важен: сначала /UpdateCfg меняет основную конфигурацию, затем /UpdateDBCfg переносит её в конфигурацию базы данных. Оба ключа можно указать в одной строке.

Пример: cmd-скрипт для динамического обновления

Скрипт обновляет конфигурацию на поддержке и пытается применить её динамически. Если изменения требуют реструктуризации, обновление БД завершится ошибкой, и это будет видно в логе.

@echo off
set V8="C:\Program Files\1cv8\8.3.25.1374\bin\1cv8.exe"
set IB=/S"srv1c\buh"
set USR=/N"Обновление" /P"пароль"
set LOG=D:\1c_update\update_%date:~-4%%date:~3,2%%date:~0,2%.log

start "" /wait %V8% DESIGNER %IB% %USR% /DisableStartupDialogs ^
  /UpdateCfg "D:\1c_update\1Cv8.cfu" ^
  /UpdateDBCfg -Dynamic+ ^
  /Out "%LOG%" -NoTruncate

if %ERRORLEVEL% NEQ 0 (
  echo Обновление завершилось с ошибкой, смотрите %LOG%
  exit /b 1
)
echo Готово

💡 start "" /wait нужен обязательно. Без него 1cv8.exe вернёт управление сразу, и проверка ERRORLEVEL ничего не скажет. Номер платформы в пути замените на свой.

Пароль в открытом виде в bat-файле — плохая идея. Заведите отдельного пользователя только для обновления, ограничьте доступ к папке со скриптом, а лучше передавайте пароль из хранилища секретов планировщика.

Утилита V8Update, OneScript и другие готовые решения

Писать свой скрипт не обязательно. Есть бесплатные инструменты, которые уже умеют блокировать сеансы, делать копию и обновлять цепочку релизов.

  • 🔧 V8Update — популярный бесплатный пакетный скрипт для админов. Список баз и файлов обновления задаётся в конфигурационном файле, скрипт сам по очереди запускает Конфигуратор, пишет лог и умеет делать выгрузку перед обновлением. Удобен, когда баз десяток и все типовые.
  • 🔧 OneScript + vanessa-runner — инструмент из мира CI/CD. Обновление из .cf, из хранилища, запуск обработчиков обновления — всё одной командой. Список команд выводит vrunner help.
  • 🔧 Механизм обновления в самих типовых — обработка обновления программы из режима Предприятие (о ней ниже).

Готовые утилиты выигрывают в обработке краевых случаев: зависший процесс, база уже заблокирована, нужен промежуточный релиз. Свой скрипт выигрывает в прозрачности: вы точно знаете, что он делает.

Скрипт PowerShell: блокировка сеансов, обновление, проверка

Для клиент-серверной базы надёжный ночной сценарий выглядит так: запретить новые сеансы, выгнать открытые, обновить, снять запрет. Блокировку ставим через rac — утилиту администрирования кластера, которая ходит в сервер администрирования ras.

Завершение сеансов обрывает работу пользователей без сохранения. Запускайте скрипт в нерабочее время и заранее предупредите людей. Сообщение о блокировке увидят те, кто попробует войти.

$rac   = "C:\Program Files\1cv8\8.3.25.1374\bin\rac.exe"
$v8    = "C:\Program Files\1cv8\8.3.25.1374\bin\1cv8.exe"
$ras   = "srv1c:1545"
$code  = "upd2026"
$ibUser = "Обновление"; $ibPwd = "пароль"

# 1. Кластер и база
$cluster = ((& $rac cluster list $ras | Select-String '^cluster\s+:') -split ':\s+')[1].Trim()
$ibName  = "buh"
$ib = $null; $cur = $null
foreach ($line in (& $rac infobase summary list --cluster=$cluster $ras)) {
    if ($line -match '^infobase\s+:\s+(\S+)') { $cur = $Matches[1] }
    if ($line -match '^name\s+:\s+(\S+)' -and $Matches[1] -eq $ibName) { $ib = $cur }
}
if (-not $ib) { Write-Error "База $ibName не найдена в кластере"; exit 1 }

# 2. Запрет входа и регламентных заданий
& $rac infobase update --cluster=$cluster --infobase=$ib `
    --infobase-user=$ibUser --infobase-pwd=$ibPwd `
    --sessions-deny=on --scheduled-jobs-deny=on `
    --denied-message="Идёт обновление 1С" --permission-code=$code $ras

# 3. Завершение открытых сеансов этой базы
$sessions = & $rac session list --cluster=$cluster --infobase=$ib $ras |
    Select-String '^session\s+:' | ForEach-Object { ($_ -split ':\s+')[1].Trim() }
foreach ($s in $sessions) { & $rac session terminate --cluster=$cluster --session=$s $ras }

# 4. Обновление
$argList = @('DESIGNER','/S"srv1c\buh"',"/N`"$ibUser`"","/P`"$ibPwd`"","/UC`"$code`"",
          '/DisableStartupDialogs','/UpdateCfg"D:\1c_update\1Cv8.cfu"',
          '/UpdateDBCfg','/Out"D:\1c_update\update.log"')
$p = Start-Process -FilePath $v8 -ArgumentList $argList -Wait -PassThru

# 5. Снятие блокировки
& $rac infobase update --cluster=$cluster --infobase=$ib `
    --infobase-user=$ibUser --infobase-pwd=$ibPwd `
    --sessions-deny=off --scheduled-jobs-deny=off $ras

if ($p.ExitCode -ne 0) { Write-Error "Ошибка обновления, код $($p.ExitCode)"; exit 1 }

Перед запуском проверьте, что служба ras работает на сервере и порт 1545 доступен с машины, где выполняется скрипт. Точные параметры своей версии rac смотрите в rac help infobase и rac help session.

Где здесь WMI

WMI (в PowerShell — командлеты Get-CimInstance) пригодится для контроля, а не для самого обновления:

  • 🔍 найти зависший Конфигуратор после прошлого запуска: Get-CimInstance Win32_Process -Filter "Name='1cv8.exe'" и посмотреть CommandLine;
  • 🔍 проверить, что служба агента сервера запущена: Get-Service по имени службы 1С;
  • 🔍 запустить скрипт удалённо на сервере через Invoke-Command.

Альтернатива rac — COM-объект V83.COMConnector: через ConnectAgent("tcp://srv1c:1540") можно получить кластеры, сеансы и завершить их из PowerShell. Он требует регистрации comcntr.dll той же разрядности, что и PowerShell, поэтому rac обычно проще.

Обновление из режима Предприятие: штатная обработка и внешние обработки

Типовые конфигурации на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11 и другие) умеют обновляться без Конфигуратора. В БП 3.0 путь такой: Администрирование → Обслуживание → Обновление версии программы → Обновление программы. Обработка сама скачивает релиз через интернет -поддержку или берёт файл с диска, предлагает выгнать пользователей, делает резервную копию и запускает Конфигуратор в пакетном режиме.

У этого способа два плюса:

  • обработка сама строит цепочку промежуточных релизов;
  • после обновления она запускает обработчики обновления данных.

Минус — нужен интерактивный запуск администратором. Для автоматизации в скрипт добавляют второй шаг: запуск Предприятия с параметром, который выполняет обработчики обновления и закрывает программу:

start "" /wait %V8% ENTERPRISE %IB% %USR% /UC"upd2026" ^
  /DisableStartupDialogs /C"ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы"

Без этого шага первый пользователь утром получит окно «обновление версии программы» и будет ждать несколько минут, пока отработают обработчики. Если у него нет прав администратора, он вообще не войдёт.

Внешние обработки «обновить базу одной кнопкой» встречаются в виде самописных решений. Внутри они делают то же самое: запускают 1cv8.exe в пакетном режиме через ЗапуститьПриложение или COM. Если обработка от неизвестного автора — проверьте код перед запуском: она работает под вашими правами администратора.

Как узнать в коде, что конфигурация обновилась динамически

Для своих доработок полезна функция КонфигурацияБазыДанныхИзмененаДинамически(). Её можно проверять в обработчике ожидания и предлагать пользователю перезапуск:

&НаКлиенте
Процедура ПроверитьОбновлениеКонфигурации() Экспорт
    Если КонфигурацияБазыДанныхИзмененаДинамически() Тогда
        ОтключитьОбработчикОжидания("ПроверитьОбновлениеКонфигурации");
        ПоказатьПредупреждение(, "Программа обновлена. Перезапустите 1С, чтобы получить изменения.");
    КонецЕсли;
КонецПроцедуры

В типовых конфигурациях на БСП такая проверка уже встроена.

Версии платформы и релизов: где ломается автоматизация

Скрипт, который месяц работал, однажды падает. Чаще всего причина в версиях, а не в коде скрипта.

Цепочка релизов. Файл .cfu обновляет только с определённых предыдущих версий. Если база отстала на несколько релизов, придётся ставить промежуточные по очереди. Список допустимых версий указан в описании обновления. Скрипт должен знать нужную цепочку или брать её из каталога шаблонов %APPDATA%\1C\1cv8\tmplts.

Минимальная версия платформы. Новый релиз типовой часто требует платформу с номером не ниже определённого. На старой платформе /UpdateCfg завершится ошибкой. Обновляйте платформу на сервере и клиентах до обновления конфигурации.

Совпадение версий клиента и сервера. В клиент-серверном варианте версия 1cv8.exe, из которого запускается скрипт, должна совпадать с версией сервера 1С. После обновления сервера путь в скрипте с номером платформы нужно поменять.

Поддержка и доработки. Если конфигурация снята с поддержки или объекты изменены, пакетное /UpdateCfg может остановиться на сравнении-объединении. Такие базы автоматически не обновляют: сначала разбор изменений вручную, затем автоматизация для следующих релизов.

Диагностика: выберите симптом

Частые вопросы

Можно ли динамически обновить файловую базу?
Технически да, ключ -Dynamic+ работает и для файловой базы. Но при открытых сеансах ограничения те же: изменения структуры требуют монопольного доступа. Фоновое обновление доступно только в клиент-серверном варианте.
Нужно ли делать выгрузку .dt перед каждым ночным обновлением?
Для файловой базы — да, это самый простой откат. Для клиент-серверной надёжнее резервная копия средствами СУБД: она быстрее и не требует монопольного режима.
Что будет с пользователем, который не перезашёл после динамического обновления?
Он продолжит работать со старой версией кода и форм. Новые объекты и правки он не увидит, а при обращении к изменённым данным могут возникать ошибки. Перезапуск сеанса решает проблему.
Можно ли обновлять несколько баз одним скриптом параллельно?
Можно, но Конфигуратор в пакетном режиме потребляет много памяти. На сервере со скромными ресурсами надёжнее обновлять базы последовательно.
Чем /LoadCfg отличается от /UpdateCfg?
/LoadCfg заменяет конфигурацию целиком содержимым файла .cf, ваши доработки при этом пропадают. /UpdateCfg обновляет конфигурацию на поддержке с учётом её настроек.