diff --git a/.claude/skills/epf-validate/scripts/epf-validate.ps1 b/.claude/skills/epf-validate/scripts/epf-validate.ps1
index b565be9bd..f407ad830 100644
--- a/.claude/skills/epf-validate/scripts/epf-validate.ps1
+++ b/.claude/skills/epf-validate/scripts/epf-validate.ps1
@@ -1,4 +1,4 @@
-# epf-validate v1.7 — Validate 1C external data processor / report structure
+# epf-validate v1.8 — Validate 1C external data processor / report structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# Works for both EPF (ExternalDataProcessor) and ERF (ExternalReport) — auto-detects
[CmdletBinding(PositionalBinding=$false)]
@@ -125,6 +125,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}$'
@@ -862,6 +877,54 @@ if ($check10Ok) {
}
}
+# --- Check 11: версия формата согласована внутри объектов обработки; сверка с корнем ---
+# Корень обработки и его штампованные тела (Ext/Help.xml), дескриптор формы/макета и его тело платформа
+# загружает только в одной версии: «Версия формата загружаемого файла … отличается от версии формата
+# ранее загруженных файлов» — сборка отменяется. Форма или макет целиком в другой версии, чем корень,
+# собирается — это лишь неоднородность исходников (типично после мержа веток, выгруженных разными
+# платформами), поэтому такое расхождение только предупреждение.
+if ($version) {
+ $verObjDir = Join-Path $srcDir ([System.IO.Path]::GetFileNameWithoutExtension($resolvedPath))
+ $verDescriptors = @($resolvedPath)
+ foreach ($sub in @("Forms","Templates")) {
+ $subDir = Join-Path $verObjDir $sub
+ if (-not (Test-Path $subDir -PathType Container)) { continue }
+ $names = @(Get-ChildItem $subDir -Filter "*.xml" -File | ForEach-Object { $_.Name })
+ [Array]::Sort($names, [StringComparer]::Ordinal)
+ foreach ($n in $names) { $verDescriptors += (Join-Path $subDir $n) }
+ }
+ $verRel = { param($p) $p.Substring($srcDir.Length).TrimStart('\', '/') -replace '\\', '/' }
+ $verErrors = 0
+ $verBodiesOk = 0
+ $verOff = @()
+ foreach ($desc in $verDescriptors) {
+ if ($script:stopped) { break }
+ $descVer = if ($desc -eq $resolvedPath) { $version } else { Get-RootVersion $desc }
+ if (-not $descVer) { continue }
+ if ($desc -ne $resolvedPath -and $descVer -ne $version) { $verOff += "$(& $verRel $desc) $descVer" }
+ $extDir = Join-Path (Join-Path (Split-Path $desc) ([System.IO.Path]::GetFileNameWithoutExtension($desc))) "Ext"
+ if (-not (Test-Path $extDir -PathType Container)) { continue }
+ $bodyNames = @(Get-ChildItem $extDir -Filter "*.xml" -File | ForEach-Object { $_.Name })
+ [Array]::Sort($bodyNames, [StringComparer]::Ordinal)
+ foreach ($bn in $bodyNames) {
+ $body = Join-Path $extDir $bn
+ $bodyVer = Get-RootVersion $body
+ if (-not $bodyVer) { continue }
+ if ($bodyVer -eq $descVer) { $verBodiesOk++; continue }
+ $verErrors++
+ Report-Error "11. $(& $verRel $body) is stamped $bodyVer, its descriptor $(& $verRel $desc) $descVer — the platform refuses to load parts of one object in different formats"
+ if ($script:stopped) { break }
+ }
+ }
+ if ($verOff.Count -gt 0) {
+ $shown = ($verOff | Select-Object -First 5) -join ", "
+ if ($verOff.Count -gt 5) { $shown += ", … (+$($verOff.Count - 5))" }
+ Report-Warn "11. Format version differs from the processor root ($version): $shown — the platform builds it, but the sources are no longer uniform (typical after merging branches dumped by different platforms)"
+ } elseif ($verErrors -eq 0 -and $verBodiesOk -gt 0) {
+ Report-OK "11. Format version: $verBodiesOk stamped part(s) agree with their descriptors and the root"
+ }
+}
+
# --- Final output ---
& $finalize
diff --git a/.claude/skills/epf-validate/scripts/epf-validate.py b/.claude/skills/epf-validate/scripts/epf-validate.py
index be043e9ae..d5d2de458 100644
--- a/.claude/skills/epf-validate/scripts/epf-validate.py
+++ b/.claude/skills/epf-validate/scripts/epf-validate.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# epf-validate v1.7 — Validate 1C external data processor / report structure
+# epf-validate v1.8 — Validate 1C external data processor / report structure
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# Works for both EPF (ExternalDataProcessor) and ERF (ExternalReport) — auto-detects
@@ -75,6 +75,22 @@ def format_rank(ver):
return int(m.group(1)) * 100 + int(m.group(2)) if m else 0
+# Штамп версии формата — атрибут 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
+
+
def localname(el):
return etree.QName(el.tag).localname
@@ -749,6 +765,65 @@ def main():
else:
pass # no form descriptors to check
+ # --- Check 11: версия формата согласована внутри объектов обработки; сверка с корнем ---
+ # Корень обработки и его штампованные тела (Ext/Help.xml), дескриптор формы/макета и его тело платформа
+ # загружает только в одной версии: «Версия формата загружаемого файла … отличается от версии формата
+ # ранее загруженных файлов» — сборка отменяется. Форма или макет целиком в другой версии, чем корень,
+ # собирается — это лишь неоднородность исходников (типично после мержа веток, выгруженных разными
+ # платформами), поэтому такое расхождение только предупреждение.
+ if version:
+ ver_obj_dir = os.path.join(src_dir, os.path.splitext(os.path.basename(resolved_path))[0])
+ ver_descriptors = [resolved_path]
+ for sub in ("Forms", "Templates"):
+ sub_dir = os.path.join(ver_obj_dir, sub)
+ if not os.path.isdir(sub_dir):
+ continue
+ names = sorted(n for n in os.listdir(sub_dir)
+ if n.lower().endswith(".xml") and os.path.isfile(os.path.join(sub_dir, n)))
+ for n in names:
+ ver_descriptors.append(os.path.join(sub_dir, n))
+
+ def ver_rel(p):
+ return p[len(src_dir):].lstrip("\\/").replace("\\", "/")
+
+ ver_errors = 0
+ ver_bodies_ok = 0
+ ver_off = []
+ for desc in ver_descriptors:
+ if stopped:
+ break
+ desc_ver = version if desc == resolved_path else root_version(desc)
+ if not desc_ver:
+ continue
+ if desc != resolved_path and desc_ver != version:
+ ver_off.append(f"{ver_rel(desc)} {desc_ver}")
+ ext_dir = os.path.join(os.path.dirname(desc), os.path.splitext(os.path.basename(desc))[0], "Ext")
+ if not os.path.isdir(ext_dir):
+ continue
+ body_names = sorted(n for n in os.listdir(ext_dir)
+ if n.lower().endswith(".xml") and os.path.isfile(os.path.join(ext_dir, n)))
+ for bn in body_names:
+ body = os.path.join(ext_dir, bn)
+ body_ver = root_version(body)
+ if not body_ver:
+ continue
+ if body_ver == desc_ver:
+ ver_bodies_ok += 1
+ continue
+ ver_errors += 1
+ report_error(f"11. {ver_rel(body)} is stamped {body_ver}, its descriptor {ver_rel(desc)} {desc_ver} "
+ "— the platform refuses to load parts of one object in different formats")
+ if stopped:
+ break
+ if ver_off:
+ shown = ", ".join(ver_off[:5])
+ if len(ver_off) > 5:
+ shown += f", … (+{len(ver_off) - 5})"
+ report_warn(f"11. Format version differs from the processor root ({version}): {shown} — the platform builds it, "
+ "but the sources are no longer uniform (typical after merging branches dumped by different platforms)")
+ elif ver_errors == 0 and ver_bodies_ok > 0:
+ report_ok(f"11. Format version: {ver_bodies_ok} stamped part(s) agree with their descriptors and the root")
+
# --- Final output ---
finalize()
diff --git a/tests/skills/cases/epf-validate/error-version-form-body.json b/tests/skills/cases/epf-validate/error-version-form-body.json
new file mode 100644
index 000000000..af77982bc
--- /dev/null
+++ b/tests/skills/cases/epf-validate/error-version-form-body.json
@@ -0,0 +1,9 @@
+{
+ "name": "Тело формы 2.18 при её дескрипторе 2.20 — ошибка: платформа такую обработку не соберёт",
+ "setup": "fixture:epf-version-form-body",
+ "params": { "objectPath": "ПроверкаВерсий.xml" },
+ "expectError": true,
+ "noSnapshot": "epf-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": { "stdoutContains": ["[ERROR] 11. ПроверкаВерсий/Forms/Форма/Ext/Form.xml is stamped 2.18, its descriptor ПроверкаВерсий/Forms/Форма.xml 2.20"] },
+ "skipPlatformVerify": "фикстура намеренно не собирается: части одного объекта обработки в разных версиях формата"
+}
diff --git a/tests/skills/cases/epf-validate/error-version-help-body.json b/tests/skills/cases/epf-validate/error-version-help-body.json
new file mode 100644
index 000000000..b6dc2bb19
--- /dev/null
+++ b/tests/skills/cases/epf-validate/error-version-help-body.json
@@ -0,0 +1,9 @@
+{
+ "name": "Справка обработки 2.18 при корне 2.20 — ошибка: платформа такую обработку не соберёт",
+ "setup": "fixture:epf-version-help-body",
+ "params": { "objectPath": "ПроверкаВерсий.xml" },
+ "expectError": true,
+ "noSnapshot": "epf-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": { "stdoutContains": ["[ERROR] 11. ПроверкаВерсий/Ext/Help.xml is stamped 2.18, its descriptor ПроверкаВерсий.xml 2.20"] },
+ "skipPlatformVerify": "фикстура намеренно не собирается: части одного объекта обработки в разных версиях формата"
+}
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий.xml
new file mode 100644
index 000000000..0f2941a49
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ c3831ec8-d8d5-4f93-8a22-f9bfae07327f
+ f4fb4a44-31ba-4728-99ab-e3a59f303e66
+
+
+ 56f80a71-a535-4ce7-9075-3c2ec8264f9d
+ 553f5179-9d59-4d05-9205-8ede5f0e4b6a
+
+
+
+ ПроверкаВерсий
+
+
+ ru
+ ПроверкаВерсий
+
+
+
+ ExternalDataProcessor.ПроверкаВерсий.Form.Форма
+
+
+
+
+ Описание
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Ext/Help.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Ext/Help.xml
new file mode 100644
index 000000000..237bf77a7
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Ext/Help.xml
@@ -0,0 +1,4 @@
+
+
+ ru
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Ext/Help/ru.html b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Ext/Help/ru.html
new file mode 100644
index 000000000..897615177
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Ext/Help/ru.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+ ПроверкаВерсий
+ Описание.
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Ext/ObjectModule.bsl b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..788ebdbd8
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Ext/ObjectModule.bsl
@@ -0,0 +1,11 @@
+#Область ОписаниеПеременных
+
+#КонецОбласти
+
+#Область ПрограммныйИнтерфейс
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Forms/Форма.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Forms/Форма.xml
new file mode 100644
index 000000000..e6a87582c
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Forms/Форма.xml
@@ -0,0 +1,22 @@
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Forms/Форма/Ext/Form.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Forms/Форма/Ext/Form.xml
new file mode 100644
index 000000000..a238db5a4
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Forms/Форма/Ext/Form.xml
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl
new file mode 100644
index 000000000..4cf929983
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl
@@ -0,0 +1,19 @@
+#Область ОбработчикиСобытийФормы
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовФормы
+
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+#КонецОбласти
+
+#Область ОбработчикиОповещений
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Templates/Описание.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Templates/Описание.xml
new file mode 100644
index 000000000..15426047a
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Templates/Описание.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Описание
+
+
+ ru
+ Описание
+
+
+
+ HTMLDocument
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Templates/Описание/Ext/Template.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Templates/Описание/Ext/Template.xml
new file mode 100644
index 000000000..237bf77a7
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Templates/Описание/Ext/Template.xml
@@ -0,0 +1,4 @@
+
+
+ ru
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html
new file mode 100644
index 000000000..46690e416
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-agree/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий.xml
new file mode 100644
index 000000000..0f2941a49
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ c3831ec8-d8d5-4f93-8a22-f9bfae07327f
+ f4fb4a44-31ba-4728-99ab-e3a59f303e66
+
+
+ 56f80a71-a535-4ce7-9075-3c2ec8264f9d
+ 553f5179-9d59-4d05-9205-8ede5f0e4b6a
+
+
+
+ ПроверкаВерсий
+
+
+ ru
+ ПроверкаВерсий
+
+
+
+ ExternalDataProcessor.ПроверкаВерсий.Form.Форма
+
+
+
+
+ Описание
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Ext/Help.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Ext/Help.xml
new file mode 100644
index 000000000..237bf77a7
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Ext/Help.xml
@@ -0,0 +1,4 @@
+
+
+ ru
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Ext/Help/ru.html b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Ext/Help/ru.html
new file mode 100644
index 000000000..897615177
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Ext/Help/ru.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+ ПроверкаВерсий
+ Описание.
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Ext/ObjectModule.bsl b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..788ebdbd8
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Ext/ObjectModule.bsl
@@ -0,0 +1,11 @@
+#Область ОписаниеПеременных
+
+#КонецОбласти
+
+#Область ПрограммныйИнтерфейс
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Forms/Форма.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Forms/Форма.xml
new file mode 100644
index 000000000..e6a87582c
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Forms/Форма.xml
@@ -0,0 +1,22 @@
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Forms/Форма/Ext/Form.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Forms/Форма/Ext/Form.xml
new file mode 100644
index 000000000..1e33ad133
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Forms/Форма/Ext/Form.xml
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl
new file mode 100644
index 000000000..4cf929983
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl
@@ -0,0 +1,19 @@
+#Область ОбработчикиСобытийФормы
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовФормы
+
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+#КонецОбласти
+
+#Область ОбработчикиОповещений
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Templates/Описание.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Templates/Описание.xml
new file mode 100644
index 000000000..15426047a
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Templates/Описание.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Описание
+
+
+ ru
+ Описание
+
+
+
+ HTMLDocument
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Templates/Описание/Ext/Template.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Templates/Описание/Ext/Template.xml
new file mode 100644
index 000000000..237bf77a7
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Templates/Описание/Ext/Template.xml
@@ -0,0 +1,4 @@
+
+
+ ru
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html
new file mode 100644
index 000000000..46690e416
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-body/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий.xml
new file mode 100644
index 000000000..0f2941a49
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ c3831ec8-d8d5-4f93-8a22-f9bfae07327f
+ f4fb4a44-31ba-4728-99ab-e3a59f303e66
+
+
+ 56f80a71-a535-4ce7-9075-3c2ec8264f9d
+ 553f5179-9d59-4d05-9205-8ede5f0e4b6a
+
+
+
+ ПроверкаВерсий
+
+
+ ru
+ ПроверкаВерсий
+
+
+
+ ExternalDataProcessor.ПроверкаВерсий.Form.Форма
+
+
+
+
+ Описание
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Ext/Help.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Ext/Help.xml
new file mode 100644
index 000000000..237bf77a7
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Ext/Help.xml
@@ -0,0 +1,4 @@
+
+
+ ru
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Ext/Help/ru.html b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Ext/Help/ru.html
new file mode 100644
index 000000000..897615177
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Ext/Help/ru.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+ ПроверкаВерсий
+ Описание.
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Ext/ObjectModule.bsl b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..788ebdbd8
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Ext/ObjectModule.bsl
@@ -0,0 +1,11 @@
+#Область ОписаниеПеременных
+
+#КонецОбласти
+
+#Область ПрограммныйИнтерфейс
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Forms/Форма.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Forms/Форма.xml
new file mode 100644
index 000000000..6835d1aa0
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Forms/Форма.xml
@@ -0,0 +1,22 @@
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Forms/Форма/Ext/Form.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Forms/Форма/Ext/Form.xml
new file mode 100644
index 000000000..1e33ad133
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Forms/Форма/Ext/Form.xml
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl
new file mode 100644
index 000000000..4cf929983
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl
@@ -0,0 +1,19 @@
+#Область ОбработчикиСобытийФормы
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовФормы
+
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+#КонецОбласти
+
+#Область ОбработчикиОповещений
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Templates/Описание.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Templates/Описание.xml
new file mode 100644
index 000000000..15426047a
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Templates/Описание.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Описание
+
+
+ ru
+ Описание
+
+
+
+ HTMLDocument
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Templates/Описание/Ext/Template.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Templates/Описание/Ext/Template.xml
new file mode 100644
index 000000000..237bf77a7
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Templates/Описание/Ext/Template.xml
@@ -0,0 +1,4 @@
+
+
+ ru
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html
new file mode 100644
index 000000000..46690e416
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-form-older/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий.xml
new file mode 100644
index 000000000..0f2941a49
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ c3831ec8-d8d5-4f93-8a22-f9bfae07327f
+ f4fb4a44-31ba-4728-99ab-e3a59f303e66
+
+
+ 56f80a71-a535-4ce7-9075-3c2ec8264f9d
+ 553f5179-9d59-4d05-9205-8ede5f0e4b6a
+
+
+
+ ПроверкаВерсий
+
+
+ ru
+ ПроверкаВерсий
+
+
+
+ ExternalDataProcessor.ПроверкаВерсий.Form.Форма
+
+
+
+
+ Описание
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Ext/Help.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Ext/Help.xml
new file mode 100644
index 000000000..ba3d59e46
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Ext/Help.xml
@@ -0,0 +1,4 @@
+
+
+ ru
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Ext/Help/ru.html b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Ext/Help/ru.html
new file mode 100644
index 000000000..897615177
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Ext/Help/ru.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+ ПроверкаВерсий
+ Описание.
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Ext/ObjectModule.bsl b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Ext/ObjectModule.bsl
new file mode 100644
index 000000000..788ebdbd8
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Ext/ObjectModule.bsl
@@ -0,0 +1,11 @@
+#Область ОписаниеПеременных
+
+#КонецОбласти
+
+#Область ПрограммныйИнтерфейс
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Forms/Форма.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Forms/Форма.xml
new file mode 100644
index 000000000..e6a87582c
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Forms/Форма.xml
@@ -0,0 +1,22 @@
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Forms/Форма/Ext/Form.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Forms/Форма/Ext/Form.xml
new file mode 100644
index 000000000..a238db5a4
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Forms/Форма/Ext/Form.xml
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl
new file mode 100644
index 000000000..4cf929983
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Forms/Форма/Ext/Form/Module.bsl
@@ -0,0 +1,19 @@
+#Область ОбработчикиСобытийФормы
+
+#КонецОбласти
+
+#Область ОбработчикиСобытийЭлементовФормы
+
+#КонецОбласти
+
+#Область ОбработчикиКомандФормы
+
+#КонецОбласти
+
+#Область ОбработчикиОповещений
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Templates/Описание.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Templates/Описание.xml
new file mode 100644
index 000000000..15426047a
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Templates/Описание.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Описание
+
+
+ ru
+ Описание
+
+
+
+ HTMLDocument
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Templates/Описание/Ext/Template.xml b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Templates/Описание/Ext/Template.xml
new file mode 100644
index 000000000..237bf77a7
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Templates/Описание/Ext/Template.xml
@@ -0,0 +1,4 @@
+
+
+ ru
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html
new file mode 100644
index 000000000..46690e416
--- /dev/null
+++ b/tests/skills/cases/epf-validate/fixtures/epf-version-help-body/ПроверкаВерсий/Templates/Описание/Ext/Template/ru.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/epf-validate/valid-version-parts-agree.json b/tests/skills/cases/epf-validate/valid-version-parts-agree.json
new file mode 100644
index 000000000..3c41e45bd
--- /dev/null
+++ b/tests/skills/cases/epf-validate/valid-version-parts-agree.json
@@ -0,0 +1,7 @@
+{
+ "name": "Корень, справка, форма и макет обработки в одной версии — чисто",
+ "setup": "fixture:epf-version-agree",
+ "params": { "objectPath": "ПроверкаВерсий.xml" },
+ "noSnapshot": "epf-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": { "stdoutContains": ["=== Validation OK"] }
+}
diff --git a/tests/skills/cases/epf-validate/warn-version-form-older.json b/tests/skills/cases/epf-validate/warn-version-form-older.json
new file mode 100644
index 000000000..9335ca701
--- /dev/null
+++ b/tests/skills/cases/epf-validate/warn-version-form-older.json
@@ -0,0 +1,10 @@
+{
+ "name": "Форма целиком в 2.18 в обработке 2.20 (мерж веток) — только предупреждение: платформа такое собирает",
+ "setup": "fixture:epf-version-form-older",
+ "params": { "objectPath": "ПроверкаВерсий.xml" },
+ "noSnapshot": "epf-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout",
+ "expect": {
+ "stdoutContains": ["[WARN] 11. Format version differs from the processor root (2.20): ПроверкаВерсий/Forms/Форма.xml 2.18"],
+ "stdoutNotContains": ["[ERROR]"]
+ }
+}
diff --git a/tests/skills/check-inline-drift.mjs b/tests/skills/check-inline-drift.mjs
index 3b3920ab2..adcd6e8ba 100644
--- a/tests/skills/check-inline-drift.mjs
+++ b/tests/skills/check-inline-drift.mjs
@@ -130,7 +130,7 @@ 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', 'subsystem-validate'] },
+ { id: 'base', authority: 'meta-validate', consumers: ['cf-validate', 'epf-validate', 'form-validate', 'interface-validate', 'role-validate', 'subsystem-validate'] },
],
},
{