feat(db-load-xml,db-load-git): предупреждать о полной загрузке при Configuration.xml в списке

Список частичной загрузки задаёт объекты метаданных: вместе с объектом платформа грузит
его дочерние объекты (формы, макеты) и файлы Ext/. Configuration.xml — объект
«Конфигурация», поэтому его наличие в списке даёт полную загрузку конфигурации, а не
перечисленных объектов. В db-load-git он попадает в список из диффа сам, без участия
пользователя.

Замерено на обоих движках (1cv8 и ibcmd): правило одинаково.

- SKILL.md обоих навыков: строка про цену Configuration.xml в списке;
- хинт в выводе обеих веток движка;
- два кейса на срабатывание и на отсутствие ложного срабатывания.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-22 14:37:21 +03:00
co-authored by Claude Opus 5
parent 77836f7ada
commit 6eaf3211cc
8 changed files with 112 additions and 5 deletions
+2
View File
@@ -13,6 +13,8 @@ allowed-tools:
Определяет изменённые файлы конфигурации по данным Git и выполняет частичную загрузку в информационную базу. Определяет изменённые файлы конфигурации по данным Git и выполняет частичную загрузку в информационную базу.
> Если в изменениях есть `Configuration.xml`, платформа выполнит **полную загрузку конфигурации**, а не только изменённых объектов.
## Usage ## Usage
``` ```
@@ -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 # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# NB: *nix-раскладку платформы (/opt/1cv8/<ver>/1cv8, без .exe) знает только .py-порт — PS на *nix не исполняется. # NB: *nix-раскладку платформы (/opt/1cv8/<ver>/1cv8, без .exe) знает только .py-порт — PS на *nix не исполняется.
<# <#
@@ -800,6 +800,14 @@ if ($configFiles.Count -eq 0) {
exit 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)" Write-Host "Files for loading: $($configFiles.Count)"
foreach ($f in $configFiles) { Write-Host " $f" } foreach ($f in $configFiles) { Write-Host " $f" }
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/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 # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse import argparse
@@ -850,6 +850,13 @@ def main():
print("No configuration files found in changes") print("No configuration files found in changes")
sys.exit(0) 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)}") print(f"Files for loading: {len(config_files)}")
for f in config_files: for f in config_files:
print(f" {f}") print(f" {f}")
+3 -1
View File
@@ -71,7 +71,9 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-load-xml.ps1" <
| Режим | Описание | | Режим | Описание |
|-------|----------| |-------|----------|
| `Full` | Полная загрузка — замена всей конфигурации из каталога XML | | `Full` | Полная загрузка — замена всей конфигурации из каталога XML |
| `Partial` | Частичная — загрузка выбранных файлов (с `-partial -updateConfigDumpInfo`) | | `Partial` | Частичная — перечисленные объекты вместе с их дочерними (формы, макеты) и `Ext/` |
> Если в список файлов включить `Configuration.xml`, платформа выполнит **полную загрузку конфигурации**, а не только перечисленных объектов.
### Формат файла списка (listFile) ### Формат файла списка (listFile)
@@ -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 # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# NB: *nix-раскладку платформы (/opt/1cv8/<ver>/1cv8, без .exe) знает только .py-порт — PS на *nix не исполняется. # NB: *nix-раскладку платформы (/opt/1cv8/<ver>/1cv8, без .exe) знает только .py-порт — PS на *nix не исполняется.
<# <#
@@ -564,6 +564,18 @@ function Write-PlatformOutput {
Write-Host "--- End ---" 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 Write-Host "Error: -Files or -ListFile required for partial import" -ForegroundColor Red
exit 1 exit 1
} }
Write-WholeConfigScopeHint -FileList $fileList -Extension $Extension
$arguments = @("infobase", "config", "import", "files") + $fileList $arguments = @("infobase", "config", "import", "files") + $fileList
$arguments += "--base-dir=$ConfigDir", "--db-path=$InfoBasePath" $arguments += "--base-dir=$ConfigDir", "--db-path=$InfoBasePath"
if ($Extension) { $arguments += "--extension=$Extension" } if ($Extension) { $arguments += "--extension=$Extension" }
@@ -839,6 +852,7 @@ try {
Write-Host "Error: после исключения служебных файлов поддержки загружать нечего. Для смены поддержки используйте -Mode Full." -ForegroundColor Red Write-Host "Error: после исключения служебных файлов поддержки загружать нечего. Для смены поддержки используйте -Mode Full." -ForegroundColor Red
exit 1 exit 1
} }
Write-WholeConfigScopeHint -FileList $fileList -Extension $Extension
$generatedListFile = Join-Path $tempDir "load_list.txt" $generatedListFile = Join-Path $tempDir "load_list.txt"
$utf8Bom = New-Object System.Text.UTF8Encoding($true) $utf8Bom = New-Object System.Text.UTF8Encoding($true)
[System.IO.File]::WriteAllLines($generatedListFile, $fileList, $utf8Bom) [System.IO.File]::WriteAllLines($generatedListFile, $fileList, $utf8Bom)
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/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 # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse import argparse
@@ -493,6 +493,17 @@ def print_platform_output(result):
print("--- End ---") 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): def find_silent_rejections(log_text):
"""Строки лога, о которых платформа сообщает, НЕ поднимая код возврата. """Строки лога, о которых платформа сообщает, НЕ поднимая код возврата.
@@ -765,6 +776,7 @@ def main():
if not file_list: if not file_list:
print("Error: -Files or -ListFile required for partial import") print("Error: -Files or -ListFile required for partial import")
sys.exit(1) sys.exit(1)
print_whole_config_scope_hint(file_list, args.Extension)
arguments = ["infobase", "config", "import", "files"] + file_list arguments = ["infobase", "config", "import", "files"] + file_list
arguments += [f"--base-dir={args.ConfigDir}", f"--db-path={args.InfoBasePath}"] arguments += [f"--base-dir={args.ConfigDir}", f"--db-path={args.InfoBasePath}"]
if args.Extension: if args.Extension:
@@ -873,6 +885,7 @@ def main():
if not file_list: if not file_list:
print("Error: после исключения служебных файлов поддержки загружать нечего. Для смены поддержки используйте -Mode Full.") print("Error: после исключения служебных файлов поддержки загружать нечего. Для смены поддержки используйте -Mode Full.")
sys.exit(1) sys.exit(1)
print_whole_config_scope_hint(file_list, args.Extension)
generated_list_file = os.path.join(temp_dir, "load_list.txt") generated_list_file = os.path.join(temp_dir, "load_list.txt")
with open(generated_list_file, "w", encoding="utf-8-sig") as f: with open(generated_list_file, "w", encoding="utf-8-sig") as f:
f.write("\n".join(file_list)) f.write("\n".join(file_list))
@@ -0,0 +1,29 @@
{
"name": "Без Configuration.xml в списке предупреждения о полной загрузке нет",
"fakePlatform": {
"log": ""
},
"preRun": [
{
"writeFile": {
"path": "src/Configuration.xml",
"content": "<?xml version=\"1.0\"?><MetaDataObject/>"
}
}
],
"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": "навык ничего не пишет в рабочий каталог — проверяется отсутствие предупреждения"
}
@@ -0,0 +1,32 @@
{
"name": "Configuration.xml в списке: предупреждаем о полной загрузке конфигурации",
"fakePlatform": {
"log": ""
},
"preRun": [
{
"writeFile": {
"path": "src/Configuration.xml",
"content": "<?xml version=\"1.0\"?><MetaDataObject/>"
}
}
],
"args_extra": [
"-V8Path",
"{fakePlatform}",
"-InfoBasePath",
"{workDir}/ib",
"-ConfigDir",
"{workDir}/src",
"-Files",
"Configuration.xml,Catalogs/Номенклатура.xml"
],
"expect": {
"stdoutContains": [
"Executing partial configuration load...",
"[ВНИМАНИЕ] В списке Configuration.xml — платформа выполнит ПОЛНУЮ загрузку конфигурации,",
"а не только перечисленных объектов."
]
},
"noSnapshot": "навык ничего не пишет в рабочий каталог — проверяется текст предупреждения"
}