diff --git a/.claude/skills/cf-init/scripts/cf-init.ps1 b/.claude/skills/cf-init/scripts/cf-init.ps1
index 7efe03ac..6cab99d3 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.6 — Create empty 1C configuration scaffold
+# cf-init v1.7 — Create empty 1C configuration scaffold
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -77,10 +77,35 @@ if ($Synonym) {
$vendorEl = if ($Vendor) { "$([System.Security.SecurityElement]::Escape($Vendor))" } else { "" }
$versionEl = if ($Version) { "$([System.Security.SecurityElement]::Escape($Version))" } else { "" }
+# --- Свойства и пространство имён формата 2.21 (платформа 8.5) ---
+# Значения и ПОЗИЦИИ сняты с выгрузки 8.5.1 (debug/fmt221/dump_v851): те же исходники,
+# выгруженные с 8.3.27 и с 8.5.1, различаются ровно этим. Порядок важен — вставки идут
+# на своё место, а не в конец.
+$is221 = (($FormatVersion -match '^(\d+)\.(\d+)$') -and ([int]$Matches[1] * 100 + [int]$Matches[2]) -ge 221)
+$nl = "`r`n"
+$f221AuxForms = ""; $f221WindowVariant = ""; $f221OpenVariant = ""; $f221Captions = ""; $f221Migration = ""
+$palNs = ""
+if ($is221) {
+ $palNs = ' xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette"'
+ # Скобки вокруг -join обязательны: без них `$nl + (массив) -join $nl` разбирается как
+ # `($nl + массив) -join $nl`, массив склеивается пробелами и все теги уезжают в одну строку.
+ $f221AuxForms = $nl + ((@(
+ "", "", "",
+ "", "",
+ "", "",
+ ""
+ ) | ForEach-Object { "`t`t`t$_" }) -join $nl)
+ $f221WindowVariant = $nl + "`t`t`tNavigationLeft" +
+ $nl + "`t`t`tAuto"
+ $f221OpenVariant = $nl + "`t`t`tOpenDataInDialogs"
+ $f221Captions = $nl + "`t`t`t
" + $nl + "`t`t`t"
+ $f221Migration = $nl + "`t`t`tDontUse"
+}
+
# --- Configuration.xml ---
$cfgXml = @"
-
+
@@ -147,15 +172,15 @@ $cfgXml = @"
-
+ $f221AuxForms
$mobileXml
-
- Normal
-
+ $f221WindowVariant
+ Normal$f221OpenVariant
+ $f221Captions
Language.Русский
@@ -167,7 +192,7 @@ $cfgXml = @"
NotAutoFree
DontUse
DontUse
- TaxiEnableVersion8_2
+ TaxiEnableVersion8_2$f221Migration
DontUse
$CompatibilityMode
@@ -182,7 +207,7 @@ $cfgXml = @"
# --- Languages/Русский.xml ---
$langXml = @"
-
+
Русский
diff --git a/.claude/skills/cf-init/scripts/cf-init.py b/.claude/skills/cf-init/scripts/cf-init.py
index 11ea0d9f..909960df 100644
--- a/.claude/skills/cf-init/scripts/cf-init.py
+++ b/.claude/skills/cf-init/scripts/cf-init.py
@@ -1,8 +1,8 @@
#!/usr/bin/env python3
-# cf-init v1.6 — Create empty 1C configuration scaffold
+# cf-init v1.7 — 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
+import sys, os, argparse, re, uuid
def esc_xml(s):
return s.replace('&','&').replace('<','<').replace('>','>').replace('"','"')
@@ -105,6 +105,30 @@ def main():
"fb282519-d103-4dd3-bc12-cb271d631dfc",
]
+ # Свойства и пространство имён формата 2.21 (платформа 8.5). Значения и ПОЗИЦИИ сняты
+ # с выгрузки 8.5.1 (debug/fmt221/dump_v851): те же исходники, выгруженные с 8.3.27 и
+ # с 8.5.1, различаются ровно этим. Порядок важен — вставки идут на своё место.
+ _fm = re.match(r'^(\d+)\.(\d+)$', args.FormatVersion)
+ is_221 = bool(_fm) and int(_fm.group(1)) * 100 + int(_fm.group(2)) >= 221
+ pal_ns = ""
+ f221_aux_forms = f221_window_variant = f221_open_variant = f221_captions = f221_migration = ""
+ if is_221:
+ pal_ns = ' xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette"'
+ f221_aux_forms = "\r\n" + "\r\n".join(
+ f"\t\t\t{t}" for t in (
+ "", "", "",
+ "", "",
+ "", "",
+ ""))
+ f221_window_variant = ("\r\n\t\t\tNavigationLeft"
+ ""
+ "\r\n\t\t\tAuto")
+ f221_open_variant = ("\r\n\t\t\tOpenDataInDialogs"
+ "")
+ f221_captions = "\r\n\t\t\t\r\n\t\t\t"
+ f221_migration = ("\r\n\t\t\tDontUse"
+ "")
+
contained_objects = ""
for i in range(7):
contained_objects += f"""\t\t\t
@@ -113,7 +137,7 @@ def main():
\t\t\t\n"""
cfg_xml = f'''
-
+
\t
\t\t
{contained_objects}\t\t
@@ -152,15 +176,15 @@ def main():
\t\t\t
\t\t\t
\t\t\t
-\t\t\t
+\t\t\t{f221_aux_forms}
\t\t\t
\t\t\t{mobile_xml}
\t\t\t
\t\t\t
\t\t\t
-\t\t\t
-\t\t\tNormal
-\t\t\t
+\t\t\t{f221_window_variant}
+\t\t\tNormal{f221_open_variant}
+\t\t\t{f221_captions}
\t\t\t
\t\t\tLanguage.Русский
\t\t\t
@@ -172,7 +196,7 @@ def main():
\t\t\tNotAutoFree
\t\t\tDontUse
\t\t\tDontUse
-\t\t\tTaxiEnableVersion8_2
+\t\t\tTaxiEnableVersion8_2{f221_migration}
\t\t\tDontUse
\t\t\t{compat}
\t\t\t
@@ -185,7 +209,7 @@ def main():
# --- Languages/Русский.xml ---
lang_xml = f'''
-
+
\t
\t\t
\t\t\tРусский
diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1
index 32a48a71..3604ef90 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.87 — Compile 1C metadata object from JSON
+# meta-compile v1.88 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -2224,6 +2224,11 @@ function Emit-EnumValue {
X "$indent`t`t$(Esc-XmlText $parsed.name)"
Emit-MLText "$indent`t`t" "Synonym" $parsed.synonym
if ($parsed.comment) { X "$indent`t`t$(Esc-XmlText $parsed.comment)" } else { X "$indent`t`t" }
+ # Цвет значения перечисления — свойство формата 2.21 (8.5), последним в Properties.
+ if ($script:isFormat221) {
+ $color = if ($parsed.color) { "$($parsed.color)" } else { "auto" }
+ X "$indent`t`t$(Esc-XmlText $color)"
+ }
X "$indent`t"
X "$indent"
}
@@ -2890,6 +2895,11 @@ function Emit-CommonFormProperties {
} else {
X "$i"
}
+ # Использование в режиме совместимости интерфейса — свойство формата 2.21 (8.5),
+ # между UsePurposes и UseStandardCommands.
+ if ($script:isFormat221) {
+ X "$i$(Get-EnumProp 'UseInInterfaceCompatibilityMode' 'useInInterfaceCompatibilityMode' 'Any')"
+ }
$useStdCmds = if (Get-BoolProp "useStandardCommands" $false) { "true" } else { "false" }
X "$i$useStdCmds"
Emit-MLText $i "ExtendedPresentation" $def.extendedPresentation
@@ -3200,6 +3210,8 @@ function Emit-ReportProperties {
Emit-VerbatimRef $i "DefaultSettingsForm" $def.defaultSettingsForm
Emit-VerbatimRef $i "AuxiliarySettingsForm" $def.auxiliarySettingsForm
Emit-VerbatimRef $i "DefaultVariantForm" $def.defaultVariantForm
+ # Вспомогательная форма варианта отчёта — свойство формата 2.21 (8.5).
+ if ($script:isFormat221) { Emit-VerbatimRef $i "AuxiliaryVariantForm" $def.auxiliaryVariantForm }
Emit-VerbatimRef $i "VariantsStorage" $def.variantsStorage
Emit-VerbatimRef $i "SettingsStorage" $def.settingsStorage
$inclHelp = if (Get-BoolProp "includeHelpInContents" $false) { "true" } else { "false" }
@@ -4239,6 +4251,15 @@ $script:compatMode = Detect-CompatibilityMode $OutputDir
# глушил бы TypeReductionMode, который платформа этих версий пишет, и роундтрип бы разъезжался.
$script:isFormat218 = (Get-FormatRank $script:formatVersion) -ge 218
$script:isFormat220 = (Get-FormatRank $script:formatVersion) -ge 220
+$script:isFormat221 = (Get-FormatRank $script:formatVersion) -ge 221
+# 2.21 (8.5) добавила в шапку пространство палитры — ради у значений перечисления.
+# Вставляем НА МЕСТО (после lf, перед style): платформа держит объявления по алфавиту.
+# Только для шапок MetaDataObject и Form — в файлах с корнем extrnprops
+# (Ext/ClientApplicationInterface.xml и т.п.) платформа его не пишет.
+if ($script:isFormat221) {
+ $palNs = ' xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette"'
+ $script:xmlnsDecl = $script:xmlnsDecl -replace ' xmlns:style=', "$palNs xmlns:style="
+}
# Дефолт длины номера строки ТЧ: с режима 8.3.27 платформа заводит новые ТЧ с 9 разрядами.
$script:lineNumberLengthDefault = if ((Get-CompatModeRank $script:compatMode) -ge 80327) { 9 } else { 5 }
@@ -4953,6 +4974,8 @@ if ($objType -eq "CommonForm") {
$cfFormXmlPath = Join-Path $extDir "Form.xml"
if (-not (Test-Path $cfFormXmlPath)) {
$cfFormNs = 'xmlns="http://v8.1c.ru/8.3/xcf/logform" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
+ # Шапка Form на 2.21 тоже несёт палитру — см. комментарий у $script:xmlnsDecl.
+ if ($script:isFormat221) { $cfFormNs = $cfFormNs -replace ' xmlns:style=', ' xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style=' }
$cfFormXml = "`r`n`r`n"
Write-XmlFileKeepEol $cfFormXmlPath $cfFormXml $enc
$modulesCreated += $cfFormXmlPath
diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py
index 53f612b3..1aa3a715 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.87 — Compile 1C metadata object from JSON
+# meta-compile v1.88 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -2296,6 +2296,10 @@ def emit_enum_value(indent, parsed):
X(f'{indent}\t\t{esc_xml_text(parsed["comment"])}')
else:
X(f'{indent}\t\t')
+ # Цвет значения перечисления — свойство формата 2.21 (8.5), последним в Properties.
+ if is_format_221:
+ color = str(parsed['color']) if parsed.get('color') else 'auto'
+ X(f'{indent}\t\t{esc_xml_text(color)}')
X(f'{indent}\t')
X(f'{indent}')
@@ -2920,6 +2924,12 @@ def emit_common_form_properties(indent):
X(f'{i}')
else:
X(f'{i}')
+ # Использование в режиме совместимости интерфейса — свойство формата 2.21 (8.5),
+ # между UsePurposes и UseStandardCommands.
+ if is_format_221:
+ X(f'{i}'
+ f'{get_enum_prop("UseInInterfaceCompatibilityMode", "useInInterfaceCompatibilityMode", "Any")}'
+ f'')
use_std_cmds = 'true' if get_bool_prop('useStandardCommands', False) else 'false'
X(f'{i}{use_std_cmds}')
emit_mltext(i, 'ExtendedPresentation', defn.get('extendedPresentation'))
@@ -3237,6 +3247,9 @@ def emit_report_properties(indent):
emit_verbatim_ref(i, 'DefaultSettingsForm', defn.get('defaultSettingsForm'))
emit_verbatim_ref(i, 'AuxiliarySettingsForm', defn.get('auxiliarySettingsForm'))
emit_verbatim_ref(i, 'DefaultVariantForm', defn.get('defaultVariantForm'))
+ # Вспомогательная форма варианта отчёта — свойство формата 2.21 (8.5).
+ if is_format_221:
+ emit_verbatim_ref(i, 'AuxiliaryVariantForm', defn.get('auxiliaryVariantForm'))
emit_verbatim_ref(i, 'VariantsStorage', defn.get('variantsStorage'))
emit_verbatim_ref(i, 'SettingsStorage', defn.get('settingsStorage'))
incl_help = 'true' if get_bool_prop('includeHelpInContents', False) else 'false'
@@ -4149,6 +4162,15 @@ compat_mode = detect_compatibility_mode(output_dir)
# глушил бы TypeReductionMode, который платформа этих версий пишет, и роундтрип бы разъезжался.
is_format_218 = format_rank(format_version) >= 218
is_format_220 = format_rank(format_version) >= 220
+is_format_221 = format_rank(format_version) >= 221
+# 2.21 (8.5) добавила в шапку пространство палитры — ради у значений перечисления.
+# Вставляем НА МЕСТО (после lf, перед style): платформа держит объявления по алфавиту.
+# Только для шапок MetaDataObject и Form — в файлах с корнем extrnprops
+# (Ext/ClientApplicationInterface.xml и т.п.) платформа его не пишет.
+if is_format_221:
+ xmlns_decl = xmlns_decl.replace(
+ ' xmlns:style=',
+ ' xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style=')
# Дефолт длины номера строки ТЧ: с режима 8.3.27 платформа заводит новые ТЧ с 9 разрядами.
line_number_length_default = 9 if compat_mode_rank(compat_mode) >= 80327 else 5
@@ -4622,6 +4644,10 @@ if obj_type == 'CommonForm':
'xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" '
'xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" '
'xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"')
+ # Шапка Form на 2.21 тоже несёт палитру — см. комментарий у xmlns_decl.
+ if is_format_221:
+ cf_ns = cf_ns.replace(' xmlns:style=',
+ ' xmlns:pal="http://v8.1c.ru/8.1/data/ui/colors/palette" xmlns:style=')
cf_form_xml = ('\r\n\r\n')
diff --git a/.claude/skills/meta-edit/scripts/meta-edit.ps1 b/.claude/skills/meta-edit/scripts/meta-edit.ps1
index 9996ee7a..4448dac2 100644
--- a/.claude/skills/meta-edit/scripts/meta-edit.ps1
+++ b/.claude/skills/meta-edit/scripts/meta-edit.ps1
@@ -1,4 +1,4 @@
-# meta-edit v1.30 — Edit existing 1C metadata object XML
+# meta-edit v1.31 — Edit existing 1C metadata object XML
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$DefinitionFile,
@@ -318,6 +318,12 @@ $root = $script:xmlDoc.DocumentElement
# Ищем по объявлениям корня, а не через GetPrefixOfNamespace: ссылочный тип живёт в
# ТЕКСТЕ узла, поэтому XML-слой этот префикс не отслеживает. $null = корень URI не
# объявляет → эмиттер остаётся на самодостаточной локальной форме.
+# Версия формата правимого файла — из его же корня. Нужна эмиттерам: часть свойств
+# появилась в поздних версиях (напр. у значения перечисления — в 2.21).
+$script:formatVersion = $root.GetAttribute("version")
+if (-not $script:formatVersion) { $script:formatVersion = "2.17" }
+$script:isFormat221 = ($script:formatVersion -match '^(\d+)\.(\d+)$') -and ([int]$Matches[1] * 100 + [int]$Matches[2]) -ge 221
+
$script:cfgUri = 'http://v8.1c.ru/8.1/data/enterprise/current-config'
$script:cfgPrefix = $null
foreach ($a in $root.Attributes) {
@@ -1300,6 +1306,9 @@ function Build-EnumValueFragment {
$sb.AppendLine("$indent`t`t$(Esc-XmlText $parsed.name)") | Out-Null
$sb.AppendLine($(Build-MLTextXml "$indent`t`t" "Synonym" $parsed.synonym)) | Out-Null
$sb.AppendLine("$indent`t`t") | Out-Null
+ # Цвет значения — свойство формата 2.21 (8.5). Без него добавленное значение
+ # отличалось бы от соседних, написанных платформой.
+ if ($script:isFormat221) { $sb.AppendLine("$indent`t`tauto") | Out-Null }
$sb.AppendLine("$indent`t") | Out-Null
$sb.Append("$indent") | Out-Null
return $sb.ToString()
diff --git a/.claude/skills/meta-edit/scripts/meta-edit.py b/.claude/skills/meta-edit/scripts/meta-edit.py
index 79bc38ee..a62db424 100644
--- a/.claude/skills/meta-edit/scripts/meta-edit.py
+++ b/.claude/skills/meta-edit/scripts/meta-edit.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# meta-edit v1.30 — Edit existing 1C metadata object XML
+# meta-edit v1.31 — Edit existing 1C metadata object XML
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -198,6 +198,9 @@ V8_NS = "http://v8.1c.ru/8.1/data/core"
XSI_NS = "http://www.w3.org/2001/XMLSchema-instance"
XS_NS = "http://www.w3.org/2001/XMLSchema"
CFG_NS = "http://v8.1c.ru/8.1/data/enterprise/current-config"
+# Версия формата правимого файла — из его же корня. Нужна эмиттерам: часть свойств
+# появилась в поздних версиях (напр. у значения перечисления — в 2.21).
+is_format_221 = False
# Префикс current-config, объявленный в КОРНЕ правимого файла (у платформы — cfg).
# None = корень его не объявляет → эмиттер ссылочных типов остаётся на локальной форме.
cfg_prefix = None
@@ -1266,6 +1269,10 @@ def build_enum_value_fragment(parsed, indent):
lines.append(f"{indent}\t\t{esc_xml_text(parsed['name'])}")
lines.append(build_mltext_xml(f"{indent}\t\t", "Synonym", parsed["synonym"]))
lines.append(f"{indent}\t\t")
+ # Цвет значения — свойство формата 2.21 (8.5). Без него добавленное значение
+ # отличалось бы от соседних, написанных платформой.
+ if is_format_221:
+ lines.append(f"{indent}\t\tauto")
lines.append(f"{indent}\t")
lines.append(f"{indent}")
return "\r\n".join(lines)
@@ -3207,8 +3214,11 @@ def main():
xml_root = xml_tree.getroot()
# Префикс current-config берём из объявлений корня — им и пишем ссылочные типы.
- global cfg_prefix
+ global cfg_prefix, is_format_221
cfg_prefix = next((p for p, u in (xml_root.nsmap or {}).items() if u == CFG_NS and p), None)
+ _fv = xml_root.get("version") or "2.17"
+ _m = re.match(r'^(\d+)\.(\d+)$', _fv)
+ is_format_221 = bool(_m) and int(_m.group(1)) * 100 + int(_m.group(2)) >= 221
# --- Detect object type ---
if localname(xml_root) != "MetaDataObject":
diff --git a/.claude/skills/meta-validate/scripts/meta-validate.ps1 b/.claude/skills/meta-validate/scripts/meta-validate.ps1
index 5f0b1d4d..8d9edf71 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.13 — Validate 1C metadata object structure (+корневой : скаляр без структуры = ошибка)
+# meta-validate v1.14 — Validate 1C metadata object structure (+корневой : скаляр без структуры = ошибка)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -344,9 +344,10 @@ if ($root.NamespaceURI -ne $expectedNs) {
$version = $root.GetAttribute("version")
if (-not $version) {
Report-Warn "1. Missing version attribute on MetaDataObject"
-} 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)"
+} 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), 2.21 (8.5). Версию задаёт платформа ВЫГРУЗКИ, а не режим совместимости.
+ Report-Warn "1. Unusual version '$version' (expected 2.17-2.21)"
}
# Detect type element — exactly one child element in md namespace
@@ -1502,6 +1503,10 @@ if ($script:configDir) {
$versionedProps = @{
"TypeReductionMode" = "2.18" # режим приведения типов (стандартные реквизиты, измерения РС)
"LineNumberLength" = "2.20" # длина номера строки ТЧ (5..9)
+ # 2.21 (8.5): подтверждено синтетикой — одни исходники, выгрузка с 8.3.27 и с 8.5.1.
+ "Color" = "2.21" # цвет значения перечисления
+ "AuxiliaryVariantForm" = "2.21" # вспомогательная форма варианта отчёта
+ "UseInInterfaceCompatibilityMode" = "2.21" # использование общей формы в режиме совместимости интерфейса
}
# Версия формата как число: "2.20" → 220. Строковое сравнение неверно ("2.9" > "2.17").
function Get-FormatRank([string]$v) {
diff --git a/.claude/skills/meta-validate/scripts/meta-validate.py b/.claude/skills/meta-validate/scripts/meta-validate.py
index 11ab456c..370b2014 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.13 — Validate 1C metadata object structure (Python port) (+корневой : скаляр без структуры = ошибка)
+# meta-validate v1.14 — Validate 1C metadata object structure (Python port) (+корневой : скаляр без структуры = ошибка)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import os
@@ -371,9 +371,10 @@ 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.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)")
+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), 2.21 (8.5). Версию задаёт платформа ВЫГРУЗКИ, а не режим совместимости.
+ report_warn(f"1. Unusual version '{version}' (expected 2.17-2.21)")
# Detect type element -- exactly one child element in md namespace
type_node = None
@@ -1404,6 +1405,10 @@ if config_dir:
versioned_props = {
"TypeReductionMode": "2.18", # режим приведения типов (стандартные реквизиты, измерения РС)
"LineNumberLength": "2.20", # длина номера строки ТЧ (5..9)
+ # 2.21 (8.5): подтверждено синтетикой — одни исходники, выгрузка с 8.3.27 и с 8.5.1.
+ "Color": "2.21", # цвет значения перечисления
+ "AuxiliaryVariantForm": "2.21", # вспомогательная форма варианта отчёта
+ "UseInInterfaceCompatibilityMode": "2.21", # использование общей формы в режиме совместимости интерфейса
}