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")" } else { X "$i<$tag/>" } + if ($val) { X "$i<$tag>$(Esc-Xml (Normalize-FormRef "$val"))" } 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))}') + X(f'{i}<{tag}>{esc_xml(normalize_form_ref(str(val)))}') 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)" ]