Массовое обновление информационных баз 1С без ручного запуска Конфигуратора

· 10 мин

Содержание

Несколько баз 1С обновляют одновременно скриптом: он по очереди запускает 1cv8.exe DESIGNER в пакетном режиме с ключами /UpdateCfg (загрузка файла обновления .cfu) и /UpdateDBCfg (обновление конфигурации базы данных), а затем открывает каждую базу в режиме Предприятия, чтобы отработали обработчики обновления. Для серверных баз перед этим через rac или консоль кластера включают блокировку сеансов.

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

Подготовка к массовому обновлению баз

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

Что собрать заранее:

  • 📋 Реестр баз. Путь к файловой базе (D:\Base\Buh_Romashka) или строка сервера (srv1c\buh_romashka), конфигурация, текущий релиз, учётная запись с правами администратора.
  • 📦 Файлы обновления. Каждый .cfu применим только к определённым предыдущим релизам. Если база отстала на несколько версий, нужна цепочка промежуточных обновлений, а не один последний файл.
  • 💾 Резервная копия каждой базы. Для файловой — копия каталога или выгрузка .dt, для серверной — бэкап средствами СУБД.
  • 🔧 Признак доработок. Типовую конфигурацию на поддержке скрипт обновит сам. Изменённую (включено редактирование, снята поддержка) — только через ручное сравнение и объединение.

Шаблоны обновлений после установки дистрибутива лежат в каталоге %APPDATA%\1C\1cv8\tmplts\1c\<конфигурация>\<релиз>\. Внутри — 1cv8.cfu для обновления и описание изменений 1cv8upd.htm. Отдельной штатной утилиты «массового обновления» в составе платформы нет: файл 1cv8upd — это заметки к релизу, а работу выполняет сам 1cv8.exe.

Чтобы шаблоны лежали в одном месте для всех администраторов, задайте общий каталог параметром ConfigurationTemplatesLocation в файле 1cestart.cfg. Скрипту так проще находить нужный .cfu.

Сгруппируйте базы по конфигурации и текущему релизу. Базы с одинаковым релизом обновляются одним файлом, отстающие — отдельной цепочкой.

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

Сначала отладьте команду на одной тестовой копии. Минимальный набор для файловой базы:

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" DESIGNER ^
  /F"D:\Base\Buh_Romashka" /N"Администратор" /P"пароль" ^
  /DisableStartupDialogs /DisableStartupMessages ^
  /UpdateCfg "D:\Upd\BP\1cv8.cfu" /UpdateDBCfg ^
  /Out "D:\Logs\Buh_Romashka.log" -NoTruncate ^
  /DumpResult "D:\Logs\Buh_Romashka.res"

Номер платформы в пути подставьте свой. Для серверной базы /F заменяют на /S"srv1c\buh_romashka".

КлючЧто делает
DESIGNERЗапуск Конфигуратора
/F или /SФайловая база или база на сервере
/N, /PПользователь и пароль базы
/UpdateCfg <файл>Обновляет конфигурацию на поддержке из .cf или .cfu
/UpdateDBCfgПрименяет изменения к конфигурации базы данных
/Out <файл>Пишет журнал сообщений; -NoTruncate дописывает, а не затирает
/DumpResult <файл>Записывает код результата: 0 — успех, 1 — ошибка
/DisableStartupDialogsПодавляет стартовые диалоги, чтобы запуск не завис
/UC <код>Код разрешения входа при заблокированных сеансах

Для резервной копии перед обновлением есть ключ /DumpIB "D:\Backup\Buh_Romashka.dt". Его удобно выполнять отдельным вызовом прямо перед /UpdateCfg.

Обновлению конфигурации базы данных нужен монопольный доступ. Если в базе кто-то работает, /UpdateDBCfg завершится ошибкой, а в журнале появится сообщение о невозможности установить монопольный режим.

Запуск обработчиков обновления

После /UpdateDBCfg структура базы уже новая, но данные ещё не переработаны. Типовые конфигурации на БСП запускают обработчики обновления при первом входе администратора в режиме Предприятия. В скрипте этот вход делают сами:

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" ENTERPRISE ^
  /F"D:\Base\Buh_Romashka" /N"Администратор" /P"пароль" ^
  /DisableStartupDialogs ^
  /C"ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы"

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

Скрипт: обновить несколько баз 1С за один запуск

Удобнее всего держать список баз в CSV, а цикл — в PowerShell. Он ждёт завершения каждого процесса и читает код результата.

Файл bases.csv:

