From 07ea6763269e3cd120ba0ae098f6b628c51834f9 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 20 Jun 2026 17:10:02 +0300 Subject: [PATCH] =?UTF-8?q?feat(db-load-xml,db-load-git):=20=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9?= =?UTF-8?q?=D0=BB=D1=8B=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Партиал-загрузка ParentConfigurations.bin платформой не принимается (мутный отказ «редактирование объекта метаданных запрещено», пустое имя = корень; смена поддержки требует полной загрузки). Чтобы не падать невнятно, оба навыка теперь исключают служебные файлы поддержки из partial-списка с явной подсказкой. - db-load-xml (Mode Partial): фильтрует -Files и -ListFile — убирает ParentConfigurations.bin и ConfigDumpInfo.xml, грузит остальное; если после фильтра пусто — подсказка использовать -Mode Full. - db-load-git: ParentConfigurations.bin из git-diff отбрасывается явно (раньше — неявно, через несуществующий производный xml) и о смене поддержки печатается предупреждение; ConfigDumpInfo.xml как и прежде пропускается. Не блокируем быструю частичную загрузку объектов (bin всё равно partial не применяется — ничего «быстрого» не теряем); смену поддержки честно направляем на полную загрузку. Оба порта, v1.3→v1.4. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../db-load-git/scripts/db-load-git.ps1 | 15 ++++++-- .../skills/db-load-git/scripts/db-load-git.py | 17 +++++++-- .../db-load-xml/scripts/db-load-xml.ps1 | 35 ++++++++++++------- .../skills/db-load-xml/scripts/db-load-xml.py | 35 ++++++++++++------- 4 files changed, 72 insertions(+), 30 deletions(-) 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 576e7ced..724aa228 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.3 — Load Git changes into 1C database +# db-load-git v1.4 — Load Git changes into 1C database # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills <# .SYNOPSIS @@ -216,13 +216,16 @@ Write-Host "Git changes detected: $($changedFiles.Count) files" # --- Filter and map to config files --- $configFiles = @() +$supportSkipped = @() foreach ($file in $changedFiles) { $file = $file.Trim().Replace('\', '/') if ([string]::IsNullOrWhiteSpace($file)) { continue } - # Skip service files - if ($file -eq "ConfigDumpInfo.xml") { continue } + # Skip service files (not partially loadable). Support-state files are tracked + # to warn the user: support changes apply only via a full load. + if ($file -match 'ParentConfigurations\.bin$') { $supportSkipped += $file; continue } + if ($file -eq "ConfigDumpInfo.xml" -or $file -match '(^|/)ConfigDumpInfo\.xml$') { continue } $fullPath = Join-Path $ConfigDir $file @@ -265,6 +268,12 @@ foreach ($file in $changedFiles) { } } +if ($supportSkipped.Count -gt 0) { + Write-Host "[ВНИМАНИЕ] Состояние поддержки изменено в коммите, но частично не загружается (исключено):" -ForegroundColor Yellow + foreach ($sf in $supportSkipped) { Write-Host " - $sf" -ForegroundColor Yellow } + Write-Host " Смена состояния поддержки применяется только полной загрузкой (db-load-xml -Mode Full)." -ForegroundColor Yellow +} + if ($configFiles.Count -eq 0) { Write-Host "No configuration files found in changes" exit 0 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 c032e9c0..d741e3ae 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.3 — Load Git changes into 1C database +# db-load-git v1.4 — Load Git changes into 1C database # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -146,14 +146,19 @@ def main(): # --- Filter and map to config files --- config_files = [] + support_skipped = [] for file in changed_files: file = file.strip().replace("\\", "/") if not file: continue - # Skip service files - if file == "ConfigDumpInfo.xml": + # Skip service files (not partially loadable). Support-state files are + # tracked to warn: support changes apply only via a full load. + if file.endswith("ParentConfigurations.bin"): + support_skipped.append(file) + continue + if file == "ConfigDumpInfo.xml" or file.endswith("/ConfigDumpInfo.xml"): continue full_path = os.path.join(args.ConfigDir, file) @@ -186,6 +191,12 @@ def main(): if rel_path not in config_files: config_files.append(rel_path) + if support_skipped: + print("[ВНИМАНИЕ] Состояние поддержки изменено в коммите, но частично не загружается (исключено):", file=sys.stderr) + for sf in support_skipped: + print(f" - {sf}", file=sys.stderr) + print(" Смена состояния поддержки применяется только полной загрузкой (db-load-xml -Mode Full).", file=sys.stderr) + if len(config_files) == 0: print("No configuration files found in changes") sys.exit(0) 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 bdbcd9cf..c8e46e13 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.3 — Load 1C configuration from XML files +# db-load-xml v1.4 — Load 1C configuration from XML files # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills <# .SYNOPSIS @@ -168,25 +168,36 @@ try { Write-Host "Executing partial configuration load..." # Build list file - $generatedListFile = $null + $rawList = @() if ($ListFile) { - # Use provided list file if (-not (Test-Path $ListFile)) { Write-Host "Error: list file not found: $ListFile" -ForegroundColor Red exit 1 } - $generatedListFile = $ListFile + $rawList = @(Get-Content -Path $ListFile -Encoding UTF8 | ForEach-Object { $_.Trim() } | Where-Object { $_ }) } else { - # Generate from -Files parameter - $fileList = $Files -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ } - $generatedListFile = Join-Path $tempDir "load_list.txt" - $utf8Bom = New-Object System.Text.UTF8Encoding($true) - [System.IO.File]::WriteAllLines($generatedListFile, $fileList, $utf8Bom) - - Write-Host "Files to load: $($fileList.Count)" - foreach ($f in $fileList) { Write-Host " $f" } + $rawList = @($Files -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ }) } + # Support-state service files are NOT partially loadable — exclude with a hint. + $supportRe = 'ParentConfigurations\.bin$|(^|[\\/])ConfigDumpInfo\.xml$' + $supportFiles = @($rawList | Where-Object { $_ -match $supportRe }) + $fileList = @($rawList | Where-Object { $_ -notmatch $supportRe }) + if ($supportFiles.Count -gt 0) { + Write-Host "[ВНИМАНИЕ] Служебные файлы состояния поддержки исключены из частичной загрузки (частично не грузятся):" -ForegroundColor Yellow + foreach ($sf in $supportFiles) { Write-Host " - $sf" -ForegroundColor Yellow } + Write-Host " Смена состояния поддержки применяется только полной загрузкой: -Mode Full." -ForegroundColor Yellow + } + if ($fileList.Count -eq 0) { + Write-Host "Error: после исключения служебных файлов поддержки загружать нечего. Для смены поддержки используйте -Mode Full." -ForegroundColor Red + exit 1 + } + $generatedListFile = Join-Path $tempDir "load_list.txt" + $utf8Bom = New-Object System.Text.UTF8Encoding($true) + [System.IO.File]::WriteAllLines($generatedListFile, $fileList, $utf8Bom) + Write-Host "Files to load: $($fileList.Count)" + foreach ($f in $fileList) { Write-Host " $f" } + $arguments += "-listFile", "`"$generatedListFile`"" $arguments += "-partial" $arguments += "-updateConfigDumpInfo" 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 e51286b2..432a1cb3 100644 --- a/.claude/skills/db-load-xml/scripts/db-load-xml.py +++ b/.claude/skills/db-load-xml/scripts/db-load-xml.py @@ -1,11 +1,12 @@ #!/usr/bin/env python3 -# db-load-xml v1.3 — Load 1C configuration from XML files +# db-load-xml v1.4 — Load 1C configuration from XML files # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import glob import os import random +import re import shutil import subprocess import sys @@ -114,23 +115,33 @@ def main(): print("Executing partial configuration load...") # Build list file - generated_list_file = None if args.ListFile: - # Use provided list file if not os.path.isfile(args.ListFile): print(f"Error: list file not found: {args.ListFile}", file=sys.stderr) sys.exit(1) - generated_list_file = args.ListFile + with open(args.ListFile, encoding="utf-8-sig") as f: + raw_list = [ln.strip() for ln in f if ln.strip()] else: - # Generate from -Files parameter - file_list = [f.strip() for f in args.Files.split(",") if f.strip()] - 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)) + raw_list = [f.strip() for f in args.Files.split(",") if f.strip()] - print(f"Files to load: {len(file_list)}") - for fl in file_list: - print(f" {fl}") + # Support-state service files are NOT partially loadable — exclude with a hint. + support_re = re.compile(r"ParentConfigurations\.bin$|(^|[\\/])ConfigDumpInfo\.xml$") + support_files = [x for x in raw_list if support_re.search(x)] + file_list = [x for x in raw_list if not support_re.search(x)] + if support_files: + print("[ВНИМАНИЕ] Служебные файлы состояния поддержки исключены из частичной загрузки (частично не грузятся):", file=sys.stderr) + for sf in support_files: + print(f" - {sf}", file=sys.stderr) + print(" Смена состояния поддержки применяется только полной загрузкой: -Mode Full.", file=sys.stderr) + if not file_list: + print("Error: после исключения служебных файлов поддержки загружать нечего. Для смены поддержки используйте -Mode Full.", file=sys.stderr) + sys.exit(1) + 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)) + print(f"Files to load: {len(file_list)}") + for fl in file_list: + print(f" {fl}") arguments += ["-listFile", generated_list_file] arguments.append("-partial")