Динамическое и пакетное обновление информационной базы 1С без ручной работы
Содержание
Обновить базу
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 может остановиться на сравнении-объединении. Такие базы автоматически не обновляют: сначала разбор изменений вручную, затем автоматизация для следующих релизов.