diff --git a/.claude/skills/db-load-git/SKILL.md b/.claude/skills/db-load-git/SKILL.md index 9891d54b7..8face5679 100644 --- a/.claude/skills/db-load-git/SKILL.md +++ b/.claude/skills/db-load-git/SKILL.md @@ -13,6 +13,8 @@ allowed-tools: Определяет изменённые файлы конфигурации по данным Git и выполняет частичную загрузку в информационную базу. +> Если в изменениях есть `Configuration.xml`, платформа выполнит **полную загрузку конфигурации**, а не только изменённых объектов. + ## Usage ``` diff --git a/.claude/skills/db-load-git/scripts/db-load-git.ps1 b/.claude/skills/db-load-git/scripts/db-load-git.ps1 index c36159277..b88ad276b 100644 --- a/.claude/skills/db-load-git/scripts/db-load-git.ps1 +++ b/.claude/skills/db-load-git/scripts/db-load-git.ps1 @@ -1,4 +1,4 @@ -# db-load-git v1.27 — Load Git changes into 1C database +# db-load-git v1.28 — Load Git changes into 1C database # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # NB: *nix-раскладку платформы (/opt/1cv8//1cv8, без .exe) знает только .py-порт — PS на *nix не исполняется. <# @@ -800,6 +800,14 @@ if ($configFiles.Count -eq 0) { exit 0 } +# Корневой Configuration.xml — это объект «Конфигурация»: вместе с объектом платформа грузит его +# дочерние объекты, а у конфигурации это весь состав. В список он попадает из диффа сам, поэтому +# предупреждаем — пользователь его не выбирал. +if (@($configFiles | Where-Object { ($_ -replace '\\', '/') -ieq 'Configuration.xml' }).Count -gt 0) { + Write-Host "[ВНИМАНИЕ] В изменениях есть Configuration.xml: платформа выполнит ПОЛНУЮ загрузку" -ForegroundColor Yellow + Write-Host " конфигурации, а не только изменённых объектов." -ForegroundColor Yellow +} + Write-Host "Files for loading: $($configFiles.Count)" foreach ($f in $configFiles) { Write-Host " $f" } diff --git a/.claude/skills/db-load-git/scripts/db-load-git.py b/.claude/skills/db-load-git/scripts/db-load-git.py index e7faff8d8..5759e7563 100644 --- a/.claude/skills/db-load-git/scripts/db-load-git.py +++ b/.claude/skills/db-load-git/scripts/db-load-git.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# db-load-git v1.27 — Load Git changes into 1C database +# db-load-git v1.28 — Load Git changes into 1C database # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -850,6 +850,13 @@ def main(): print("No configuration files found in changes") sys.exit(0) + # Корневой Configuration.xml — это объект «Конфигурация»: вместе с объектом платформа грузит + # его дочерние объекты, а у конфигурации это весь состав. В список он попадает из диффа сам, + # поэтому предупреждаем — пользователь его не выбирал. + if any(x.replace("\\", "/").lower() == "configuration.xml" for x in config_files): + print("[ВНИМАНИЕ] В изменениях есть Configuration.xml: платформа выполнит ПОЛНУЮ загрузку") + print(" конфигурации, а не только изменённых объектов.") + print(f"Files for loading: {len(config_files)}") for f in config_files: print(f" {f}") diff --git a/.claude/skills/db-load-xml/SKILL.md b/.claude/skills/db-load-xml/SKILL.md index 77db67970..91e12db62 100644 --- a/.claude/skills/db-load-xml/SKILL.md +++ b/.claude/skills/db-load-xml/SKILL.md @@ -71,7 +71,9 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.ps1" < | Режим | Описание | |-------|----------| | `Full` | Полная загрузка — замена всей конфигурации из каталога XML | -| `Partial` | Частичная — загрузка выбранных файлов (с `-partial -updateConfigDumpInfo`) | +| `Partial` | Частичная — перечисленные объекты вместе с их дочерними (формы, макеты) и `Ext/` | + +> Если в список файлов включить `Configuration.xml`, платформа выполнит **полную загрузку конфигурации**, а не только перечисленных объектов. ### Формат файла списка (listFile) diff --git a/.claude/skills/db-load-xml/scripts/db-load-xml.ps1 b/.claude/skills/db-load-xml/scripts/db-load-xml.ps1 index 08cec3d10..6389e89c0 100644 --- a/.claude/skills/db-load-xml/scripts/db-load-xml.ps1 +++ b/.claude/skills/db-load-xml/scripts/db-load-xml.ps1 @@ -1,4 +1,4 @@ -# db-load-xml v1.29 — Load 1C configuration from XML files +# db-load-xml v1.30 — Load 1C configuration from XML files # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # NB: *nix-раскладку платформы (/opt/1cv8//1cv8, без .exe) знает только .py-порт — PS на *nix не исполняется. <# @@ -564,6 +564,18 @@ function Write-PlatformOutput { Write-Host "--- End ---" } +function Write-WholeConfigScopeHint { + # Список задаёт объекты метаданных, а не только файлы: вместе с объектом платформа грузит его + # дочерние объекты. Корневой Configuration.xml — это объект «Конфигурация», поэтому список с ним + # загружает конфигурацию целиком. Замерено на 1cv8 и ibcmd; см. docs по навыку. + param([string[]]$FileList, [string]$Extension) + $hasRoot = @($FileList | Where-Object { ($_ -replace '\\', '/') -ieq 'Configuration.xml' }).Count -gt 0 + if (-not $hasRoot) { return } + $what = if ($Extension) { "расширения" } else { "конфигурации" } + Write-Host "[ВНИМАНИЕ] В списке Configuration.xml — платформа выполнит ПОЛНУЮ загрузку $what," -ForegroundColor Yellow + Write-Host " а не только перечисленных объектов." -ForegroundColor Yellow +} + # Строки лога, о которых платформа сообщает, НЕ поднимая код возврата: метаданные отброшены или # конфигурация нерабочая, а операция при этом «успешна». Возвращает подошедшие строки. # @@ -735,6 +747,7 @@ try { Write-Host "Error: -Files or -ListFile required for partial import" -ForegroundColor Red exit 1 } + Write-WholeConfigScopeHint -FileList $fileList -Extension $Extension $arguments = @("infobase", "config", "import", "files") + $fileList $arguments += "--base-dir=$ConfigDir", "--db-path=$InfoBasePath" if ($Extension) { $arguments += "--extension=$Extension" } @@ -839,6 +852,7 @@ try { Write-Host "Error: после исключения служебных файлов поддержки загружать нечего. Для смены поддержки используйте -Mode Full." -ForegroundColor Red exit 1 } + Write-WholeConfigScopeHint -FileList $fileList -Extension $Extension $generatedListFile = Join-Path $tempDir "load_list.txt" $utf8Bom = New-Object System.Text.UTF8Encoding($true) [System.IO.File]::WriteAllLines($generatedListFile, $fileList, $utf8Bom) diff --git a/.claude/skills/db-load-xml/scripts/db-load-xml.py b/.claude/skills/db-load-xml/scripts/db-load-xml.py index 71b1d7830..7b5d07764 100644 --- a/.claude/skills/db-load-xml/scripts/db-load-xml.py +++ b/.claude/skills/db-load-xml/scripts/db-load-xml.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# db-load-xml v1.29 — Load 1C configuration from XML files +# db-load-xml v1.30 — Load 1C configuration from XML files # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -493,6 +493,17 @@ def print_platform_output(result): print("--- End ---") +def print_whole_config_scope_hint(file_list, extension=""): + """Список задаёт объекты метаданных, а не только файлы: вместе с объектом платформа грузит его + дочерние объекты. Корневой Configuration.xml — это объект «Конфигурация», поэтому список с ним + загружает конфигурацию целиком. Замерено на 1cv8 и ibcmd.""" + if not any(x.replace("\\", "/").lower() == "configuration.xml" for x in file_list): + return + what = "расширения" if extension else "конфигурации" + print(f"[ВНИМАНИЕ] В списке Configuration.xml — платформа выполнит ПОЛНУЮ загрузку {what},") + print(" а не только перечисленных объектов.") + + def find_silent_rejections(log_text): """Строки лога, о которых платформа сообщает, НЕ поднимая код возврата. @@ -765,6 +776,7 @@ def main(): if not file_list: print("Error: -Files or -ListFile required for partial import") sys.exit(1) + print_whole_config_scope_hint(file_list, args.Extension) arguments = ["infobase", "config", "import", "files"] + file_list arguments += [f"--base-dir={args.ConfigDir}", f"--db-path={args.InfoBasePath}"] if args.Extension: @@ -873,6 +885,7 @@ def main(): if not file_list: print("Error: после исключения служебных файлов поддержки загружать нечего. Для смены поддержки используйте -Mode Full.") sys.exit(1) + print_whole_config_scope_hint(file_list, args.Extension) generated_list_file = os.path.join(temp_dir, "load_list.txt") with open(generated_list_file, "w", encoding="utf-8-sig") as f: f.write("\n".join(file_list)) diff --git a/tests/skills/cases/db-load-xml/scope-hint-only-for-config.json b/tests/skills/cases/db-load-xml/scope-hint-only-for-config.json new file mode 100644 index 000000000..c8289a3fe --- /dev/null +++ b/tests/skills/cases/db-load-xml/scope-hint-only-for-config.json @@ -0,0 +1,29 @@ +{ + "name": "Без Configuration.xml в списке предупреждения о полной загрузке нет", + "fakePlatform": { + "log": "" + }, + "preRun": [ + { + "writeFile": { + "path": "src/Configuration.xml", + "content": "" + } + } + ], + "args_extra": [ + "-V8Path", + "{fakePlatform}", + "-InfoBasePath", + "{workDir}/ib", + "-ConfigDir", + "{workDir}/src", + "-Files", + "Catalogs/Номенклатура.xml,Catalogs/Номенклатура/Ext/ObjectModule.bsl" + ], + "expect": { + "stdoutContains": "Executing partial configuration load...", + "stdoutNotContains": "ПОЛНУЮ загрузку конфигурации" + }, + "noSnapshot": "навык ничего не пишет в рабочий каталог — проверяется отсутствие предупреждения" +} diff --git a/tests/skills/cases/db-load-xml/scope-whole-config-hint.json b/tests/skills/cases/db-load-xml/scope-whole-config-hint.json new file mode 100644 index 000000000..ac4bfcdf2 --- /dev/null +++ b/tests/skills/cases/db-load-xml/scope-whole-config-hint.json @@ -0,0 +1,32 @@ +{ + "name": "Configuration.xml в списке: предупреждаем о полной загрузке конфигурации", + "fakePlatform": { + "log": "" + }, + "preRun": [ + { + "writeFile": { + "path": "src/Configuration.xml", + "content": "" + } + } + ], + "args_extra": [ + "-V8Path", + "{fakePlatform}", + "-InfoBasePath", + "{workDir}/ib", + "-ConfigDir", + "{workDir}/src", + "-Files", + "Configuration.xml,Catalogs/Номенклатура.xml" + ], + "expect": { + "stdoutContains": [ + "Executing partial configuration load...", + "[ВНИМАНИЕ] В списке Configuration.xml — платформа выполнит ПОЛНУЮ загрузку конфигурации,", + "а не только перечисленных объектов." + ] + }, + "noSnapshot": "навык ничего не пишет в рабочий каталог — проверяется текст предупреждения" +}