diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1
index 7e64ce4c..6c6189b7 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.18 — Compile 1C metadata object from JSON
+# meta-compile v1.19 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -302,10 +302,24 @@ function Get-BoolProp {
return ("$val" -match '^(true|1|да|истина)$')
}
+# Прощающая нормализация ссылки на форму: рус корень (Справочник→Catalog), сегмент Форма→Form,
+# короткая запись "Тип.Объект.ИмяФормы" (без Form) → вставка Form. Уже канон англ. → без изменений.
+function Normalize-FormRef {
+ param([string]$s)
+ if (-not $s) { return $s }
+ $parts = $s -split '\.'
+ if ($parts.Count -lt 3) { return $s }
+ $root = $script:fillRefRoots[$parts[0].ToLower()]
+ if ($root) { $parts[0] = $root }
+ for ($k = 1; $k -lt $parts.Count; $k++) { if ($parts[$k] -ieq 'Форма') { $parts[$k] = 'Form' } }
+ if (($parts -notcontains 'Form') -and $parts.Count -eq 3) { $parts = @($parts[0], $parts[1], 'Form', $parts[2]) }
+ return ($parts -join '.')
+}
+
# Ссылка на форму по умолчанию: непустая → значение, иначе .
function Emit-FormRef {
param([string]$i, [string]$tag, $val)
- if ($val) { X "$i<$tag>$(Esc-Xml "$val")$tag>" } else { X "$i<$tag/>" }
+ if ($val) { X "$i<$tag>$(Esc-Xml (Normalize-FormRef "$val"))$tag>" } else { X "$i<$tag/>" }
}
if (-not $def.type) {
diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py
index 4f2d4d7e..76c7dff1 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.18 — Compile 1C metadata object from JSON
+# meta-compile v1.19 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -412,10 +412,27 @@ def get_bool_prop(field_name, default):
return val
return str(val).lower() in ('true', '1', 'да', 'истина')
+def normalize_form_ref(s):
+ """Прощающая нормализация ссылки на форму: рус корень, Форма→Form, короткая запись → вставка Form."""
+ if not s:
+ return s
+ parts = s.split('.')
+ if len(parts) < 3:
+ return s
+ root = fill_ref_roots.get(parts[0].lower())
+ if root:
+ parts[0] = root
+ for k in range(1, len(parts)):
+ if parts[k].lower() == 'форма':
+ parts[k] = 'Form'
+ if 'Form' not in parts and len(parts) == 3:
+ parts = [parts[0], parts[1], 'Form', parts[2]]
+ return '.'.join(parts)
+
def emit_form_ref(i, tag, val):
"""Ссылка на форму по умолчанию: непустая → значение, иначе ."""
if val:
- X(f'{i}<{tag}>{esc_xml(str(val))}{tag}>')
+ X(f'{i}<{tag}>{esc_xml(normalize_form_ref(str(val)))}{tag}>')
else:
X(f'{i}<{tag}/>')
diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md
index 51063aa2..ec87aecb 100644
--- a/docs/meta-dsl-spec.md
+++ b/docs/meta-dsl-spec.md
@@ -305,8 +305,12 @@ JSON DSL для описания объектов метаданных конф
| `includeHelpInContents` | `false` | IncludeHelpInContents (bool) |
| `dataLockControlMode` | `Automatic` | DataLockControlMode |
| `fullTextSearch` | `Use` | FullTextSearch |
-| `defaultObjectForm` / `defaultFolderForm` / `defaultListForm` / `defaultChoiceForm` / `defaultFolderChoiceForm` | пусто | Default*Form (ссылка на форму, напр. `Catalog.X.Form.ФормаY`) |
+| `defaultObjectForm` / `defaultFolderForm` / `defaultListForm` / `defaultChoiceForm` / `defaultFolderChoiceForm` | пусто | Default*Form (ссылка на форму) |
| `auxiliaryObjectForm` / `auxiliaryFolderForm` / `auxiliaryListForm` / `auxiliaryChoiceForm` / `auxiliaryFolderChoiceForm` | пусто | Auxiliary*Form (ссылка на форму) |
+
+Ссылка на форму — `Тип.Объект.Form.ИмяФормы` (напр. `Catalog.НастройкиОбмена.Form.ФормаЭлемента`). Прощающий ввод:
+русский корень (`Справочник`→`Catalog`), сегмент `Форма`→`Form`, и короткая запись без него —
+`Справочник.НастройкиОбмена.ФормаЭлемента` ≡ `Справочник.НастройкиОбмена.Форма.ФормаЭлемента` ≡ канон.
| `owners` | `[]` | Owners |
| `objectPresentation` | пусто | ObjectPresentation (ML) |
| `extendedObjectPresentation` | пусто | ExtendedObjectPresentation (ML) |
diff --git a/tests/skills/cases/meta-compile/catalog-object-props.json b/tests/skills/cases/meta-compile/catalog-object-props.json
index 9fad1621..ea8f8365 100644
--- a/tests/skills/cases/meta-compile/catalog-object-props.json
+++ b/tests/skills/cases/meta-compile/catalog-object-props.json
@@ -13,8 +13,8 @@
"predefinedDataUpdate": "DontAutoUpdate",
"searchStringModeOnInputByString": "AnyPart",
"defaultObjectForm": "Catalog.НастройкиОбмена.Form.ФормаЭлемента",
- "defaultListForm": "Catalog.НастройкиОбмена.Form.ФормаСписка",
- "defaultChoiceForm": "Catalog.НастройкиОбмена.Form.ФормаВыбора",
+ "defaultListForm": "Справочник.НастройкиОбмена.Форма.ФормаСписка",
+ "defaultChoiceForm": "Справочник.НастройкиОбмена.ФормаВыбора",
"attributes": [
"Код: String(9)"
]