feat(meta-compile): прощающий ввод ссылок на формы по умолчанию (v1.19)

Default*Form/Auxiliary*Form нормализуются как fillValue-ссылки: русский
корень (Справочник→Catalog), сегмент Форма→Form, и короткая запись без него
(Справочник.X.ФормаЭлемента ≡ Справочник.X.Форма.ФормаЭлемента ≡ канон).
Канон англ. — идемпотентно (снэпшоты не меняются). Декомпилятор эмитит
канон, роундтрип не затронут.

Кейс catalog-object-props переведён на русскую форму (лочит нормализацию),
spec §7.1. Регресс 40/40 ps1+py, ps1↔py идентичны.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-03 19:00:59 +03:00
parent ef20f6ece8
commit 1565ae23ab
4 changed files with 42 additions and 7 deletions
@@ -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 '.')
}
# Ссылка на форму по умолчанию: непустая → <Tag>значение</Tag>, иначе <Tag/>.
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) {
@@ -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):
"""Ссылка на форму по умолчанию: непустая → <Tag>значение</Tag>, иначе <Tag/>."""
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}/>')
+5 -1
View File
@@ -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) |
@@ -13,8 +13,8 @@
"predefinedDataUpdate": "DontAutoUpdate",
"searchStringModeOnInputByString": "AnyPart",
"defaultObjectForm": "Catalog.НастройкиОбмена.Form.ФормаЭлемента",
"defaultListForm": "Catalog.НастройкиОбмена.Form.ФормаСписка",
"defaultChoiceForm": "Catalog.НастройкиОбмена.Form.ФормаВыбора",
"defaultListForm": "Справочник.НастройкиОбмена.Форма.ФормаСписка",
"defaultChoiceForm": "Справочник.НастройкиОбмена.ФормаВыбора",
"attributes": [
"Код: String(9)"
]