Skill v1.0.1
Automated scan100/100+1 new
version: "1.0.1" name: subsystem-update description: "Use for инициализации обновления подсистемы БСП: блокировка сеансов, запуск обработчиков обновления, проверка через ЖР и регистр ВерсииПодсистем."
Обновление подсистемы БСП
Когда применять
| Триггер | Действие | |
|---|---|---|
| Добавлен обработчик обновления с новой версией | Выполнить полный цикл обновления | |
| Нужно повторно запустить обработчик | Сбросить версию в регистре, затем полный цикл | |
| Обновление не сработало | Диагностика через ЖР |
Предусловия
- Обработчик зарегистрирован в модуле обновления подсистемы (например
ОбновлениеИнформационнойБазыXXX) - Модуль подсистемы зарегистрирован в
ИнтеграцияПодсистемБСП.ПриДобавленииПодсистем - Проект собран (
v8-runner build) — изменения в коде загружены в БД
Полный цикл обновления
Шаг 1. Проверить текущую версию
ВЫБРАТЬ ИмяПодсистемы, ВерсияИЗ РегистрСведений.ВерсииПодсистемГДЕ ИмяПодсистемы = "ИМЯ_ПОДСИСТЕМЫ"
БСП выполнит обработчик, только если версия в регистре < версии обработчика.
Шаг 2. Заблокировать базу
Обработчики с МонопольныйРежим = Истина требуют отсутствия других сеансов.
# Данные подключения: <project_root>/configs/yaxunit-runner.yml → app.connection# cluster_uuid и infobase_uuid: <project_root>/configs/cluster_map.yaml# Заблокировать новые сеансы и регламентные заданияrac infobase update \--cluster=<cluster_uuid> \--infobase=<infobase_uuid> \--infobase-user=<user> --infobase-pwd=<pwd> \--sessions-deny=on \--scheduled-jobs-deny=on \--denied-message="Обновление ИБ" \--permission-code=UpdateIB \<ras_host>:<ras_port># Завершить все оставшиеся сеансыrac session list --cluster=<cluster_uuid> --infobase=<infobase_uuid> <ras_host>:<ras_port># Для каждого сеанса:rac session terminate --cluster=<cluster_uuid> --session=<session_uuid> <ras_host>:<ras_port>
Шаг 3. Запустить обновление
/opt/1cv8/current/1cv8c ENTERPRISE \/S"<server>/<infobase>" \/N"<user>" /P"<password>" \/C"ЗапуститьОбновлениеИнформационнойБазы" \/UC"UpdateIB" \/DisableStartupDialogs
Параметр /UC"UpdateIB" — код разрешения, совпадающий с --permission-code из шага 2.
Ожидание: процесс завершится автоматически (30–120 сек в зависимости от объёма данных).
Шаг 4. Снять блокировку
rac infobase update \--cluster=<cluster_uuid> \--infobase=<infobase_uuid> \--infobase-user=<user> --infobase-pwd=<pwd> \--sessions-deny=off \--scheduled-jobs-deny=off \--denied-message="" \--permission-code="" \<ras_host>:<ras_port>
Шаг 5. Проверить результат
- Версия в регистре — должна обновиться до целевой:
ВЫБРАТЬ ИмяПодсистемы, ВерсияИЗ РегистрСведений.ВерсииПодсистемГДЕ ИмяПодсистемы = "ИМЯ_ПОДСИСТЕМЫ"
- ЖР — проверить ошибки за время обновления:
logc_get_event_log(level='Error', from=<время_запуска>)— не должно быть ошибокОбновление информационной базыlogc_get_event_log(level='Information', from=<время_запуска>)— искать записи вашего обработчика
Повторный запуск обработчика
Если обработчик уже выполнился (версия в регистре >= версии обработчика), БСП его пропустит.
Варианты повторного запуска:
- Увеличить версию обработчика (1.0.0.1 → 1.0.0.2) — рекомендуемый способ
- Сбросить версию в регистре через прямой SQL к СУБД — только для отладки
Типичные ошибки
| Ошибка | Причина | Решение | |
|---|---|---|---|
| Невозможно установить монопольный режим | Активные сеансы в базе | Шаг 2: заблокировать + завершить все сеансы | |
| Обновление уже выполняется | Зависший сеанс от предыдущей попытки | Завершить зависший сеанс через rac session terminate | |
| Метод объекта не обнаружен (ПередОбновлениемИнформационнойБазы) | Модуль подсистемы не содержит обязательных callback-процедур | Добавить 6 обязательных процедур-заглушек (см. шаблон ниже) | |
| Обработчик не вызвался (версия не изменилась) | Версия в регистре >= версии обработчика | Проверить текущую версию запросом, при необходимости увеличить | |
| Конфигурация обновлена, но обработчик не выполнился | Обработчик зарегистрирован дважды или не в той подсистеме | Проверить grep по имени процедуры во всех модулях |
Шаблон модуля обновления подсистемы
Минимальный набор обязательных процедур для модуля ОбновлениеИнформационнойБазыXXX:
#Область ПрограммныйИнтерфейс#Область ДляВызоваИзДругихПодсистем// СтандартныеПодсистемы.БазоваяФункциональностьПроцедура ПриДобавленииПодсистем(МодулиПодсистем) ЭкспортМодулиПодсистем.Добавить("ОбновлениеИнформационнойБазыXXX");КонецПроцедуры// СтандартныеПодсистемы.ОбновлениеВерсииИБПроцедура ПриДобавленииПодсистемы(Описание) ЭкспортОписание.Имя = "ИМЯ_ПОДСИСТЕМЫ";Описание.Версия = "1.0.0.1";Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы");КонецПроцедурыПроцедура ПриДобавленииОбработчиковОбновления(Обработчики) ЭкспортОбработчик = Обработчики.Добавить();Обработчик.Версия = "1.0.0.1";Обработчик.МонопольныйРежим = Истина;Обработчик.Процедура = "МодульОбработчика.ИмяПроцедуры";КонецПроцедуры//@skip-warningПроцедура ПередОбновлениемИнформационнойБазы() ЭкспортКонецПроцедуры//@skip-warningПроцедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсияИБ, Знач ТекущаяВерсияИБ,Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) ЭкспортКонецПроцедуры//@skip-warningПроцедура ПриПодготовкеМакетаОписанияОбновлений(Знач Макет) ЭкспортКонецПроцедуры//@skip-warningПроцедура ПриОпределенииРежимаОбновленияДанных(РежимОбновленияДанных, СтандартнаяОбработка) ЭкспортКонецПроцедуры//@skip-warningПроцедура ПриДобавленииОбработчиковПереходаСДругойПрограммы(Обработчики) ЭкспортКонецПроцедуры//@skip-warningПроцедура ПриЗавершенииПереходаСДругойПрограммы(Знач ПредыдущееИмяКонфигурации,Знач ПредыдущаяВерсияКонфигурации, Параметры) ЭкспортКонецПроцедуры#КонецОбласти#КонецОбласти
Регистрация в ИнтеграцияПодсистемБСП.ПриДобавленииПодсистем:
МодулиПодсистем.Добавить("ОбновлениеИнформационнойБазыXXX");
depends_on:
- framework/skills/tool-usage/platform-admin/rac-use/SKILL.md
requires:
- tools