diff --git a/.claude/skills/subsystem-validate/scripts/subsystem-validate.ps1 b/.claude/skills/subsystem-validate/scripts/subsystem-validate.ps1
index 73db29caf..8093ff058 100644
--- a/.claude/skills/subsystem-validate/scripts/subsystem-validate.ps1
+++ b/.claude/skills/subsystem-validate/scripts/subsystem-validate.ps1
@@ -1,4 +1,4 @@
-# subsystem-validate v1.5 — Validate 1C subsystem XML structure
+# subsystem-validate v1.6 — Validate 1C subsystem XML structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -11,6 +11,49 @@ param(
$ErrorActionPreference = "Stop"
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
+# Штамп версии формата — атрибут 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
+}
+
+# Корень автономной внешней обработки/отчёта. Копия общего эталона (семья is_external_root,
+# авторитет — cf-edit).
+function Test-ExternalObjectRoot([string]$xmlPath) {
+ if (-not (Test-Path $xmlPath)) { return $false }
+ try {
+ [xml]$mx = Get-Content -Path $xmlPath -Encoding UTF8
+ $el = $mx.DocumentElement.FirstChild
+ while ($el -and $el.NodeType -ne 'Element') { $el = $el.NextSibling }
+ if ($el) { return @('ExternalDataProcessor','ExternalReport') -contains $el.LocalName }
+ } catch {}
+ return $false
+}
+
+# Якорь выгрузки: корень автономной EPF/ERF либо Configuration.xml, ближайший вверх. Копия общего
+# эталона (семья find_dump_anchor, авторитет — meta-validate).
+function Find-DumpAnchor([string]$startDir) {
+ $d = $startDir
+ for ($i = 0; $i -lt 15 -and $d; $i++) {
+ if (Test-ExternalObjectRoot "$d.xml") { return "$d.xml" }
+ $cfg = Join-Path $d "Configuration.xml"
+ if (Test-Path $cfg) { return $cfg }
+ $parent = [System.IO.Path]::GetDirectoryName($d)
+ if (-not $parent -or $parent -eq $d) { break }
+ $d = $parent
+ }
+ return $null
+}
+
# --- Resolve path ---
if (-not [System.IO.Path]::IsPathRooted($SubsystemPath)) {
$SubsystemPath = Join-Path (Get-Location).Path $SubsystemPath
@@ -331,6 +374,36 @@ if (-not $script:stopped) {
} else {
Report-OK "13. UseOneCommand: false (no constraint)"
}
+
+ # --- 14. Format version: тела Ext/*.xml — как у дескриптора; сверка с выгрузкой ---
+ # Дескриптор подсистемы и её штампованные тела (CommandInterface.xml, Help.xml) платформа загружает
+ # только в одной версии формата: «Версия формата загружаемого файла … отличается от версии формата
+ # ранее загруженных файлов». Вложенные подсистемы — отдельные объекты. С остальной выгрузкой
+ # подсистема может расходиться — платформа такое грузит, это лишь неоднородность выгрузки (типично
+ # после мержа веток, выгруженных разными платформами).
+ if ($version) {
+ $subExtDir = Join-Path (Join-Path $parentDir2 $baseName2) "Ext"
+ $verBodiesOk = 0
+ $verErrors = 0
+ if (Test-Path $subExtDir -PathType Container) {
+ $bodyNames = @(Get-ChildItem $subExtDir -Filter "*.xml" -File | ForEach-Object { $_.Name })
+ [Array]::Sort($bodyNames, [StringComparer]::Ordinal)
+ foreach ($bn in $bodyNames) {
+ $bodyVer = Get-RootVersion (Join-Path $subExtDir $bn)
+ if (-not $bodyVer) { continue }
+ if ($bodyVer -eq $version) { $verBodiesOk++; continue }
+ $verErrors++
+ Report-Error "14. Format version: $baseName2/Ext/$bn is stamped $bodyVer, the descriptor $version — the platform refuses to load parts of one object in different formats"
+ }
+ }
+ $dumpAnchor = Find-DumpAnchor $parentDir2
+ $dumpVer = if ($dumpAnchor) { Get-RootVersion $dumpAnchor } else { $null }
+ if ($dumpVer -and $version -ne $dumpVer) {
+ Report-Warn "14. Format version $version differs from the dump ($dumpVer) — the platform loads it, but the dump is no longer uniform (typical after merging branches dumped by different platforms)"
+ } elseif ($verErrors -eq 0 -and ($verBodiesOk -gt 0 -or $dumpVer)) {
+ Report-OK "14. Format version: $version, matches the stamped parts and the dump"
+ }
+ }
}
# --- Finalize ---
diff --git a/.claude/skills/subsystem-validate/scripts/subsystem-validate.py b/.claude/skills/subsystem-validate/scripts/subsystem-validate.py
index 62411fa1d..f3eaa88ab 100644
--- a/.claude/skills/subsystem-validate/scripts/subsystem-validate.py
+++ b/.claude/skills/subsystem-validate/scripts/subsystem-validate.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# subsystem-validate v1.5 — Validate 1C subsystem XML structure
+# subsystem-validate v1.6 — Validate 1C subsystem XML structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
"""Validates subsystem XML file structure, properties, content items, child objects."""
import sys, os, argparse, re
@@ -98,6 +98,56 @@ def find_duplicates(items):
return dupes
+# Штамп версии формата — атрибут version КОРНЕВОГО элемента файла. Копия общего эталона (семья
+# root_version, авторитет — meta-validate).
+def root_version(xml_path):
+ if not os.path.isfile(xml_path):
+ return None
+ with open(xml_path, "rb") as f:
+ head = f.read(4096).decode("utf-8", errors="ignore")
+ m = re.search(r'<[A-Za-z_][\w.:-]*(\s[^>]*)?/?>', head)
+ if not m:
+ return None
+ v = re.search(r'(?:^|\s)version="([^"]*)"', m.group(1) or "")
+ if v:
+ return v.group(1)
+ return None
+
+
+# Корень автономной внешней обработки/отчёта. Копия общего эталона (семья is_external_root,
+# авторитет — cf-edit).
+def _sg_is_external_root(xml_path):
+ if not os.path.isfile(xml_path):
+ return False
+ try:
+ mx = etree.parse(xml_path).getroot()
+ for child in mx:
+ if isinstance(child.tag, str):
+ return child.tag.split("}")[-1] in ("ExternalDataProcessor", "ExternalReport")
+ except Exception:
+ return False
+ return False
+
+
+# Якорь выгрузки: корень автономной EPF/ERF либо Configuration.xml, ближайший вверх. Копия общего
+# эталона (семья find_dump_anchor, авторитет — meta-validate).
+def find_dump_anchor(start_dir):
+ d = start_dir
+ for _ in range(15):
+ if not d:
+ break
+ if _sg_is_external_root(d + ".xml"):
+ return d + ".xml"
+ cfg = os.path.join(d, "Configuration.xml")
+ if os.path.exists(cfg):
+ return cfg
+ parent = os.path.dirname(d)
+ if not parent or parent == d:
+ break
+ d = parent
+ return None
+
+
def main():
sys.stdout.reconfigure(encoding="utf-8")
sys.stderr.reconfigure(encoding="utf-8")
@@ -368,6 +418,37 @@ def main():
else:
r.ok('13. UseOneCommand: false (no constraint)')
+ # --- 14. Format version: тела Ext/*.xml — как у дескриптора; сверка с выгрузкой ---
+ # Дескриптор подсистемы и её штампованные тела (CommandInterface.xml, Help.xml) платформа загружает
+ # только в одной версии формата: «Версия формата загружаемого файла … отличается от версии формата
+ # ранее загруженных файлов». Вложенные подсистемы — отдельные объекты. С остальной выгрузкой
+ # подсистема может расходиться — платформа такое грузит, это лишь неоднородность выгрузки (типично
+ # после мержа веток, выгруженных разными платформами).
+ if version:
+ sub_ext_dir = os.path.join(parent_dir2, base_name2, 'Ext')
+ ver_bodies_ok = 0
+ ver_errors = 0
+ if os.path.isdir(sub_ext_dir):
+ body_names = sorted(n for n in os.listdir(sub_ext_dir)
+ if n.lower().endswith('.xml') and os.path.isfile(os.path.join(sub_ext_dir, n)))
+ for bn in body_names:
+ body_ver = root_version(os.path.join(sub_ext_dir, bn))
+ if not body_ver:
+ continue
+ if body_ver == version:
+ ver_bodies_ok += 1
+ continue
+ ver_errors += 1
+ r.error(f'14. Format version: {base_name2}/Ext/{bn} is stamped {body_ver}, the descriptor {version} '
+ '— the platform refuses to load parts of one object in different formats')
+ dump_anchor = find_dump_anchor(parent_dir2)
+ dump_ver = root_version(dump_anchor) if dump_anchor else None
+ if dump_ver and version != dump_ver:
+ r.warn(f'14. Format version {version} differs from the dump ({dump_ver}) — the platform loads it, '
+ 'but the dump is no longer uniform (typical after merging branches dumped by different platforms)')
+ elif ver_errors == 0 and (ver_bodies_ok > 0 or dump_ver):
+ r.ok(f'14. Format version: {version}, matches the stamped parts and the dump')
+
# --- Finalize ---
checks = r.ok_count + r.errors + r.warnings
if r.errors == 0 and r.warnings == 0 and not detailed:
diff --git a/tests/skills/cases/subsystem-validate/error-version-body-differs.json b/tests/skills/cases/subsystem-validate/error-version-body-differs.json
new file mode 100644
index 000000000..24f9c3ed1
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/error-version-body-differs.json
@@ -0,0 +1,9 @@
+{
+ "name": "Командный интерфейс подсистемы 2.18 при дескрипторе 2.20 — ошибка: платформа такую подсистему не загрузит",
+ "setup": "fixture:subsystem-version-differs",
+ "params": { "subsystemPath": "Subsystems/Склад.xml" },
+ "expectError": true,
+ "noSnapshot": "subsystem-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": { "stdoutContains": ["[ERROR] 14. Format version: Склад/Ext/CommandInterface.xml is stamped 2.18, the descriptor 2.20"] },
+ "skipPlatformVerify": "фикстура намеренно не загружается: командный интерфейс и дескриптор подсистемы в разных версиях формата"
+}
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары.xml
new file mode 100644
index 000000000..24289f7ea
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 51817524-0f51-477b-a7c7-1d138827d74e
+ 97a1c4d0-6128-45db-ab0c-7266a602316f
+
+
+ cbb1f27e-a394-42ba-b66e-62302b91c23e
+ 797982e6-63e0-4d0a-8864-eba03a24b569
+
+
+ a8195e0f-2517-447d-ae31-9963e54dce59
+ 2ea7dad5-4eb4-4357-a778-4cacd99cf6fc
+
+
+ 7dee1910-f5a7-4ef8-8627-c2719a9a18a3
+ 749266d7-1797-470b-8204-4cf8d8a65395
+
+
+ a1d85fe4-e316-4ab4-9b2b-945d41e93893
+ e7a7760f-05d2-4a1b-ba5a-31e71d50662d
+
+
+
+ Товары
+
+
+ ru
+ Товары
+
+
+
+ false
+ HierarchyFoldersAndItems
+ false
+ 2
+ true
+ true
+
+ ToItems
+ 9
+ 25
+ String
+ Variable
+ WholeCatalog
+ false
+ true
+ AsDescription
+
+ Auto
+ InDialog
+ false
+ BothWays
+
+ Catalog.Товары.StandardAttribute.Description
+ Catalog.Товары.StandardAttribute.Code
+
+ Begin
+ DontUse
+ Directly
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ Managed
+ Use
+
+
+
+
+
+ Use
+ Auto
+ DontUse
+ false
+ false
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..5f282702b
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Configuration.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Configuration.xml
new file mode 100644
index 000000000..2fa0a5073
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Configuration.xml
@@ -0,0 +1,257 @@
+
+
+
+
+
+ 9cd510cd-abfc-11d4-9434-004095e12fc7
+ 0ad62760-b331-4346-8e8b-3e42b90a60c4
+
+
+ 9fcd25a0-4822-11d4-9414-008048da11f9
+ 9614422d-809e-4c50-8feb-efef235571fb
+
+
+ e3687481-0a87-462c-a166-9f34594f9bba
+ 41f6317a-5456-43db-97a2-33c31681aee3
+
+
+ 9de14907-ec23-4a07-96f0-85521cb6b53b
+ 7bbf04ce-053d-4bd1-9502-df44d2c14b6d
+
+
+ 51f2d5d8-ea4d-4064-8892-82951750031e
+ 834b09af-82fa-42ed-9a97-05202b126864
+
+
+ e68182ea-4237-4383-967f-90c1e3370bc7
+ 1bdafb28-bc70-4011-8de1-63af7a7ebc07
+
+
+ fb282519-d103-4dd3-bc12-cb271d631dfc
+ a6e1fc3f-c614-42cf-a681-36646a1f56b7
+
+
+
+ ПроверкаВерсий
+
+
+ ru
+ ПроверкаВерсий
+
+
+
+
+ Version8_3_27
+ ManagedApplication
+
+ PlatformApplication
+
+ Russian
+
+
+
+
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Biometrics
+ true
+
+
+ Location
+ false
+
+
+ BackgroundLocation
+ false
+
+
+ BluetoothPrinters
+ false
+
+
+ WiFiPrinters
+ false
+
+
+ Contacts
+ false
+
+
+ Calendars
+ false
+
+
+ PushNotifications
+ false
+
+
+ LocalNotifications
+ false
+
+
+ InAppPurchases
+ false
+
+
+ PersonalComputerFileExchange
+ false
+
+
+ Ads
+ false
+
+
+ NumberDialing
+ false
+
+
+ CallProcessing
+ false
+
+
+ CallLog
+ false
+
+
+ AutoSendSMS
+ false
+
+
+ ReceiveSMS
+ false
+
+
+ SMSLog
+ false
+
+
+ Camera
+ false
+
+
+ Microphone
+ false
+
+
+ MusicLibrary
+ false
+
+
+ PictureAndVideoLibraries
+ false
+
+
+ AudioPlaybackAndVibration
+ false
+
+
+ BackgroundAudioPlaybackAndVibration
+ false
+
+
+ InstallPackages
+ false
+
+
+ OSBackup
+ true
+
+
+ ApplicationUsageStatistics
+ false
+
+
+ BarcodeScanning
+ false
+
+
+ BackgroundAudioRecording
+ false
+
+
+ AllFilesAccess
+ false
+
+
+ Videoconferences
+ false
+
+
+ NFC
+ false
+
+
+ DocumentScanning
+ false
+
+
+ SpeechToText
+ false
+
+
+ Geofences
+ false
+
+
+ IncomingShareRequests
+ false
+
+
+ AllIncomingShareRequestsTypesProcessing
+ false
+
+
+ TextToSpeech
+ false
+
+
+
+
+
+ Normal
+
+
+ Language.Русский
+
+
+
+
+
+ Managed
+ NotAutoFree
+ DontUse
+ DontUse
+ TaxiEnableVersion8_2
+ DontUse
+ Version8_3_27
+
+
+
+ Русский
+ Склад
+ Товары
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Ext/ClientApplicationInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..e10c2790c
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Ext/ClientApplicationInterface.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ cbab57f2-a0f3-4f0a-89ea-4cb19570ab75
+
+
+
+
+ b553047f-c9aa-4157-978d-448ecad24248
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Languages/Русский.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Languages/Русский.xml
new file mode 100644
index 000000000..39e8b5bd6
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад.xml
new file mode 100644
index 000000000..d3c69ce44
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад.xml
@@ -0,0 +1,24 @@
+
+
+
+
+ Склад
+
+
+ ru
+ Склад
+
+
+
+ true
+ true
+ false
+
+
+
+ Catalog.Товары
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад/Ext/CommandInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад/Ext/CommandInterface.xml
new file mode 100644
index 000000000..4e7d40103
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад/Ext/CommandInterface.xml
@@ -0,0 +1,6 @@
+
+
+
+ false
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары.xml
new file mode 100644
index 000000000..24289f7ea
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 51817524-0f51-477b-a7c7-1d138827d74e
+ 97a1c4d0-6128-45db-ab0c-7266a602316f
+
+
+ cbb1f27e-a394-42ba-b66e-62302b91c23e
+ 797982e6-63e0-4d0a-8864-eba03a24b569
+
+
+ a8195e0f-2517-447d-ae31-9963e54dce59
+ 2ea7dad5-4eb4-4357-a778-4cacd99cf6fc
+
+
+ 7dee1910-f5a7-4ef8-8627-c2719a9a18a3
+ 749266d7-1797-470b-8204-4cf8d8a65395
+
+
+ a1d85fe4-e316-4ab4-9b2b-945d41e93893
+ e7a7760f-05d2-4a1b-ba5a-31e71d50662d
+
+
+
+ Товары
+
+
+ ru
+ Товары
+
+
+
+ false
+ HierarchyFoldersAndItems
+ false
+ 2
+ true
+ true
+
+ ToItems
+ 9
+ 25
+ String
+ Variable
+ WholeCatalog
+ false
+ true
+ AsDescription
+
+ Auto
+ InDialog
+ false
+ BothWays
+
+ Catalog.Товары.StandardAttribute.Description
+ Catalog.Товары.StandardAttribute.Code
+
+ Begin
+ DontUse
+ Directly
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ Managed
+ Use
+
+
+
+
+
+ Use
+ Auto
+ DontUse
+ false
+ false
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..5f282702b
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары/Ext/ObjectModule.bsl
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Configuration.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Configuration.xml
new file mode 100644
index 000000000..2fa0a5073
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Configuration.xml
@@ -0,0 +1,257 @@
+
+
+
+
+
+ 9cd510cd-abfc-11d4-9434-004095e12fc7
+ 0ad62760-b331-4346-8e8b-3e42b90a60c4
+
+
+ 9fcd25a0-4822-11d4-9414-008048da11f9
+ 9614422d-809e-4c50-8feb-efef235571fb
+
+
+ e3687481-0a87-462c-a166-9f34594f9bba
+ 41f6317a-5456-43db-97a2-33c31681aee3
+
+
+ 9de14907-ec23-4a07-96f0-85521cb6b53b
+ 7bbf04ce-053d-4bd1-9502-df44d2c14b6d
+
+
+ 51f2d5d8-ea4d-4064-8892-82951750031e
+ 834b09af-82fa-42ed-9a97-05202b126864
+
+
+ e68182ea-4237-4383-967f-90c1e3370bc7
+ 1bdafb28-bc70-4011-8de1-63af7a7ebc07
+
+
+ fb282519-d103-4dd3-bc12-cb271d631dfc
+ a6e1fc3f-c614-42cf-a681-36646a1f56b7
+
+
+
+ ПроверкаВерсий
+
+
+ ru
+ ПроверкаВерсий
+
+
+
+
+ Version8_3_27
+ ManagedApplication
+
+ PlatformApplication
+
+ Russian
+
+
+
+
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Biometrics
+ true
+
+
+ Location
+ false
+
+
+ BackgroundLocation
+ false
+
+
+ BluetoothPrinters
+ false
+
+
+ WiFiPrinters
+ false
+
+
+ Contacts
+ false
+
+
+ Calendars
+ false
+
+
+ PushNotifications
+ false
+
+
+ LocalNotifications
+ false
+
+
+ InAppPurchases
+ false
+
+
+ PersonalComputerFileExchange
+ false
+
+
+ Ads
+ false
+
+
+ NumberDialing
+ false
+
+
+ CallProcessing
+ false
+
+
+ CallLog
+ false
+
+
+ AutoSendSMS
+ false
+
+
+ ReceiveSMS
+ false
+
+
+ SMSLog
+ false
+
+
+ Camera
+ false
+
+
+ Microphone
+ false
+
+
+ MusicLibrary
+ false
+
+
+ PictureAndVideoLibraries
+ false
+
+
+ AudioPlaybackAndVibration
+ false
+
+
+ BackgroundAudioPlaybackAndVibration
+ false
+
+
+ InstallPackages
+ false
+
+
+ OSBackup
+ true
+
+
+ ApplicationUsageStatistics
+ false
+
+
+ BarcodeScanning
+ false
+
+
+ BackgroundAudioRecording
+ false
+
+
+ AllFilesAccess
+ false
+
+
+ Videoconferences
+ false
+
+
+ NFC
+ false
+
+
+ DocumentScanning
+ false
+
+
+ SpeechToText
+ false
+
+
+ Geofences
+ false
+
+
+ IncomingShareRequests
+ false
+
+
+ AllIncomingShareRequestsTypesProcessing
+ false
+
+
+ TextToSpeech
+ false
+
+
+
+
+
+ Normal
+
+
+ Language.Русский
+
+
+
+
+
+ Managed
+ NotAutoFree
+ DontUse
+ DontUse
+ TaxiEnableVersion8_2
+ DontUse
+ Version8_3_27
+
+
+
+ Русский
+ Склад
+ Товары
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Ext/ClientApplicationInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..e10c2790c
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Ext/ClientApplicationInterface.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ cbab57f2-a0f3-4f0a-89ea-4cb19570ab75
+
+
+
+
+ b553047f-c9aa-4157-978d-448ecad24248
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Languages/Русский.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Languages/Русский.xml
new file mode 100644
index 000000000..39e8b5bd6
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад.xml
new file mode 100644
index 000000000..d3c69ce44
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад.xml
@@ -0,0 +1,24 @@
+
+
+
+
+ Склад
+
+
+ ru
+ Склад
+
+
+
+ true
+ true
+ false
+
+
+
+ Catalog.Товары
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад/Ext/CommandInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад/Ext/CommandInterface.xml
new file mode 100644
index 000000000..eab47eb6d
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад/Ext/CommandInterface.xml
@@ -0,0 +1,6 @@
+
+
+
+ false
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары.xml
new file mode 100644
index 000000000..24289f7ea
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 51817524-0f51-477b-a7c7-1d138827d74e
+ 97a1c4d0-6128-45db-ab0c-7266a602316f
+
+
+ cbb1f27e-a394-42ba-b66e-62302b91c23e
+ 797982e6-63e0-4d0a-8864-eba03a24b569
+
+
+ a8195e0f-2517-447d-ae31-9963e54dce59
+ 2ea7dad5-4eb4-4357-a778-4cacd99cf6fc
+
+
+ 7dee1910-f5a7-4ef8-8627-c2719a9a18a3
+ 749266d7-1797-470b-8204-4cf8d8a65395
+
+
+ a1d85fe4-e316-4ab4-9b2b-945d41e93893
+ e7a7760f-05d2-4a1b-ba5a-31e71d50662d
+
+
+
+ Товары
+
+
+ ru
+ Товары
+
+
+
+ false
+ HierarchyFoldersAndItems
+ false
+ 2
+ true
+ true
+
+ ToItems
+ 9
+ 25
+ String
+ Variable
+ WholeCatalog
+ false
+ true
+ AsDescription
+
+ Auto
+ InDialog
+ false
+ BothWays
+
+ Catalog.Товары.StandardAttribute.Description
+ Catalog.Товары.StandardAttribute.Code
+
+ Begin
+ DontUse
+ Directly
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ Managed
+ Use
+
+
+
+
+
+ Use
+ Auto
+ DontUse
+ false
+ false
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..5f282702b
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары/Ext/ObjectModule.bsl
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Configuration.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Configuration.xml
new file mode 100644
index 000000000..2fa0a5073
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Configuration.xml
@@ -0,0 +1,257 @@
+
+
+
+
+
+ 9cd510cd-abfc-11d4-9434-004095e12fc7
+ 0ad62760-b331-4346-8e8b-3e42b90a60c4
+
+
+ 9fcd25a0-4822-11d4-9414-008048da11f9
+ 9614422d-809e-4c50-8feb-efef235571fb
+
+
+ e3687481-0a87-462c-a166-9f34594f9bba
+ 41f6317a-5456-43db-97a2-33c31681aee3
+
+
+ 9de14907-ec23-4a07-96f0-85521cb6b53b
+ 7bbf04ce-053d-4bd1-9502-df44d2c14b6d
+
+
+ 51f2d5d8-ea4d-4064-8892-82951750031e
+ 834b09af-82fa-42ed-9a97-05202b126864
+
+
+ e68182ea-4237-4383-967f-90c1e3370bc7
+ 1bdafb28-bc70-4011-8de1-63af7a7ebc07
+
+
+ fb282519-d103-4dd3-bc12-cb271d631dfc
+ a6e1fc3f-c614-42cf-a681-36646a1f56b7
+
+
+
+ ПроверкаВерсий
+
+
+ ru
+ ПроверкаВерсий
+
+
+
+
+ Version8_3_27
+ ManagedApplication
+
+ PlatformApplication
+
+ Russian
+
+
+
+
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Biometrics
+ true
+
+
+ Location
+ false
+
+
+ BackgroundLocation
+ false
+
+
+ BluetoothPrinters
+ false
+
+
+ WiFiPrinters
+ false
+
+
+ Contacts
+ false
+
+
+ Calendars
+ false
+
+
+ PushNotifications
+ false
+
+
+ LocalNotifications
+ false
+
+
+ InAppPurchases
+ false
+
+
+ PersonalComputerFileExchange
+ false
+
+
+ Ads
+ false
+
+
+ NumberDialing
+ false
+
+
+ CallProcessing
+ false
+
+
+ CallLog
+ false
+
+
+ AutoSendSMS
+ false
+
+
+ ReceiveSMS
+ false
+
+
+ SMSLog
+ false
+
+
+ Camera
+ false
+
+
+ Microphone
+ false
+
+
+ MusicLibrary
+ false
+
+
+ PictureAndVideoLibraries
+ false
+
+
+ AudioPlaybackAndVibration
+ false
+
+
+ BackgroundAudioPlaybackAndVibration
+ false
+
+
+ InstallPackages
+ false
+
+
+ OSBackup
+ true
+
+
+ ApplicationUsageStatistics
+ false
+
+
+ BarcodeScanning
+ false
+
+
+ BackgroundAudioRecording
+ false
+
+
+ AllFilesAccess
+ false
+
+
+ Videoconferences
+ false
+
+
+ NFC
+ false
+
+
+ DocumentScanning
+ false
+
+
+ SpeechToText
+ false
+
+
+ Geofences
+ false
+
+
+ IncomingShareRequests
+ false
+
+
+ AllIncomingShareRequestsTypesProcessing
+ false
+
+
+ TextToSpeech
+ false
+
+
+
+
+
+ Normal
+
+
+ Language.Русский
+
+
+
+
+
+ Managed
+ NotAutoFree
+ DontUse
+ DontUse
+ TaxiEnableVersion8_2
+ DontUse
+ Version8_3_27
+
+
+
+ Русский
+ Склад
+ Товары
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Ext/ClientApplicationInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..e10c2790c
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Ext/ClientApplicationInterface.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ cbab57f2-a0f3-4f0a-89ea-4cb19570ab75
+
+
+
+
+ b553047f-c9aa-4157-978d-448ecad24248
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Languages/Русский.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Languages/Русский.xml
new file mode 100644
index 000000000..39e8b5bd6
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад.xml
new file mode 100644
index 000000000..2eb3c9cee
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад.xml
@@ -0,0 +1,24 @@
+
+
+
+
+ Склад
+
+
+ ru
+ Склад
+
+
+
+ true
+ true
+ false
+
+
+
+ Catalog.Товары
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад/Ext/CommandInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад/Ext/CommandInterface.xml
new file mode 100644
index 000000000..eab47eb6d
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад/Ext/CommandInterface.xml
@@ -0,0 +1,6 @@
+
+
+
+ false
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/subsystem-validate/valid-version-parts-agree.json b/tests/skills/cases/subsystem-validate/valid-version-parts-agree.json
new file mode 100644
index 000000000..a67e60437
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/valid-version-parts-agree.json
@@ -0,0 +1,7 @@
+{
+ "name": "Подсистема и её командный интерфейс в одной версии с выгрузкой — чисто",
+ "setup": "fixture:subsystem-version-agree",
+ "params": { "subsystemPath": "Subsystems/Склад.xml" },
+ "noSnapshot": "subsystem-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": { "stdoutContains": ["=== Validation OK: Subsystem.Склад"] }
+}
diff --git a/tests/skills/cases/subsystem-validate/warn-version-differs-from-dump.json b/tests/skills/cases/subsystem-validate/warn-version-differs-from-dump.json
new file mode 100644
index 000000000..7fc1c6b7d
--- /dev/null
+++ b/tests/skills/cases/subsystem-validate/warn-version-differs-from-dump.json
@@ -0,0 +1,10 @@
+{
+ "name": "Подсистема целиком в 2.18 в выгрузке 2.20 (мерж веток) — только предупреждение: платформа такое грузит",
+ "setup": "fixture:subsystem-version-older",
+ "params": { "subsystemPath": "Subsystems/Склад.xml" },
+ "noSnapshot": "subsystem-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": {
+ "stdoutContains": ["[WARN] 14. Format version 2.18 differs from the dump (2.20) — the platform loads it"],
+ "stdoutNotContains": ["[ERROR]"]
+ }
+}
diff --git a/tests/skills/check-inline-drift.mjs b/tests/skills/check-inline-drift.mjs
index 10beb2101..3b3920ab2 100644
--- a/tests/skills/check-inline-drift.mjs
+++ b/tests/skills/check-inline-drift.mjs
@@ -81,7 +81,7 @@ const FAMILIES = [
'form-info', 'meta-info', 'mxl-info', 'role-info', 'skd-info', 'subsystem-info',
// Валидаторы отличают автономную обработку от конфигурации: тот же корень — якорь выгрузки
// для сверки штампа версии (find_dump_anchor)
- 'form-validate', 'interface-validate', 'meta-validate', 'role-validate'] },
+ 'form-validate', 'interface-validate', 'meta-validate', 'role-validate', 'subsystem-validate'] },
],
},
{
@@ -130,13 +130,13 @@ const FAMILIES = [
{
name: 'root_version', py: 'root_version', ps1: 'Get-RootVersion',
variants: [
- { id: 'base', authority: 'meta-validate', consumers: ['cf-validate', 'form-validate', 'interface-validate', 'role-validate'] },
+ { id: 'base', authority: 'meta-validate', consumers: ['cf-validate', 'form-validate', 'interface-validate', 'role-validate', 'subsystem-validate'] },
],
},
{
name: 'find_dump_anchor', py: 'find_dump_anchor', ps1: 'Find-DumpAnchor',
variants: [
- { id: 'base', authority: 'meta-validate', consumers: ['form-validate', 'interface-validate', 'role-validate'] },
+ { id: 'base', authority: 'meta-validate', consumers: ['form-validate', 'interface-validate', 'role-validate', 'subsystem-validate'] },
],
},
{