From 057c1044d99795199d18b7b16e84ea3f5bc21f23 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 4 Sep 2026 19:35:17 +0300 Subject: [PATCH] =?UTF-8?q?fix(db-update):=20-Dynamic=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1=82=20on/off=20=E2=80=94=20?= =?UTF-8?q?=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20"-"=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D1=81=D0=B5=D1=80=20PowerShell=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=81=D0=B2=D1=8F=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Документированная форма -Dynamic <+/-> работала наполовину: `-Dynamic "+"` через powershell.exe -File связывается, а `-Dynamic "-"` парсер не связывает вовсе — процесс выходит с кодом 2, не напечатав ни строки, и до скрипта управление не доходит. То есть «отключить динамическое обновление» из навыка было недостижимо, и притом молча. Склеенная форма из примера SKILL.md (-Dynamic+) — тоже ошибка разбора. В .py-порте все формы связывались, так что расхождение было ещё и между портами. Каноническая форма теперь словесная: -Dynamic on / off. "+"/"-" и yes/no принимаются для совместимости, но в инструкции не значатся. Значение нормализуется сразу после разбора, обе ветки (1cv8 -Dynamic+/-, ibcmd --dynamic=auto/disable) получают прежний вход. Кейсы dynamic-on / dynamic-off фиксируют, что именно уходит платформе; на прежнем скрипте dynamic-off падает. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01QoAJmoNbgWKobA7JGgN5S3 --- .claude/skills/db-update/SKILL.md | 18 +++++++----------- .claude/skills/db-update/scripts/db-update.ps1 | 10 +++++++--- .claude/skills/db-update/scripts/db-update.py | 9 +++++++-- tests/skills/cases/db-update/dynamic-off.json | 18 ++++++++++++++++++ tests/skills/cases/db-update/dynamic-on.json | 18 ++++++++++++++++++ 5 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 tests/skills/cases/db-update/dynamic-off.json create mode 100644 tests/skills/cases/db-update/dynamic-on.json diff --git a/.claude/skills/db-update/SKILL.md b/.claude/skills/db-update/SKILL.md index 0dc405370..9f9fdc55c 100644 --- a/.claude/skills/db-update/SKILL.md +++ b/.claude/skills/db-update/SKILL.md @@ -11,14 +11,16 @@ allowed-tools: # /db-update — Обновление конфигурации БД -Применяет изменения основной конфигурации к конфигурации базы данных (`/UpdateDBCfg`). Обязательный шаг после `/db-load-cf`, `/db-load-xml`, `/db-load-git`. +Применяет изменения основной конфигурации к конфигурации базы данных (`/UpdateDBCfg`) — +отдельным шагом после загрузки. У `/db-load-xml` и `/db-load-git` то же самое делает +ключ `-UpdateDB`. ## Usage ``` /db-update [database] /db-update dev -/db-update dev -Dynamic+ +/db-update dev -Dynamic on ``` ## Параметры подключения @@ -50,7 +52,7 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" <п | `-Password <пароль>` | нет | Пароль | | `-Extension <имя>` | нет | Обновить расширение | | `-AllExtensions` | нет | Обновить все расширения | -| `-Dynamic <+/->` | нет | `+` — динамическое обновление, `-` — отключить | +| `-Dynamic ` | нет | `on` — динамическое обновление, без монопольного доступа к базе; `off` — отключить | | `-Server` | нет | Обновление на стороне сервера | | `-WarningsAsErrors` | нет | Предупреждения считать ошибками | | `-AdditionalV8Arguments <список>` | нет | Доп. аргументы запуска `1cv8.exe` через запятую, напр. `/UseHwLicenses+` | @@ -68,20 +70,14 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" <п | `-BackgroundSuspend` | Приостановить | | `-BackgroundResume` | Возобновить | -## Предупреждения - -- Если обновление **не динамическое** — потребуется **монопольный доступ** к базе (все пользователи должны выйти) -- Для серверных баз рекомендуется `-Dynamic+` для обновления без остановки -- Если структура данных существенно изменилась (удаление реквизитов, изменение типов) — динамическое обновление может быть невозможно - ## Примеры ```powershell # Обычное обновление (файловая база) powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -# Динамическое обновление (серверная база) -powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -Dynamic "+" +# Динамическое обновление +powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" -InfoBaseServer "srv01" -InfoBaseRef "MyDB" -UserName "Admin" -Password "secret" -Dynamic on # Обновление расширения powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-update.ps1" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -Extension "МоёРасширение" diff --git a/.claude/skills/db-update/scripts/db-update.ps1 b/.claude/skills/db-update/scripts/db-update.ps1 index ee40199d6..dfca6effd 100644 --- a/.claude/skills/db-update/scripts/db-update.ps1 +++ b/.claude/skills/db-update/scripts/db-update.ps1 @@ -1,4 +1,4 @@ -# db-update v1.19 — Update 1C database configuration +# db-update v1.20 — Update 1C database configuration # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # NB: *nix-раскладку платформы (/opt/1cv8//1cv8, без .exe) знает только .py-порт — PS на *nix не исполняется. <# @@ -34,7 +34,7 @@ Обновить все расширения .PARAMETER Dynamic - Динамическое обновление: "+" включить, "-" отключить + Динамическое обновление: on включить, off отключить .PARAMETER Server Обновление на стороне сервера @@ -81,8 +81,10 @@ param( [Parameter(Mandatory=$false)] [switch]$AllExtensions, + # on/off, а не +/-: значение "-" через powershell.exe -File парсер не связывает и молча + # выходит с кодом 2, без единого сообщения. "+"/"-" принимаются, но в инструкции не значатся. [Parameter(Mandatory=$false)] - [ValidateSet("+", "-")] + [ValidateSet("on", "off", "yes", "no", "+", "-")] [string]$Dynamic, [Parameter(Mandatory=$false)] @@ -113,6 +115,8 @@ param( [string[]]$AdditionalIbcmdArguments = @() ) +if ($Dynamic) { $Dynamic = if (@('on', 'yes', '+') -contains $Dynamic.ToLower()) { '+' } else { '-' } } + $OutputEncoding = [System.Text.Encoding]::UTF8 [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 diff --git a/.claude/skills/db-update/scripts/db-update.py b/.claude/skills/db-update/scripts/db-update.py index 19c96c447..dbc9e6efe 100644 --- a/.claude/skills/db-update/scripts/db-update.py +++ b/.claude/skills/db-update/scripts/db-update.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# db-update v1.19 — Update 1C database configuration +# db-update v1.20 — Update 1C database configuration # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -544,7 +544,9 @@ def main(): parser.add_argument("-RepositoryPassword", default="") parser.add_argument("-Extension", default="") parser.add_argument("-AllExtensions", action="store_true") - parser.add_argument("-Dynamic", default="", choices=["", "+", "-"]) + # on/off, а не +/-: значение "-" через powershell.exe -File парсер PS не связывает и молча + # выходит с кодом 2. "+"/"-" принимаются, но в инструкции не значатся. + parser.add_argument("-Dynamic", default="", choices=["", "on", "off", "yes", "no", "+", "-"]) parser.add_argument("-Server", action="store_true") parser.add_argument("-WarningsAsErrors", action="store_true") # Ключ для регрессов и верификации снапшотов, не для повседневного вызова: в SKILL.md @@ -559,6 +561,9 @@ def main(): argv, v8_extra, ibcmd_extra = extract_extra_args(sys.argv[1:], known_opts) args = ci_parse_args(parser, argv) + if args.Dynamic: + args.Dynamic = "+" if args.Dynamic.lower() in ("on", "yes", "+") else "-" + args.V8Path = clean_path(args.V8Path, "-V8Path") args.InfoBasePath = clean_path(args.InfoBasePath, "-InfoBasePath") assert_infobase_exists(args.InfoBasePath) diff --git a/tests/skills/cases/db-update/dynamic-off.json b/tests/skills/cases/db-update/dynamic-off.json new file mode 100644 index 000000000..02c5afba3 --- /dev/null +++ b/tests/skills/cases/db-update/dynamic-off.json @@ -0,0 +1,18 @@ +{ + "name": "-Dynamic off передаётся платформе как -Dynamic-", + "fakePlatform": { + "log": "Обновление конфигурации успешно завершено\r\n" + }, + "args_extra": [ + "-V8Path", + "{fakePlatform}", + "-InfoBasePath", + "{workDir}/ib", + "-Dynamic", + "off" + ], + "expect": { + "stdoutContains": "/UpdateDBCfg -Dynamic-" + }, + "noSnapshot": "навык ничего не пишет в рабочий каталог — проверяется командная строка" +} diff --git a/tests/skills/cases/db-update/dynamic-on.json b/tests/skills/cases/db-update/dynamic-on.json new file mode 100644 index 000000000..7778a66a0 --- /dev/null +++ b/tests/skills/cases/db-update/dynamic-on.json @@ -0,0 +1,18 @@ +{ + "name": "-Dynamic on передаётся платформе как -Dynamic+", + "fakePlatform": { + "log": "Обновление конфигурации успешно завершено\r\n" + }, + "args_extra": [ + "-V8Path", + "{fakePlatform}", + "-InfoBasePath", + "{workDir}/ib", + "-Dynamic", + "on" + ], + "expect": { + "stdoutContains": "/UpdateDBCfg -Dynamic+" + }, + "noSnapshot": "навык ничего не пишет в рабочий каталог — проверяется командная строка" +}