Name;Conn;User;Cfu
Buh_Romashka;/F"D:\Base\Buh_Romashka";Администратор;D:\Upd\BP\1cv8.cfu
Buh_Vasilek;/F"D:\Base\Buh_Vasilek";Администратор;D:\Upd\BP\1cv8.cfu
Zup_Holding;/S"srv1c\zup_holding";Админ;D:\Upd\ZUP\1cv8.cfu

Скрипт update-bases.ps1:

$exe  = "C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe"
$logs = "D:\Logs\upd_" + (Get-Date -Format "yyyyMMdd_HHmm")
New-Item -ItemType Directory -Path $logs -Force | Out-Null
$pwd1c = $env:ONEC_PWD   # пароль берём из переменной окружения, не из файла

Import-Csv "D:\Upd\bases.csv" -Delimiter ";" | ForEach-Object {
    $log = Join-Path $logs "$($_.Name).log"
    $res = Join-Path $logs "$($_.Name).res"

    $argsDesigner = "DESIGNER $($_.Conn) /N""$($_.User)"" /P""$pwd1c"" " +
        "/DisableStartupDialogs /DisableStartupMessages " +
        "/UpdateCfg ""$($_.Cfu)"" /UpdateDBCfg /Out ""$log"" -NoTruncate /DumpResult ""$res"""
    Start-Process -FilePath $exe -ArgumentList $argsDesigner -Wait -NoNewWindow

    $code = (Get-Content $res -ErrorAction SilentlyContinue | Select-Object -First 1)
    if ($code -ne "0") {
        Write-Host "$($_.Name): ОШИБКА, см. $log" -ForegroundColor Red
        return
    }

    $argsEnt = "ENTERPRISE $($_.Conn) /N""$($_.User)"" /P""$pwd1c"" /DisableStartupDialogs " +
        "/C""ЗапуститьОбновлениеИнформационнойБазы;ЗавершитьРаботуСистемы"""
    Start-Process -FilePath $exe -ArgumentList $argsEnt -Wait -NoNewWindow
    Write-Host "$($_.Name): обновлена" -ForegroundColor Green
}

Что здесь сделано осознанно:

  1. Базы обновляются последовательно, а не параллельно. Для файловых баз на одном диске параллельный запуск упирается в диск и даёт мало выигрыша, а журнал становится нечитаемым.
  2. -Wait у Start-Process обязателен: без него скрипт запустит все Конфигураторы сразу.
  3. При ошибке база пропускается, а не обновляется дальше «вслепую». Режим Предприятия для неё не запускается.
  4. Пароль не хранится в CSV. Для учётных записей с аутентификацией ОС можно убрать /N и /P целиком.

Если PowerShell недоступен, тот же цикл пишется на .bat через for /f по текстовому списку и start /wait. Логика та же, но разбирать код результата неудобнее.

Перед боевым прогоном запустите скрипт на копиях двух-трёх баз из разных групп. Время обновления каждой запишите: так вы поймёте, уложится ли вся пачка в ночное окно.

Серверные базы: блокировка сеансов и обновление через кластер

С клиент-серверными базами главная проблема — пользователи и регламентные задания, которые держат сеансы. Монопольный режим не установится, пока в базе есть хоть одно соединение.

Порядок для каждой серверной базы:

  1. Включить блокировку начала сеансов и блокировку регламентных заданий, задать код разрешения.
  2. Завершить оставшиеся сеансы.
  3. Выполнить /UpdateCfg и /UpdateDBCfg с ключом /UC<код>.
  4. Запустить обработчики обновления в режиме Предприятия.
  5. Снять блокировки.

Вручную это делают в консоли кластера: свойства информационной базы → флажки «Блокировка начала сеансов включена» и «Блокировка регламентных заданий включена» → поле «Код разрешения». Для скрипта есть утилита rac, она работает через сервер администрирования ras (порт по умолчанию 1545):

rem сервер администрирования, если ещё не запущен как служба
ras cluster --daemon

rac cluster list
rac infobase summary list --cluster=<uuid-кластера>
rac infobase update --cluster=<uuid-кластера> --infobase=<uuid-базы> ^
  --infobase-user=Администратор --infobase-pwd=пароль ^
  --sessions-deny=on --scheduled-jobs-deny=on ^
  --denied-message="Обновление программы до 06:00" --permission-code=UPD7351
rac session list --cluster=<uuid-кластера> --infobase=<uuid-базы>
rac session terminate --cluster=<uuid-кластера> --session=<uuid-сеанса>

Если на кластере задан администратор, к каждой команде добавьте --cluster-user и --cluster-pwd. Полный список параметров — в справке rac help infobase и rac help session.

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

После обновления блокировку снимают той же командой rac infobase update с --sessions-deny=off --scheduled-jobs-deny=off.

