feat(cf-validate): проверка 10 — тела конфигурации Ext/*.xml в версии Configuration.xml

Конфигурация для платформы — такой же объект, как остальные: Configuration.xml и его штампованные
тела Ext/*.xml (CommandInterface, MainSectionCommandInterface, HomePageWorkArea, Splash,
MainSectionPicture, Logo) загружаются только в одной версии формата — иначе «Версия формата
загружаемого файла … отличается от версии формата ранее загруженных файлов». Проверено на
8.3.27.1859: расхождение любого из этих файлов с Configuration.xml — отказ; Configuration.xml вместе
со всеми своими телами в другой версии, чем объекты, — грузится. Сквозного обхода выгрузки нет:
на ERP это 74 тыс. файлов, а платформа при загрузке и так называет файл.

Co-Authored-By: Sergei Pleshanov <2357qwr@gmail.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-26 22:07:54 +03:00
co-authored by Sergei Pleshanov Claude Opus 5.5
parent c943acefa2
commit 5a62b37017
13 changed files with 683 additions and 3 deletions
@@ -1,4 +1,4 @@
# cf-validate v1.10 — Validate 1C configuration root structure
# cf-validate v1.11 — Validate 1C configuration root structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -103,6 +103,21 @@ function Get-FormatRank([string]$ver) {
return 0
}
# Штамп версии формата — атрибут version КОРНЕВОГО элемента файла. Копия общего эталона (семья
# root_version, авторитет — meta-validate).
function Get-RootVersion([string]$xmlPath) {
if (-not (Test-Path -LiteralPath $xmlPath -PathType Leaf)) { return $null }
$buf = New-Object byte[] 4096
$fs = [System.IO.File]::OpenRead($xmlPath)
try { $len = $fs.Read($buf, 0, $buf.Length) } finally { $fs.Dispose() }
$head = [System.Text.Encoding]::UTF8.GetString($buf, 0, $len)
$m = [regex]::Match($head, '<[A-Za-z_][\w.:-]*(\s[^>]*)?/?>')
if (-not $m.Success) { return $null }
$v = [regex]::Match($m.Groups[1].Value, '(?:^|\s)version="([^"]*)"')
if ($v.Success) { return $v.Groups[1].Value }
return $null
}
# --- Reference tables ---
$guidPattern = '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'
$identPattern = '^[A-Za-z\u0410-\u042F\u0401\u0430-\u044F\u0451_][A-Za-z0-9\u0410-\u042F\u0401\u0430-\u044F\u0451_]*$'
@@ -623,6 +638,28 @@ if ($formRefsChecked -eq 0) {
foreach ($err in $formRefErrors) { Report-Error "9. $err" }
}
# --- Check 10: тела конфигурации Ext/*.xml в версии Configuration.xml ---
# Конфигурация для платформы — такой же объект, как остальные: Configuration.xml и штампованные тела
# Ext/*.xml (CommandInterface, HomePageWorkArea, Splash, …) загружаются только в одной версии формата
# («Версия формата загружаемого файла … отличается от версии формата ранее загруженных файлов»).
$cfgExtDir = Join-Path $configDir "Ext"
$cfgBodiesOk = 0
$cfgBodyErrors = 0
if ($version -and (Test-Path $cfgExtDir -PathType Container)) {
$bodyNames = @(Get-ChildItem $cfgExtDir -Filter "*.xml" -File | ForEach-Object { $_.Name })
[Array]::Sort($bodyNames, [StringComparer]::Ordinal)
foreach ($bn in $bodyNames) {
$bodyVer = Get-RootVersion (Join-Path $cfgExtDir $bn)
if (-not $bodyVer) { continue }
if ($bodyVer -eq $version) { $cfgBodiesOk++; continue }
$cfgBodyErrors++
Report-Error "10. Ext/$bn is stamped $bodyVer, Configuration.xml $version — the platform refuses to load parts of one object in different formats"
}
}
if ($cfgBodyErrors -eq 0 -and $cfgBodiesOk -gt 0) {
Report-OK "10. Format version: $cfgBodiesOk stamped Ext part(s) agree with Configuration.xml"
}
# --- Final output ---
& $finalize