diff --git a/.claude/skills/role-validate/scripts/role-validate.ps1 b/.claude/skills/role-validate/scripts/role-validate.ps1
index 7476ab880..ff9b5d804 100644
--- a/.claude/skills/role-validate/scripts/role-validate.ps1
+++ b/.claude/skills/role-validate/scripts/role-validate.ps1
@@ -1,4 +1,4 @@
-# role-validate v1.6 — Validate 1C role structure
+# role-validate v1.7 — Validate 1C role structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -297,6 +297,61 @@ function Find-Similar {
return $result
}
+# Штамп версии формата — атрибут 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
+}
+
+# Владелец тела X/Ext/<файл>.xml — дескриптор X.xml рядом с каталогом X. Копия общего эталона
+# (семья ext_body_owner, авторитет — form-validate).
+function Get-ExtBodyOwner([string]$bodyPath) {
+ $extDir = [System.IO.Path]::GetDirectoryName($bodyPath)
+ if ([System.IO.Path]::GetFileName($extDir) -cne "Ext") { return $null }
+ $objDir = [System.IO.Path]::GetDirectoryName($extDir)
+ if (Test-Path -LiteralPath "$objDir.xml" -PathType Leaf) { return "$objDir.xml" }
+ $cfg = Join-Path $objDir "Configuration.xml"
+ if (Test-Path -LiteralPath $cfg -PathType Leaf) { return $cfg }
+ return $null
+}
+
# --- Resolve path ---
if (-not [System.IO.Path]::IsPathRooted($RightsPath)) {
$RightsPath = Join-Path (Get-Location).Path $RightsPath
@@ -552,6 +607,26 @@ if (Test-Path $MetadataPath) {
}
}
+# --- 4b. Format version: Rights.xml — как у дескриптора роли; сверка с выгрузкой ---
+# Права и дескриптор роли платформа загружает только в одной версии формата: «Версия формата
+# загружаемого файла … отличается от версии формата ранее загруженных файлов». С остальной выгрузкой
+# роль может расходиться — платформа такое грузит, это лишь неоднородность выгрузки (типично после
+# мержа веток, выгруженных разными платформами).
+$rightsVer = $root.GetAttribute("version")
+if ($rightsVer) {
+ $ownerPath = Get-ExtBodyOwner $resolvedRights
+ $ownerVer = if ($ownerPath) { Get-RootVersion $ownerPath } else { $null }
+ $dumpAnchor = Find-DumpAnchor (Split-Path $resolvedRights -Parent)
+ $dumpVer = if ($dumpAnchor) { Get-RootVersion $dumpAnchor } else { $null }
+ if ($ownerVer -and $rightsVer -ne $ownerVer) {
+ Report-Error "Format version $rightsVer differs from the role descriptor $([System.IO.Path]::GetFileName($ownerPath)) ($ownerVer) — the platform refuses to load parts of one object in different formats"
+ } elseif ($dumpVer -and $rightsVer -ne $dumpVer) {
+ Report-Warn "Format version $rightsVer 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 ($ownerVer -or $dumpVer) {
+ Report-OK "Format version: $rightsVer, matches the descriptor and the dump"
+ }
+}
+
# --- 5. Check registration in Configuration.xml ---
$configDir = Split-Path $rolesDir -Parent
diff --git a/.claude/skills/role-validate/scripts/role-validate.py b/.claude/skills/role-validate/scripts/role-validate.py
index f4c2ada40..307ab493d 100644
--- a/.claude/skills/role-validate/scripts/role-validate.py
+++ b/.claude/skills/role-validate/scripts/role-validate.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# role-validate v1.6 — Validate 1C role Rights.xml structure
+# role-validate v1.7 — Validate 1C role Rights.xml structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
"""Validates role Rights.xml: root element, global flags, objects, rights, RLS, templates."""
import sys, os, argparse, re
@@ -298,6 +298,71 @@ def get_child_el(parent, local_name, ns):
return None
+# Штамп версии формата — атрибут 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
+
+
+# Владелец тела X/Ext/<файл>.xml — дескриптор X.xml рядом с каталогом X. Копия общего эталона
+# (семья ext_body_owner, авторитет — form-validate).
+def ext_body_owner(body_path):
+ ext_dir = os.path.dirname(body_path)
+ if os.path.basename(ext_dir) != "Ext":
+ return None
+ obj_dir = os.path.dirname(ext_dir)
+ if os.path.isfile(obj_dir + ".xml"):
+ return obj_dir + ".xml"
+ cfg = os.path.join(obj_dir, "Configuration.xml")
+ if os.path.isfile(cfg):
+ return cfg
+ return None
+
+
def main():
sys.stdout.reconfigure(encoding="utf-8")
sys.stderr.reconfigure(encoding="utf-8")
@@ -600,6 +665,27 @@ def main():
except etree.XMLSyntaxError as e:
report_error(f'Metadata XML parse error: {e}')
+ # --- 4b. Format version: Rights.xml — как у дескриптора роли; сверка с выгрузкой ---
+ # Права и дескриптор роли платформа загружает только в одной версии формата: «Версия формата
+ # загружаемого файла … отличается от версии формата ранее загруженных файлов». С остальной выгрузкой
+ # роль может расходиться — платформа такое грузит, это лишь неоднородность выгрузки (типично после
+ # мержа веток, выгруженных разными платформами).
+ rights_ver = root.get('version', '')
+ if rights_ver:
+ owner_path = ext_body_owner(resolved_path)
+ owner_ver = root_version(owner_path) if owner_path else None
+ dump_anchor = find_dump_anchor(os.path.dirname(resolved_path))
+ dump_ver = root_version(dump_anchor) if dump_anchor else None
+ if owner_ver and rights_ver != owner_ver:
+ report_error(f'Format version {rights_ver} differs from the role descriptor '
+ f'{os.path.basename(owner_path)} ({owner_ver}) '
+ '— the platform refuses to load parts of one object in different formats')
+ elif dump_ver and rights_ver != dump_ver:
+ report_warn(f'Format version {rights_ver} 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 owner_ver or dump_ver:
+ report_ok(f'Format version: {rights_ver}, matches the descriptor and the dump')
+
# --- 5. Check registration in Configuration.xml ---
config_dir = os.path.dirname(roles_dir) # config root
config_xml_path = os.path.join(config_dir, 'Configuration.xml')
diff --git a/tests/skills/cases/role-validate/error-version-differs-from-descriptor.json b/tests/skills/cases/role-validate/error-version-differs-from-descriptor.json
new file mode 100644
index 000000000..6bf447593
--- /dev/null
+++ b/tests/skills/cases/role-validate/error-version-differs-from-descriptor.json
@@ -0,0 +1,9 @@
+{
+ "name": "Rights.xml 2.18 при дескрипторе роли 2.20 — ошибка: платформа такую роль не загрузит",
+ "setup": "fixture:role-version-rights-differs",
+ "params": { "rightsPath": "Roles/Пользователь/Ext/Rights.xml" },
+ "expectError": true,
+ "noSnapshot": "role-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": { "stdoutContains": ["Format version 2.18 differs from the role descriptor Пользователь.xml (2.20)"] },
+ "skipPlatformVerify": "фикстура намеренно не загружается: права и дескриптор роли в разных версиях формата"
+}
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары.xml
new file mode 100644
index 000000000..5222eeabc
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 4cc74a39-0ac3-4986-af39-86de1e68dcc8
+ 35a64904-a3dc-4c45-9241-3177c8319fca
+
+
+ 2406a38b-bc60-4e58-8f4f-8e031edfbfda
+ eb915d43-0b7e-4ae8-92cd-7c7aea239e17
+
+
+ bedd8eca-9bfe-4eda-a377-3088cdaf2d39
+ 2b694379-fd05-449e-85cb-4ca0937547fc
+
+
+ 3777ac4b-06c8-4a1a-82eb-1f67d2570807
+ e8f8e58d-8ef1-4a69-8027-4c617b3fad95
+
+
+ ec2ab36f-f905-4829-bdd5-7fcf10a87e7b
+ b2f8b1a9-f56e-43e4-a227-8757e6f82a07
+
+
+
+ Товары
+
+
+ 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/role-validate/fixtures/role-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..5f282702b
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-agree/Configuration.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Configuration.xml
new file mode 100644
index 000000000..d109570a9
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Configuration.xml
@@ -0,0 +1,257 @@
+
+
+
+
+
+ 9cd510cd-abfc-11d4-9434-004095e12fc7
+ 21f02fb0-500d-4b6f-ac46-342ec5f0e0bf
+
+
+ 9fcd25a0-4822-11d4-9414-008048da11f9
+ d6224327-f7d0-4afa-8873-ebe468a6e816
+
+
+ e3687481-0a87-462c-a166-9f34594f9bba
+ 615275b4-f92f-4e16-bffa-218db24552bc
+
+
+ 9de14907-ec23-4a07-96f0-85521cb6b53b
+ e96bc620-c6bf-4abd-9815-2cc8de050529
+
+
+ 51f2d5d8-ea4d-4064-8892-82951750031e
+ cef4bcf2-bdd0-4a2d-9ad0-39fecd55235d
+
+
+ e68182ea-4237-4383-967f-90c1e3370bc7
+ df527126-d976-4263-874c-b529dec2bdea
+
+
+ fb282519-d103-4dd3-bc12-cb271d631dfc
+ 3235a01a-a49f-4145-9d15-3092f0be8e41
+
+
+
+ ПроверкаВерсий
+
+
+ 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/role-validate/fixtures/role-version-agree/Ext/ClientApplicationInterface.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..dc56d730f
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-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/role-validate/fixtures/role-version-agree/Languages/Русский.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Languages/Русский.xml
new file mode 100644
index 000000000..8f3faf0ff
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь.xml
new file mode 100644
index 000000000..f2322914a
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ Пользователь
+
+
+ ru
+ Пользователь
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь/Ext/Rights.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь/Ext/Rights.xml
new file mode 100644
index 000000000..2ff5c1b79
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь/Ext/Rights.xml
@@ -0,0 +1,21 @@
+
+
+ false
+ true
+ false
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары.xml
new file mode 100644
index 000000000..5222eeabc
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 4cc74a39-0ac3-4986-af39-86de1e68dcc8
+ 35a64904-a3dc-4c45-9241-3177c8319fca
+
+
+ 2406a38b-bc60-4e58-8f4f-8e031edfbfda
+ eb915d43-0b7e-4ae8-92cd-7c7aea239e17
+
+
+ bedd8eca-9bfe-4eda-a377-3088cdaf2d39
+ 2b694379-fd05-449e-85cb-4ca0937547fc
+
+
+ 3777ac4b-06c8-4a1a-82eb-1f67d2570807
+ e8f8e58d-8ef1-4a69-8027-4c617b3fad95
+
+
+ ec2ab36f-f905-4829-bdd5-7fcf10a87e7b
+ b2f8b1a9-f56e-43e4-a227-8757e6f82a07
+
+
+
+ Товары
+
+
+ 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/role-validate/fixtures/role-version-older/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..5f282702b
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары/Ext/ObjectModule.bsl
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-older/Configuration.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Configuration.xml
new file mode 100644
index 000000000..d109570a9
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Configuration.xml
@@ -0,0 +1,257 @@
+
+
+
+
+
+ 9cd510cd-abfc-11d4-9434-004095e12fc7
+ 21f02fb0-500d-4b6f-ac46-342ec5f0e0bf
+
+
+ 9fcd25a0-4822-11d4-9414-008048da11f9
+ d6224327-f7d0-4afa-8873-ebe468a6e816
+
+
+ e3687481-0a87-462c-a166-9f34594f9bba
+ 615275b4-f92f-4e16-bffa-218db24552bc
+
+
+ 9de14907-ec23-4a07-96f0-85521cb6b53b
+ e96bc620-c6bf-4abd-9815-2cc8de050529
+
+
+ 51f2d5d8-ea4d-4064-8892-82951750031e
+ cef4bcf2-bdd0-4a2d-9ad0-39fecd55235d
+
+
+ e68182ea-4237-4383-967f-90c1e3370bc7
+ df527126-d976-4263-874c-b529dec2bdea
+
+
+ fb282519-d103-4dd3-bc12-cb271d631dfc
+ 3235a01a-a49f-4145-9d15-3092f0be8e41
+
+
+
+ ПроверкаВерсий
+
+
+ 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/role-validate/fixtures/role-version-older/Ext/ClientApplicationInterface.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..dc56d730f
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-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/role-validate/fixtures/role-version-older/Languages/Русский.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Languages/Русский.xml
new file mode 100644
index 000000000..8f3faf0ff
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь.xml
new file mode 100644
index 000000000..305eb395d
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ Пользователь
+
+
+ ru
+ Пользователь
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь/Ext/Rights.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь/Ext/Rights.xml
new file mode 100644
index 000000000..c3121d4a4
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь/Ext/Rights.xml
@@ -0,0 +1,21 @@
+
+
+ false
+ true
+ false
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары.xml
new file mode 100644
index 000000000..5222eeabc
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+ 4cc74a39-0ac3-4986-af39-86de1e68dcc8
+ 35a64904-a3dc-4c45-9241-3177c8319fca
+
+
+ 2406a38b-bc60-4e58-8f4f-8e031edfbfda
+ eb915d43-0b7e-4ae8-92cd-7c7aea239e17
+
+
+ bedd8eca-9bfe-4eda-a377-3088cdaf2d39
+ 2b694379-fd05-449e-85cb-4ca0937547fc
+
+
+ 3777ac4b-06c8-4a1a-82eb-1f67d2570807
+ e8f8e58d-8ef1-4a69-8027-4c617b3fad95
+
+
+ ec2ab36f-f905-4829-bdd5-7fcf10a87e7b
+ b2f8b1a9-f56e-43e4-a227-8757e6f82a07
+
+
+
+ Товары
+
+
+ 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/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..5f282702b
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары/Ext/ObjectModule.bsl
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Configuration.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Configuration.xml
new file mode 100644
index 000000000..d109570a9
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Configuration.xml
@@ -0,0 +1,257 @@
+
+
+
+
+
+ 9cd510cd-abfc-11d4-9434-004095e12fc7
+ 21f02fb0-500d-4b6f-ac46-342ec5f0e0bf
+
+
+ 9fcd25a0-4822-11d4-9414-008048da11f9
+ d6224327-f7d0-4afa-8873-ebe468a6e816
+
+
+ e3687481-0a87-462c-a166-9f34594f9bba
+ 615275b4-f92f-4e16-bffa-218db24552bc
+
+
+ 9de14907-ec23-4a07-96f0-85521cb6b53b
+ e96bc620-c6bf-4abd-9815-2cc8de050529
+
+
+ 51f2d5d8-ea4d-4064-8892-82951750031e
+ cef4bcf2-bdd0-4a2d-9ad0-39fecd55235d
+
+
+ e68182ea-4237-4383-967f-90c1e3370bc7
+ df527126-d976-4263-874c-b529dec2bdea
+
+
+ fb282519-d103-4dd3-bc12-cb271d631dfc
+ 3235a01a-a49f-4145-9d15-3092f0be8e41
+
+
+
+ ПроверкаВерсий
+
+
+ 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/role-validate/fixtures/role-version-rights-differs/Ext/ClientApplicationInterface.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..dc56d730f
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-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/role-validate/fixtures/role-version-rights-differs/Languages/Русский.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Languages/Русский.xml
new file mode 100644
index 000000000..8f3faf0ff
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь.xml
new file mode 100644
index 000000000..f2322914a
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ Пользователь
+
+
+ ru
+ Пользователь
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь/Ext/Rights.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь/Ext/Rights.xml
new file mode 100644
index 000000000..c3121d4a4
--- /dev/null
+++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь/Ext/Rights.xml
@@ -0,0 +1,21 @@
+
+
+ false
+ true
+ false
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/role-validate/valid-version-matches-descriptor.json b/tests/skills/cases/role-validate/valid-version-matches-descriptor.json
new file mode 100644
index 000000000..3f362f378
--- /dev/null
+++ b/tests/skills/cases/role-validate/valid-version-matches-descriptor.json
@@ -0,0 +1,7 @@
+{
+ "name": "Rights.xml в версии дескриптора роли и выгрузки — чисто",
+ "setup": "fixture:role-version-agree",
+ "params": { "rightsPath": "Roles/Пользователь/Ext/Rights.xml" },
+ "noSnapshot": "role-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": { "stdoutContains": ["=== Validation OK: Role.Пользователь"] }
+}
diff --git a/tests/skills/cases/role-validate/warn-version-differs-from-dump.json b/tests/skills/cases/role-validate/warn-version-differs-from-dump.json
new file mode 100644
index 000000000..2def112e5
--- /dev/null
+++ b/tests/skills/cases/role-validate/warn-version-differs-from-dump.json
@@ -0,0 +1,10 @@
+{
+ "name": "Роль целиком в 2.18 в выгрузке 2.20 (мерж веток) — только предупреждение: платформа такое грузит",
+ "setup": "fixture:role-version-older",
+ "params": { "rightsPath": "Roles/Пользователь/Ext/Rights.xml" },
+ "noSnapshot": "role-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": {
+ "stdoutContains": ["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 99e25150c..5f6f304b6 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', 'meta-validate'] },
+ 'form-validate', 'meta-validate', 'role-validate'] },
],
},
{
@@ -130,19 +130,19 @@ const FAMILIES = [
{
name: 'root_version', py: 'root_version', ps1: 'Get-RootVersion',
variants: [
- { id: 'base', authority: 'meta-validate', consumers: ['cf-validate', 'form-validate'] },
+ { id: 'base', authority: 'meta-validate', consumers: ['cf-validate', 'form-validate', 'role-validate'] },
],
},
{
name: 'find_dump_anchor', py: 'find_dump_anchor', ps1: 'Find-DumpAnchor',
variants: [
- { id: 'base', authority: 'meta-validate', consumers: ['form-validate'] },
+ { id: 'base', authority: 'meta-validate', consumers: ['form-validate', 'role-validate'] },
],
},
{
name: 'ext_body_owner', py: 'ext_body_owner', ps1: 'Get-ExtBodyOwner',
variants: [
- { id: 'base', authority: 'form-validate', consumers: [] },
+ { id: 'base', authority: 'form-validate', consumers: ['role-validate'] },
],
},
{