Для типовых конфигураций на БСП есть и встроенный способ: в режиме Предприятия раздел Администрирование → Обслуживание содержит блокировку работы пользователей с кодом разрешения. Но для пакетного сценария через rac надёжнее: он не требует открывать каждую базу.

Ansible, PowerShell DSC и планировщик для нескольких серверов

Когда базы разбросаны по разным серверам или филиалам, скрипт из предыдущего раздела запускают не руками, а системой управления конфигурациями.

ИнструментКогда подходитНа что обратить внимание
Планировщик заданий WindowsОдин-два сервера, обновление по ночамЗадание запускать от пользователя с доступом к каталогам баз и логов
PowerShell Remoting (Invoke-Command)Несколько Windows-серверов в доменеСкрипт и CSV копировать на каждый сервер или читать из общей папки
PowerShell DSCНужно держать одинаковую версию платформы и шаблонов на всех серверахDSC хорошо описывает состояние «установлено», но разовое обновление баз проще запускать скриптом
Ansible (win_shell, win_copy)Смешанная инфраструктура, десятки серверов, Linux-серверы 1СНужен WinRM на Windows-хостах; результат каждого хоста собирать в общий журнал

Типовой сценарий с Ansible: первая задача копирует .cfu и CSV на хост, вторая запускает update-bases.ps1, третья забирает каталог логов на управляющую машину. Повторный запуск безопасен, если скрипт проверяет текущий релиз базы и пропускает уже обновлённые.

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

Тонкий клиент и веб-клиент после обновления баз

Обновление конфигурации пользователей почти не затрагивает. Тонкий клиент получит новую версию конфигурации при следующем входе — переустанавливать ничего не нужно. Веб-клиенту достаточно, чтобы пользователь перезашёл в базу; публикацию на веб-сервере переделывать не надо.

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

  • 🖥 Серверные базы. Версия тонкого клиента должна совпадать с версией сервера 1С. Клиент можно раздать централизованно: MSI-пакетом через групповые политики или тем же Ansible.
  • 🌐 Публикация на веб-сервере. Модуль расширения веб-сервера должен быть той же версии, что и сервер. После смены платформы публикацию обновляют и перезапускают службу веб-сервера.
  • 📁 Файловые базы. Платформу обновляют на всех рабочих местах, которые открывают базу, иначе старые клиенты не смогут к ней подключиться.

Перезапуск службы веб-сервера и сервера 1С обрывает все текущие сеансы. Планируйте его на то же ночное окно, что и обновление баз.

Список баз у пользователей удобно раздавать общим файлом: параметр CommonInfoBases в 1cestart.cfg указывает на .v8i в сетевой папке. Тогда переименование или перенос базы после обновления не требует обходить каждый компьютер.

Когда хватит встроенного обновления в самой программе

Скрипт оправдан, если баз много и они однотипны. Для трёх-пяти баз проще штатный мастер в каждой конфигурации на БСП: Администрирование → Интернет-поддержка и сервисы → Обновление версии программы. Он сам скачивает цепочку обновлений, делает резервную копию файловой базы и позволяет отложить установку на ночь.

Как обновлять ваши базы?

Ошибки пакетного обновления и что с ними делать

Первое, куда смотреть при сбое, — файл из /Out. Код в /DumpResult скажет только «получилось или нет», причину пишет журнал.

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

Ещё одна частая беда — платформа. Если в описании релиза указана минимальная версия платформы, а скрипт запускает 1cv8.exe более раннего номера, Конфигуратор откажется загружать обновление. Путь к исполняемому файлу в скрипте держите в одной переменной и меняйте её вместе с платформой на сервере.

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

Можно ли обновлять несколько баз 1С параллельно?
Можно, если они на разных серверах или дисках. Внутри одного сервера надёжнее последовательная очередь: параллельные обновления конкурируют за диск и память, а время экономят мало.
Сколько длится массовое обновление?
Зависит от размера баз и числа обработчиков. Небольшая файловая база обновляется за минуты, крупная серверная — до нескольких часов. Засеките время на копиях и планируйте окно с запасом.
Нужен ли пароль администратора каждой базы?
Да, пакетный запуск входит в базу от пользователя с правами администратора. Если у такого пользователя включена аутентификация ОС, а скрипт идёт от этой учётной записи Windows, ключи /N и /P можно не указывать.
Обновит ли скрипт базы, у которых нет интернет-поддержки?
Да. Скрипту нужен только файл .cfu на диске, доступ в интернет из базы не требуется. Файлы обновлений администратор скачивает заранее один раз на все базы.
Что делать, если одна база в пакете упала с ошибкой?
Восстановить её из резервной копии, сделанной перед запуском, разобрать журнал /Out и обновить отдельно. Остальные базы пакета при правильном скрипте не пострадают.