From 2e5289a88f15ab41e2bece138abc86ec24ada9a0 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 1 Aug 2026 16:28:50 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-compile,meta-validate,cf-init,*-valida?= =?UTF-8?q?te):=20=D0=BF=D1=80=D0=BE=D0=BC=D0=B5=D0=B6=D1=83=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D1=8B=D0=B5=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8?= =?UTF-8?q?=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B0=202.18/2.19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Версия формата выгрузки идёт лестницей, а не скачком 2.17 -> 2.20: 8.3.20-8.3.24 -> 2.17, 8.3.25 -> 2.18, 8.3.26 -> 2.19, 8.3.27 -> 2.20. Прежняя дельта мерилась через две ступени и приписала версии 2.20 всё, что появилось по дороге. Замер на одной и той же конфигурации, выгруженной четырьмя платформами: - 2.18: TypeReductionMode (4793 файла), TextToSpeech, 3 редких свойства форм; - 2.19: новых тегов нет, роли перешли на omit-on-default; - 2.20: только LineNumberLength. meta-compile: единый гейт isFormat220 управлял обоими свойствами, поэтому на проекте 2.18/2.19 TypeReductionMode не эмитился, хотя платформа этих версий его пишет — роундтрип разъезжался. Порог расщеплён: >=2.18 для TypeReductionMode, >=2.20 для LineNumberLength. meta-validate: реестр versionedProps объявлял TypeReductionMode свойством 2.20, из-за чего проверка 18 давала ложную ошибку на корректном файле 2.18/2.19. Исправлено на 2.18. Валидаторы (meta/form/cf/cfe/epf) считали 2.18 и 2.19 неизвестными версиями и предупреждали «Unusual version»; cf-init не давал отскаффолдить конфигурацию под 8.3.25/8.3.26. Обе версии впущены. Тесты: фикстура empty-config-218, кейс meta-compile на границу свойств (TypeReductionMode есть, LineNumberLength нет), два кейса meta-validate на законность штампов 2.18/2.19; кейс error-220-props-in-217 теперь проверяет оба сообщения с разными порогами. Кейс 2.18 проверен загрузкой в живую 8.3.25 через verify-snapshots. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/cf-init/scripts/cf-init.ps1 | 8 +- .claude/skills/cf-init/scripts/cf-init.py | 8 +- .../cf-validate/scripts/cf-validate.ps1 | 7 +- .../skills/cf-validate/scripts/cf-validate.py | 7 +- .../cfe-validate/scripts/cfe-validate.ps1 | 7 +- .../cfe-validate/scripts/cfe-validate.py | 7 +- .../epf-validate/scripts/epf-validate.ps1 | 7 +- .../epf-validate/scripts/epf-validate.py | 7 +- .../form-validate/scripts/form-validate.ps1 | 7 +- .../form-validate/scripts/form-validate.py | 7 +- .../meta-compile/scripts/meta-compile.ps1 | 15 +- .../meta-compile/scripts/meta-compile.py | 15 +- .../meta-validate/scripts/meta-validate.ps1 | 9 +- .../meta-validate/scripts/meta-validate.py | 9 +- .../cases/meta-compile/format-218-props.json | 31 ++ .../format-218-props/Catalogs/Валюты.xml | 91 ++++ .../Catalogs/Валюты/Ext/ObjectModule.bsl | 0 .../format-218-props/Catalogs/Договоры.xml | 436 ++++++++++++++++++ .../Catalogs/Договоры/Ext/ObjectModule.bsl | 0 .../format-218-props/Configuration.xml | 254 ++++++++++ .../Ext/ClientApplicationInterface.xml | 18 + .../InformationRegisters/КурсыВалют.xml | 266 +++++++++++ .../КурсыВалют/Ext/RecordSetModule.bsl | 0 .../format-218-props/Languages/Русский.xml | 16 + .../meta-validate/error-220-props-in-217.json | 7 +- .../catalog-218-trm/Catalogs/Договоры.xml | 436 ++++++++++++++++++ .../catalog-219-trm/Catalogs/Договоры.xml | 436 ++++++++++++++++++ .../valid-218-typereductionmode.json | 9 + .../valid-219-version-accepted.json | 9 + tests/skills/runner.mjs | 3 + 30 files changed, 2079 insertions(+), 53 deletions(-) create mode 100644 tests/skills/cases/meta-compile/format-218-props.json create mode 100644 tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Валюты.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Валюты/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Договоры.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Договоры/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-compile/snapshots/format-218-props/Configuration.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/format-218-props/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/format-218-props/InformationRegisters/КурсыВалют.xml create mode 100644 tests/skills/cases/meta-compile/snapshots/format-218-props/InformationRegisters/КурсыВалют/Ext/RecordSetModule.bsl create mode 100644 tests/skills/cases/meta-compile/snapshots/format-218-props/Languages/Русский.xml create mode 100644 tests/skills/cases/meta-validate/fixtures/catalog-218-trm/Catalogs/Договоры.xml create mode 100644 tests/skills/cases/meta-validate/fixtures/catalog-219-trm/Catalogs/Договоры.xml create mode 100644 tests/skills/cases/meta-validate/valid-218-typereductionmode.json create mode 100644 tests/skills/cases/meta-validate/valid-219-version-accepted.json diff --git a/.claude/skills/cf-init/scripts/cf-init.ps1 b/.claude/skills/cf-init/scripts/cf-init.ps1 index 732e30cb..fb7f0293 100644 --- a/.claude/skills/cf-init/scripts/cf-init.ps1 +++ b/.claude/skills/cf-init/scripts/cf-init.ps1 @@ -1,4 +1,4 @@ -# cf-init v1.3 — Create empty 1C configuration scaffold +# cf-init v1.4 — Create empty 1C configuration scaffold # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -9,9 +9,9 @@ param( [string]$Vendor, [string]$CompatibilityMode = "Version8_3_24", # Версия формата выгрузки (MDClasses). Её задаёт ПЛАТФОРМА, которой выгружают, и от режима - # совместимости она не зависит: 8.3.24 пишет 2.17, 8.3.27 — 2.20. Дефолт консервативный — - # 2.17 читается всеми поддерживаемыми платформами. - [ValidateSet("2.17", "2.20", "2.21")] + # совместимости она не зависит: 8.3.20-8.3.24 пишут 2.17, 8.3.25 — 2.18, 8.3.26 — 2.19, + # 8.3.27 — 2.20. Дефолт консервативный: 2.17 читается всеми поддерживаемыми платформами. + [ValidateSet("2.17", "2.18", "2.19", "2.20", "2.21")] [string]$FormatVersion = "2.17" ) diff --git a/.claude/skills/cf-init/scripts/cf-init.py b/.claude/skills/cf-init/scripts/cf-init.py index 214d334a..150081ee 100644 --- a/.claude/skills/cf-init/scripts/cf-init.py +++ b/.claude/skills/cf-init/scripts/cf-init.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cf-init v1.3 — Create empty 1C configuration scaffold +# cf-init v1.4 — Create empty 1C configuration scaffold # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Generates minimal XML source files for a 1C configuration.""" import sys, os, argparse, uuid @@ -25,8 +25,10 @@ def main(): parser.add_argument('-Vendor', dest='Vendor', default='') parser.add_argument('-CompatibilityMode', dest='CompatibilityMode', default='Version8_3_24') # Версия формата выгрузки (MDClasses) — её задаёт ПЛАТФОРМА, а не режим совместимости: - # 8.3.24 пишет 2.17, 8.3.27 — 2.20. Дефолт консервативный: 2.17 читается всеми платформами. - parser.add_argument('-FormatVersion', dest='FormatVersion', default='2.17', choices=['2.17', '2.20', '2.21']) + # 8.3.20-8.3.24 пишут 2.17, 8.3.25 — 2.18, 8.3.26 — 2.19, 8.3.27 — 2.20. + # Дефолт консервативный: 2.17 читается всеми платформами. + parser.add_argument('-FormatVersion', dest='FormatVersion', default='2.17', + choices=['2.17', '2.18', '2.19', '2.20', '2.21']) args = parser.parse_args() name = args.Name diff --git a/.claude/skills/cf-validate/scripts/cf-validate.ps1 b/.claude/skills/cf-validate/scripts/cf-validate.ps1 index e59ff3c6..83c0bd9f 100644 --- a/.claude/skills/cf-validate/scripts/cf-validate.ps1 +++ b/.claude/skills/cf-validate/scripts/cf-validate.ps1 @@ -1,4 +1,4 @@ -# cf-validate v1.4 — Validate 1C configuration root structure +# cf-validate v1.5 — Validate 1C configuration root structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -205,8 +205,9 @@ if ($root.NamespaceURI -ne $expectedNs) { $version = $root.GetAttribute("version") if (-not $version) { Report-Warn "1. Missing version attribute on MetaDataObject" -} elseif ($version -ne "2.17" -and $version -ne "2.20" -and $version -ne "2.21") { - Report-Warn "1. Unusual version '$version' (expected 2.17, 2.20 or 2.21)" +} elseif ($version -notin @("2.17", "2.18", "2.19", "2.20", "2.21")) { + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + Report-Warn "1. Unusual version '$version' (expected 2.17-2.20 or 2.21)" } # Must have Configuration child diff --git a/.claude/skills/cf-validate/scripts/cf-validate.py b/.claude/skills/cf-validate/scripts/cf-validate.py index 9b3ba9b6..b16e1e2c 100644 --- a/.claude/skills/cf-validate/scripts/cf-validate.py +++ b/.claude/skills/cf-validate/scripts/cf-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cf-validate v1.4 — Validate 1C configuration XML structure +# cf-validate v1.5 — Validate 1C configuration XML structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Validates Configuration.xml: root structure, InternalInfo, properties, ChildObjects, languages.""" import sys, os, argparse, re @@ -232,8 +232,9 @@ def main(): version = root.get('version', '') if not version: r.warn('1. Missing version attribute on MetaDataObject') - elif version not in ('2.17', '2.20', '2.21'): - r.warn(f"1. Unusual version '{version}' (expected 2.17, 2.20 or 2.21)") + elif version not in ('2.17', '2.18', '2.19', '2.20', '2.21'): + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + r.warn(f"1. Unusual version '{version}' (expected 2.17-2.20 or 2.21)") # Must have Configuration child cfg_node = None diff --git a/.claude/skills/cfe-validate/scripts/cfe-validate.ps1 b/.claude/skills/cfe-validate/scripts/cfe-validate.ps1 index 39e9ff9c..1afbb7dd 100644 --- a/.claude/skills/cfe-validate/scripts/cfe-validate.ps1 +++ b/.claude/skills/cfe-validate/scripts/cfe-validate.ps1 @@ -1,4 +1,4 @@ -# cfe-validate v1.4 — Validate 1C configuration extension structure (CFE) +# cfe-validate v1.5 — Validate 1C configuration extension structure (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -197,8 +197,9 @@ if ($root.NamespaceURI -ne $expectedNs) { $version = $root.GetAttribute("version") if (-not $version) { Report-Warn "1. Missing version attribute on MetaDataObject" -} elseif ($version -ne "2.17" -and $version -ne "2.20" -and $version -ne "2.21") { - Report-Warn "1. Unusual version '$version' (expected 2.17, 2.20 or 2.21)" +} elseif ($version -notin @("2.17", "2.18", "2.19", "2.20", "2.21")) { + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + Report-Warn "1. Unusual version '$version' (expected 2.17-2.20 or 2.21)" } # Must have Configuration child diff --git a/.claude/skills/cfe-validate/scripts/cfe-validate.py b/.claude/skills/cfe-validate/scripts/cfe-validate.py index 51902c34..ab66c258 100644 --- a/.claude/skills/cfe-validate/scripts/cfe-validate.py +++ b/.claude/skills/cfe-validate/scripts/cfe-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cfe-validate v1.4 — Validate 1C configuration extension XML structure (CFE) +# cfe-validate v1.5 — Validate 1C configuration extension XML structure (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Validates extension Configuration.xml: root, InternalInfo, extension properties, ChildObjects, borrowed objects.""" import sys, os, argparse, re @@ -216,8 +216,9 @@ def main(): version = root.get('version', '') if not version: r.warn('1. Missing version attribute on MetaDataObject') - elif version not in ('2.17', '2.20', '2.21'): - r.warn(f"1. Unusual version '{version}' (expected 2.17, 2.20 or 2.21)") + elif version not in ('2.17', '2.18', '2.19', '2.20', '2.21'): + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + r.warn(f"1. Unusual version '{version}' (expected 2.17-2.20 or 2.21)") # Must have Configuration child cfg_node = None diff --git a/.claude/skills/epf-validate/scripts/epf-validate.ps1 b/.claude/skills/epf-validate/scripts/epf-validate.ps1 index 62d928e4..a63273b4 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.2 — Validate 1C external data processor / report structure +# epf-validate v1.3 — 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 param( @@ -185,8 +185,9 @@ if ($root.NamespaceURI -ne $expectedNs) { $version = $root.GetAttribute("version") if (-not $version) { Report-Warn "1. Missing version attribute on MetaDataObject" -} elseif ($version -ne "2.17" -and $version -ne "2.20" -and $version -ne "2.21") { - Report-Warn "1. Unusual version '$version' (expected 2.17, 2.20 or 2.21)" +} elseif ($version -notin @("2.17", "2.18", "2.19", "2.20", "2.21")) { + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + Report-Warn "1. Unusual version '$version' (expected 2.17-2.20 or 2.21)" } # Detect type: ExternalDataProcessor or ExternalReport diff --git a/.claude/skills/epf-validate/scripts/epf-validate.py b/.claude/skills/epf-validate/scripts/epf-validate.py index 4c854768..841c283e 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.2 — Validate 1C external data processor / report structure +# epf-validate v1.3 — 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 @@ -165,8 +165,9 @@ def main(): version = root.get("version", "") if not version: report_warn("1. Missing version attribute on MetaDataObject") - elif version not in ("2.17", "2.20", "2.21"): - report_warn(f"1. Unusual version '{version}' (expected 2.17, 2.20 or 2.21)") + elif version not in ("2.17", "2.18", "2.19", "2.20", "2.21"): + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + report_warn(f"1. Unusual version '{version}' (expected 2.17-2.20 or 2.21)") # Detect type child_elements = [] diff --git a/.claude/skills/form-validate/scripts/form-validate.ps1 b/.claude/skills/form-validate/scripts/form-validate.ps1 index bc147841..8f231547 100644 --- a/.claude/skills/form-validate/scripts/form-validate.ps1 +++ b/.claude/skills/form-validate/scripts/form-validate.ps1 @@ -1,4 +1,4 @@ -# form-validate v1.8 — Validate 1C managed form +# form-validate v1.9 — Validate 1C managed form # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -127,10 +127,11 @@ if ($root.LocalName -ne "Form") { Report-Error "Root element is '$($root.LocalName)', expected 'Form'" } else { $version = $root.GetAttribute("version") - if ($version -eq "2.17" -or $version -eq "2.20") { + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + if ($version -in @("2.17", "2.18", "2.19", "2.20")) { Report-OK "Root element: Form version=$version" } elseif ($version) { - Report-Warn "Form version='$version' (expected 2.17 or 2.20)" + Report-Warn "Form version='$version' (expected 2.17-2.20)" } else { Report-Warn "Form version attribute missing" } diff --git a/.claude/skills/form-validate/scripts/form-validate.py b/.claude/skills/form-validate/scripts/form-validate.py index 3c1ec3b7..43adcf71 100644 --- a/.claude/skills/form-validate/scripts/form-validate.py +++ b/.claude/skills/form-validate/scripts/form-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# form-validate v1.8 — Validate 1C managed form +# form-validate v1.9 — Validate 1C managed form # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -161,10 +161,11 @@ def main(): report_error(f"Root element is '{localname(root)}', expected 'Form'") else: version = root.get("version", "") - if version in ("2.17", "2.20"): + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + if version in ("2.17", "2.18", "2.19", "2.20"): report_ok(f"Root element: Form version={version}") elif version: - report_warn(f"Form version='{version}' (expected 2.17 or 2.20)") + report_warn(f"Form version='{version}' (expected 2.17-2.20)") else: report_warn("Form version attribute missing") diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index f9ae61be..14ed75dd 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -1,4 +1,4 @@ -# meta-compile v1.68 — Compile 1C metadata object from JSON +# meta-compile v1.69 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -1321,9 +1321,9 @@ function Emit-StandardAttribute { X "$indent`tfalse" X "$indent`t$ffv" X "$indent`tAuto" - # Формат 2.20 (8.3.27): режим приведения типов. Платформа пишет его КАЖДОМУ стандартному + # Формат 2.18 (8.3.25): режим приведения типов. Платформа пишет его КАЖДОМУ стандартному # реквизиту; значение всегда TransformValues, кроме владельца (Owner) — там Deny. - if ($script:isFormat220) { + if ($script:isFormat218) { $trm = OvOr 'TypeReductionMode' $(if ($attrName -ceq 'Owner') { 'Deny' } else { 'TransformValues' }) X "$indent`t$trm" } @@ -1955,9 +1955,9 @@ function Emit-Attribute { X "$indent`t`t$dh" } } - # Формат 2.20 (8.3.27): режим приведения типов — последним в Properties и ТОЛЬКО у измерений + # Формат 2.18 (8.3.25): режим приведения типов — последним в Properties и ТОЛЬКО у измерений # регистра сведений (у реквизитов/ресурсов и у прочих семейств регистров платформа его не пишет). - if ($script:isFormat220 -and $elemTag -eq "Dimension" -and $context -eq "register-info") { + if ($script:isFormat218 -and $elemTag -eq "Dimension" -and $context -eq "register-info") { $trm = if ($parsed.typeReductionMode) { "$($parsed.typeReductionMode)" } else { "TransformValues" } X "$indent`t`t$trm" } @@ -4043,7 +4043,10 @@ function Get-FormatRank([string]$ver) { $script:formatVersion = Detect-FormatVersion $OutputDir $script:compatMode = Detect-CompatibilityMode $OutputDir -# Формат 2.20+ (платформа 8.3.27) — только тогда эмитим новые свойства. +# У каждого свойства свой порог: появился в формате 2.18 (платформа 8.3.25), +# — в 2.20 (8.3.27). Один общий флаг здесь неверен: на проекте 2.18/2.19 он +# глушил бы TypeReductionMode, который платформа этих версий пишет, и роундтрип бы разъезжался. +$script:isFormat218 = (Get-FormatRank $script:formatVersion) -ge 218 $script:isFormat220 = (Get-FormatRank $script:formatVersion) -ge 220 # Дефолт длины номера строки ТЧ: с режима 8.3.27 платформа заводит новые ТЧ с 9 разрядами. $script:lineNumberLengthDefault = if ((Get-CompatModeRank $script:compatMode) -ge 80327) { 9 } else { 5 } diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index a25106ef..076f5c3f 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# meta-compile v1.68 — Compile 1C metadata object from JSON +# meta-compile v1.69 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -1340,9 +1340,9 @@ def emit_standard_attribute(indent, attr_name, ov=None): X(f'{indent}\tfalse') X(f'{indent}\t{ffv}') X(f'{indent}\tAuto') - # Формат 2.20 (8.3.27): режим приведения типов. Платформа пишет его КАЖДОМУ стандартному + # Формат 2.18 (8.3.25): режим приведения типов. Платформа пишет его КАЖДОМУ стандартному # реквизиту; значение всегда TransformValues, кроме владельца (Owner) — там Deny. - if is_format_220: + if is_format_218: trm = ov.get('TypeReductionMode', 'Deny' if attr_name == 'Owner' else 'TransformValues') X(f'{indent}\t{trm}') X(f'{indent}\t') @@ -2017,9 +2017,9 @@ def emit_attribute(indent, parsed, context, elem_tag='Attribute'): # DataHistory — not for Chart* types and non-InformationRegister register family if context not in ('chart', 'register-other', 'register-accum', 'register-calc', 'register-account'): X(f'{indent}\t\t{parsed.get("dataHistory") or "Use"}') - # Формат 2.20 (8.3.27): режим приведения типов — последним в Properties и ТОЛЬКО у измерений + # Формат 2.18 (8.3.25): режим приведения типов — последним в Properties и ТОЛЬКО у измерений # регистра сведений (у реквизитов/ресурсов и у прочих семейств регистров платформа его не пишет). - if is_format_220 and elem_tag == 'Dimension' and context == 'register-info': + if is_format_218 and elem_tag == 'Dimension' and context == 'register-info': X(f'{indent}\t\t{parsed.get("typeReductionMode") or "TransformValues"}') X(f'{indent}\t') X(f'{indent}') @@ -3935,7 +3935,10 @@ def format_rank(ver): format_version = detect_format_version(output_dir) compat_mode = detect_compatibility_mode(output_dir) -# Формат 2.20+ (платформа 8.3.27) — только тогда эмитим новые свойства. +# У каждого свойства свой порог: появился в формате 2.18 (платформа 8.3.25), +# — в 2.20 (8.3.27). Один общий флаг здесь неверен: на проекте 2.18/2.19 он +# глушил бы TypeReductionMode, который платформа этих версий пишет, и роундтрип бы разъезжался. +is_format_218 = format_rank(format_version) >= 218 is_format_220 = format_rank(format_version) >= 220 # Дефолт длины номера строки ТЧ: с режима 8.3.27 платформа заводит новые ТЧ с 9 разрядами. line_number_length_default = 9 if compat_mode_rank(compat_mode) >= 80327 else 5 diff --git a/.claude/skills/meta-validate/scripts/meta-validate.ps1 b/.claude/skills/meta-validate/scripts/meta-validate.ps1 index d2005e7b..5f0b1d4d 100644 --- a/.claude/skills/meta-validate/scripts/meta-validate.ps1 +++ b/.claude/skills/meta-validate/scripts/meta-validate.ps1 @@ -1,4 +1,4 @@ -# meta-validate v1.12 — Validate 1C metadata object structure (+корневой : скаляр без структуры = ошибка) +# meta-validate v1.13 — Validate 1C metadata object structure (+корневой : скаляр без структуры = ошибка) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -344,8 +344,9 @@ if ($root.NamespaceURI -ne $expectedNs) { $version = $root.GetAttribute("version") if (-not $version) { Report-Warn "1. Missing version attribute on MetaDataObject" -} elseif ($version -ne "2.17" -and $version -ne "2.20") { - Report-Warn "1. Unusual version '$version' (expected 2.17 or 2.20)" +} elseif ($version -notin @("2.17", "2.18", "2.19", "2.20")) { + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + Report-Warn "1. Unusual version '$version' (expected 2.17-2.20)" } # Detect type element — exactly one child element in md namespace @@ -1499,7 +1500,7 @@ if ($script:configDir) { # рапортует успех, а свойство теряется); (2) подсказать, что конструкция требует более нового # формата. Расширяется одной строкой на свойство — задел под 2.21 (8.5) и последующие. $versionedProps = @{ - "TypeReductionMode" = "2.20" # режим приведения типов (стандартные реквизиты, измерения РС) + "TypeReductionMode" = "2.18" # режим приведения типов (стандартные реквизиты, измерения РС) "LineNumberLength" = "2.20" # длина номера строки ТЧ (5..9) } # Версия формата как число: "2.20" → 220. Строковое сравнение неверно ("2.9" > "2.17"). diff --git a/.claude/skills/meta-validate/scripts/meta-validate.py b/.claude/skills/meta-validate/scripts/meta-validate.py index 110eac41..11ab456c 100644 --- a/.claude/skills/meta-validate/scripts/meta-validate.py +++ b/.claude/skills/meta-validate/scripts/meta-validate.py @@ -1,4 +1,4 @@ -# meta-validate v1.12 — Validate 1C metadata object structure (Python port) (+корневой : скаляр без структуры = ошибка) +# meta-validate v1.13 — Validate 1C metadata object structure (Python port) (+корневой : скаляр без структуры = ошибка) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -371,8 +371,9 @@ if root_ns != expected_ns: version = root.get("version", "") if not version: report_warn("1. Missing version attribute on MetaDataObject") -elif version not in ("2.17", "2.20"): - report_warn(f"1. Unusual version '{version}' (expected 2.17 or 2.20)") +elif version not in ("2.17", "2.18", "2.19", "2.20"): + # Лестница версий формата: 2.17 (8.3.20-8.3.24), 2.18 (8.3.25), 2.19 (8.3.26), 2.20 (8.3.27). + report_warn(f"1. Unusual version '{version}' (expected 2.17-2.20)") # Detect type element -- exactly one child element in md namespace type_node = None @@ -1401,7 +1402,7 @@ if config_dir: # рапортует успех, а свойство теряется); (2) подсказать, что конструкция требует более нового # формата. Расширяется одной строкой на свойство — задел под 2.21 (8.5) и последующие. versioned_props = { - "TypeReductionMode": "2.20", # режим приведения типов (стандартные реквизиты, измерения РС) + "TypeReductionMode": "2.18", # режим приведения типов (стандартные реквизиты, измерения РС) "LineNumberLength": "2.20", # длина номера строки ТЧ (5..9) } diff --git a/tests/skills/cases/meta-compile/format-218-props.json b/tests/skills/cases/meta-compile/format-218-props.json new file mode 100644 index 00000000..9c2d0dd3 --- /dev/null +++ b/tests/skills/cases/meta-compile/format-218-props.json @@ -0,0 +1,31 @@ +{ + "name": "Формат 2.18 (8.3.25): TypeReductionMode есть, LineNumberLength ещё нет", + "setup": "empty-config-218", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { "type": "Catalog", "name": "Валюты" }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + } + ], + "input": [ + { + "type": "Catalog", + "name": "Договоры", + "owners": ["Catalog.Валюты"], + "standardAttributes": { "Description": { "fillChecking": "ShowError" } }, + "tabularSections": { "Условия": ["Условие: String(100)"] } + }, + { + "type": "InformationRegister", + "name": "КурсыВалют", + "periodicity": "Day", + "dimensions": ["Валюта: CatalogRef.Валюты | master, mainFilter"], + "resources": ["Курс: Number(15,4)"] + } + ], + "validatePath": "Catalogs/Договоры", + "expect": { + "files": ["Catalogs/Договоры.xml", "InformationRegisters/КурсыВалют.xml"] + } +} diff --git a/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Валюты.xml b/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Валюты.xml new file mode 100644 index 00000000..7d657b8b --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Валюты.xml @@ -0,0 +1,91 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + Валюты + + + 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 + + + + diff --git a/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Валюты/Ext/ObjectModule.bsl b/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Валюты/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Договоры.xml b/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Договоры.xml new file mode 100644 index 00000000..736b68c3 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Договоры.xml @@ -0,0 +1,436 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + + Договоры + + + ru + Договоры + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + Catalog.Валюты + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + true + Auto + Deny + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + true + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + Auto + InDialog + false + BothWays + + Catalog.Договоры.StandardAttribute.Description + Catalog.Договоры.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + + + UUID-013 + UUID-014 + + + UUID-015 + UUID-016 + + + + Условия + + + ru + Условия + + + + + DontCheck + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + ForItem + + + + + Условие + + + ru + Условие + + + + + xs:string + + 100 + Variable + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + Use + Use + + + + + + + diff --git a/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Договоры/Ext/ObjectModule.bsl b/tests/skills/cases/meta-compile/snapshots/format-218-props/Catalogs/Договоры/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-compile/snapshots/format-218-props/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/format-218-props/Configuration.xml new file mode 100644 index 00000000..4684d6fc --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/format-218-props/Configuration.xml @@ -0,0 +1,254 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + 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 + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + Валюты + Договоры + КурсыВалют + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/format-218-props/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/format-218-props/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/format-218-props/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-compile/snapshots/format-218-props/InformationRegisters/КурсыВалют.xml b/tests/skills/cases/meta-compile/snapshots/format-218-props/InformationRegisters/КурсыВалют.xml new file mode 100644 index 00000000..8d8e50fd --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/format-218-props/InformationRegisters/КурсыВалют.xml @@ -0,0 +1,266 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + КурсыВалют + + + ru + Курсы валют + + + + true + InDialog + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + Day + Independent + false + false + Managed + Use + false + false + + + + + + DontUse + false + false + + + + + Курс + + + ru + Курс + + + + + xs:decimal + + 15 + 4 + Any + + + false + + + + false + + false + false + + + false + 0 + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + Use + Use + + + + + Валюта + + + ru + Валюта + + + + + d5p1:CatalogRef.Валюты + + false + + + + false + + false + false + + + true + + DontCheck + Items + + + Auto + Auto + + + Auto + true + true + false + DontIndex + Use + Use + TransformValues + + + + + diff --git a/tests/skills/cases/meta-compile/snapshots/format-218-props/InformationRegisters/КурсыВалют/Ext/RecordSetModule.bsl b/tests/skills/cases/meta-compile/snapshots/format-218-props/InformationRegisters/КурсыВалют/Ext/RecordSetModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-compile/snapshots/format-218-props/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/format-218-props/Languages/Русский.xml new file mode 100644 index 00000000..28d781ed --- /dev/null +++ b/tests/skills/cases/meta-compile/snapshots/format-218-props/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-validate/error-220-props-in-217.json b/tests/skills/cases/meta-validate/error-220-props-in-217.json index 521c9eec..04dd4fa5 100644 --- a/tests/skills/cases/meta-validate/error-220-props-in-217.json +++ b/tests/skills/cases/meta-validate/error-220-props-in-217.json @@ -1,9 +1,12 @@ { - "name": "Валидатор находит ошибку: свойства формата 2.20 в файле со штампом 2.17", + "name": "Валидатор находит ошибку: свойства формата 2.18 и 2.20 в файле со штампом 2.17", "setup": "fixture:catalog-220-props-in-217", "params": { "objectPath": "Catalogs/Договоры.xml" }, "expectError": true, "expect": { - "stdoutContains": "появился в формате 2.20, а файл объявлен как 2.17" + "stdoutContains": [ + " появился в формате 2.20, а файл объявлен как 2.17", + " появился в формате 2.18, а файл объявлен как 2.17" + ] } } diff --git a/tests/skills/cases/meta-validate/fixtures/catalog-218-trm/Catalogs/Договоры.xml b/tests/skills/cases/meta-validate/fixtures/catalog-218-trm/Catalogs/Договоры.xml new file mode 100644 index 00000000..651fd605 --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/catalog-218-trm/Catalogs/Договоры.xml @@ -0,0 +1,436 @@ + + + + + + 90475793-7f2d-4304-bab7-16809d2812b3 + 392ed078-9828-4325-b7d9-2113acf8602d + + + 87310fbf-3c05-4451-9ca2-3735afb4375a + cac80127-3728-41e4-a288-d569b0a9066e + + + 5ae4225d-61d5-4642-b834-9701eb2b4d7f + 1bde218c-5ff8-4174-8220-3681d70e646d + + + ffcfea35-91c0-4ad1-b76e-2af5c16e3f31 + 990952eb-8923-4857-8669-1d0f1ed62ce0 + + + 2a2f6f30-ef6f-4b2b-8344-1c4a910fcd03 + 8bc0a66d-e4d8-4b3d-b78a-766ea4f331a7 + + + + Договоры + + + ru + Договоры + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + Catalog.Валюты + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + true + Auto + Deny + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + true + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + Auto + InDialog + false + BothWays + + Catalog.Договоры.StandardAttribute.Description + Catalog.Договоры.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + + + e5e53441-4538-43f1-ac6c-c545838f7191 + c6804634-97d4-47b7-84cd-cb42c0faa828 + + + ca4e3837-ef21-4cb6-beb0-2b45d2fbc1c2 + 146b9c9c-27bc-4b4e-bb1b-5ef825414f3f + + + + Условия + + + ru + Условия + + + + + DontCheck + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + ForItem + + + + + Условие + + + ru + Условие + + + + + xs:string + + 100 + Variable + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + Use + Use + + + + + + + diff --git a/tests/skills/cases/meta-validate/fixtures/catalog-219-trm/Catalogs/Договоры.xml b/tests/skills/cases/meta-validate/fixtures/catalog-219-trm/Catalogs/Договоры.xml new file mode 100644 index 00000000..5ff53d6f --- /dev/null +++ b/tests/skills/cases/meta-validate/fixtures/catalog-219-trm/Catalogs/Договоры.xml @@ -0,0 +1,436 @@ + + + + + + 90475793-7f2d-4304-bab7-16809d2812b3 + 392ed078-9828-4325-b7d9-2113acf8602d + + + 87310fbf-3c05-4451-9ca2-3735afb4375a + cac80127-3728-41e4-a288-d569b0a9066e + + + 5ae4225d-61d5-4642-b834-9701eb2b4d7f + 1bde218c-5ff8-4174-8220-3681d70e646d + + + ffcfea35-91c0-4ad1-b76e-2af5c16e3f31 + 990952eb-8923-4857-8669-1d0f1ed62ce0 + + + 2a2f6f30-ef6f-4b2b-8344-1c4a910fcd03 + 8bc0a66d-e4d8-4b3d-b78a-766ea4f331a7 + + + + Договоры + + + ru + Договоры + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + Catalog.Валюты + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + true + Auto + Deny + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + true + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + ShowError + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + Auto + InDialog + false + BothWays + + Catalog.Договоры.StandardAttribute.Description + Catalog.Договоры.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + + + e5e53441-4538-43f1-ac6c-c545838f7191 + c6804634-97d4-47b7-84cd-cb42c0faa828 + + + ca4e3837-ef21-4cb6-beb0-2b45d2fbc1c2 + 146b9c9c-27bc-4b4e-bb1b-5ef825414f3f + + + + Условия + + + ru + Условия + + + + + DontCheck + + + + DontCheck + false + false + Auto + TransformValues + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + ForItem + + + + + Условие + + + ru + Условие + + + + + xs:string + + 100 + Variable + + + false + + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + DontIndex + Use + Use + + + + + + + diff --git a/tests/skills/cases/meta-validate/valid-218-typereductionmode.json b/tests/skills/cases/meta-validate/valid-218-typereductionmode.json new file mode 100644 index 00000000..848b7453 --- /dev/null +++ b/tests/skills/cases/meta-validate/valid-218-typereductionmode.json @@ -0,0 +1,9 @@ +{ + "name": "Файл формата 2.18 с TypeReductionMode валиден (тег появился именно в 2.18)", + "setup": "fixture:catalog-218-trm", + "params": { "objectPath": "Catalogs/Договоры.xml" }, + "noSnapshot": "meta-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout", + "expect": { + "stdoutNotContains": ["появился в формате", "Unusual version"] + } +} diff --git a/tests/skills/cases/meta-validate/valid-219-version-accepted.json b/tests/skills/cases/meta-validate/valid-219-version-accepted.json new file mode 100644 index 00000000..6ffb651e --- /dev/null +++ b/tests/skills/cases/meta-validate/valid-219-version-accepted.json @@ -0,0 +1,9 @@ +{ + "name": "Штамп 2.19 (8.3.26) — законная версия формата, не «Unusual version»", + "setup": "fixture:catalog-219-trm", + "params": { "objectPath": "Catalogs/Договоры.xml" }, + "noSnapshot": "meta-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout", + "expect": { + "stdoutNotContains": ["Unusual version", "появился в формате"] + } +} diff --git a/tests/skills/runner.mjs b/tests/skills/runner.mjs index 6996634f..0e2b614e 100644 --- a/tests/skills/runner.mjs +++ b/tests/skills/runner.mjs @@ -125,8 +125,11 @@ function ensureSetup(setupName, runtime, skillCasesDir) { // Пустые конфигурации-фикстуры. Версия формата и режим совместимости — независимые оси: // формат задаёт платформа выгрузки, а режим влияет на дефолт у ТЧ // (<=8_3_26 → 5, >=8_3_27 → 9). Отсюда две 2.20-фикстуры с разными режимами. + // Фикстура 2.18 (8.3.25) держит границу между свойствами: TypeReductionMode там уже есть, + // а LineNumberLength ещё нет — он появился только в 2.20. const EMPTY_CONFIGS = { 'empty-config': [], + 'empty-config-218': ['-FormatVersion', '2.18', '-CompatibilityMode', 'Version8_3_24'], 'empty-config-220': ['-FormatVersion', '2.20', '-CompatibilityMode', 'Version8_3_27'], 'empty-config-220-compat24': ['-FormatVersion', '2.20', '-CompatibilityMode', 'Version8_3_24'], };