feat(form-decompile,form-compile): батч скаляров — форм. ChildItemsWidth/VerticalAlign/HorizontalSpacing + check/radio EqualItemsWidth/ItemTitleHeight

Раундтрип терял несколько pass-through скаляров:
- форм-уровень <ChildItemsWidth> (36 форм), <VerticalAlign> (26), <HorizontalSpacing> (25) —
  обрабатывались только как элементные генерики, не на форм-уровне;
- <EqualItemsWidth> (check/radio, 28: false 23/true 5) и <ItemTitleHeight> (radio) — чистый
  двусторонний пробел (не ловились вовсе).

decompile: форм-уровневые → KNOWN_FORM_PROPS; элементные → GENERIC_SCALARS (зеркало компилятора).
compile (ps1+py): форм-уровневые через generic Emit-Properties (авто-PascalCase); элементные —
в genericScalars (Emit-Layout→Emit-GenericScalars, покрывает check/radio).

Верификация: таргет-раундтрип 129 форм с этими тегами → 5 категорий закрыты (0 LOST; остаток —
др. категории Button>Parameter/valueType/content). Регресс form-compile 43/43 (ps1+py); 1С-cert
groups (форм-уровень) + radio-auto-enum (element). spec.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-06-12 16:21:59 +03:00
parent 01e5de8acf
commit c383cc4ffe
8 changed files with 26 additions and 5 deletions
@@ -1,4 +1,4 @@
# form-compile v1.136 — Compile 1C managed form from JSON or object metadata
# form-compile v1.137 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[string]$JsonPath,
@@ -3053,6 +3053,9 @@ $script:genericScalars = @(
@{ Tag='Zoomable'; Key='zoomable'; Kind='bool' }
@{ Tag='Shape'; Key='shape'; Kind='value' }
@{ Tag='PictureLocation'; Key='pictureLocation'; Kind='value' }
# Равная ширина элементов (check/radio) / высота заголовка пункта (radio)
@{ Tag='EqualItemsWidth'; Key='equalItemsWidth'; Kind='bool' }
@{ Tag='ItemTitleHeight'; Key='itemTitleHeight'; Kind='value' }
)
function Emit-GenericScalars {
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# form-compile v1.136 — Compile 1C managed form from JSON or object metadata
# form-compile v1.137 — Compile 1C managed form from JSON or object metadata
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import copy
@@ -3166,6 +3166,9 @@ GENERIC_SCALARS = [
('Zoomable', 'zoomable', 'bool'),
('Shape', 'shape', 'value'),
('PictureLocation', 'pictureLocation', 'value'),
# Равная ширина элементов (check/radio) / высота заголовка пункта (radio)
('EqualItemsWidth', 'equalItemsWidth', 'bool'),
('ItemTitleHeight', 'itemTitleHeight', 'value'),
]
@@ -1,4 +1,4 @@
# form-decompile v0.109 — Decompile 1C managed Form.xml to JSON DSL (draft)
# form-decompile v0.110 — Decompile 1C managed Form.xml to JSON DSL (draft)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
param(
@@ -1413,6 +1413,9 @@ $GENERIC_SCALARS = @(
@{ Tag='Zoomable'; Key='zoomable'; Kind='bool' }
@{ Tag='Shape'; Key='shape'; Kind='value' }
@{ Tag='PictureLocation'; Key='pictureLocation'; Kind='value' }
# Равная ширина элементов (check/radio) / высота заголовка пункта (radio)
@{ Tag='EqualItemsWidth'; Key='equalItemsWidth'; Kind='bool' }
@{ Tag='ItemTitleHeight'; Key='itemTitleHeight'; Kind='value' }
)
# Захват generic-скаляров. Специфичная обработка (если ключ уже задан) — побеждает.
@@ -2259,7 +2262,7 @@ $titleNode = $root.SelectSingleNode("lf:Title", $ns)
if ($titleNode) { $t = Get-LangText $titleNode; if ($null -ne $t) { $dsl['title'] = $t } }
# properties (прямые скаляры под <Form>, PascalCase → camelCase)
$KNOWN_FORM_PROPS = @('AutoTitle','ReportResult','DetailsData','ReportFormType','AutoShowState','ReportResultViewMode','ViewModeApplicationOnSetReportResult','WindowOpeningMode','CommandBarLocation','SaveDataInSettings','AutoSaveDataInSettings','AutoTime','UsePostingMode','RepostOnWrite','AutoURL','AutoFillCheck','Customizable','EnterKeyBehavior','VerticalScroll','Width','Height','Group','UseForFoldersAndItems','SaveWindowSettings','ScalingMode','VerticalSpacing','VariantAppearance','ShowCloseButton','HorizontalAlign','ChildrenAlign','ShowTitle','ConversationsRepresentation','CollapseItemsByImportanceVariant','GroupList')
$KNOWN_FORM_PROPS = @('AutoTitle','ReportResult','DetailsData','ReportFormType','AutoShowState','ReportResultViewMode','ViewModeApplicationOnSetReportResult','WindowOpeningMode','CommandBarLocation','SaveDataInSettings','AutoSaveDataInSettings','AutoTime','UsePostingMode','RepostOnWrite','AutoURL','AutoFillCheck','Customizable','EnterKeyBehavior','VerticalScroll','Width','Height','Group','UseForFoldersAndItems','SaveWindowSettings','ScalingMode','VerticalSpacing','VariantAppearance','ShowCloseButton','HorizontalAlign','ChildrenAlign','ShowTitle','ConversationsRepresentation','CollapseItemsByImportanceVariant','GroupList','ChildItemsWidth','VerticalAlign','HorizontalSpacing')
$props = [ordered]@{}
foreach ($pn in $KNOWN_FORM_PROPS) {
$v = Get-Child $root $pn
+5
View File
@@ -77,6 +77,9 @@
| `showCloseButton` | `<ShowCloseButton>` | `true` / `false` — показывать кнопку закрытия |
| `horizontalAlign` | `<HorizontalAlign>` | `Left`, `Center`, `Right` — горизонтальное выравнивание формы |
| `childrenAlign` | `<ChildrenAlign>` | Выравнивание элементов/заголовков (`ItemsLeftTitlesLeft`, `ItemsRightTitlesLeft`, `None`, …) |
| `childItemsWidth` | `<ChildItemsWidth>` | Ширина дочерних элементов формы (`Equal`, `LeftWide`, `LeftNarrow`, …) |
| `verticalAlign` | `<VerticalAlign>` | Вертикальное выравнивание (`Top`/`Center`/`Bottom`) |
| `horizontalSpacing` | `<HorizontalSpacing>` | Горизонтальный интервал между элементами (`Single`/`Double`/`None`/…) |
| `showTitle` | `<ShowTitle>` | `true` / `false` — показывать заголовок формы |
| `conversationsRepresentation` | `<ConversationsRepresentation>` | `Auto`, `Show`, `DontShow` — отображение панели обсуждений; pass-through (редкое) |
| `collapseItemsByImportanceVariant` | `<CollapseItemsByImportanceVariant>` | `DontUse`, `Use` — сворачивание элементов по важности; pass-through (редкое) |
@@ -491,6 +494,8 @@ companion-панели с собственным контентом. Оба не
| `path` | string | DataPath |
| `radioButtonType` | string | `Auto` (по умолчанию), `RadioButtons`, `Tumbler` |
| `columnsCount` | int | Число колонок раскладки |
| `itemTitleHeight` | int | Высота заголовка пункта (`<ItemTitleHeight>`) |
| `equalItemsWidth` | bool | Равная ширина пунктов (`<EqualItemsWidth>`); общий с `check` |
| `titleLocation` | string | Расположение заголовка. **Нет ключа** → умный дефолт `None`. **`""`** → не выводить тег (платформа применит своё умолчание). Значение → как указано |
| `choiceList` | array | Варианты выбора: массив `{ value, presentation }` |
+1 -1
View File
@@ -15,7 +15,7 @@
"validatePath": "DataProcessors/СГруппами/Forms/Форма/Ext/Form.xml",
"input": {
"title": "Группы",
"properties": { "showCloseButton": false, "horizontalAlign": "Left", "childrenAlign": "ItemsLeftTitlesLeft" },
"properties": { "showCloseButton": false, "horizontalAlign": "Left", "childrenAlign": "ItemsLeftTitlesLeft", "childItemsWidth": "Equal", "verticalAlign": "Top", "horizontalSpacing": "Double" },
"elements": [
{ "cmdBar": "КоманднаяПанель", "autofill": true },
{ "group": "horizontal", "name": "ГруппаШапка", "behavior": "usual", "showTitle": true, "title": "Шапка", "shortcut": "Ctrl+G", "childrenAlign": "ItemsRightTitlesLeft", "horizontalStretch": true, "groupHorizontalAlign": "Right", "throughAlign": "Use", "verticalAlign": "Top", "childItemsWidth": "Equal", "horizontalSpacing": "None", "children": [
@@ -35,6 +35,8 @@
"title": "Способ курса",
"radioButtonType": "Auto",
"columnsCount": 1,
"itemTitleHeight": 1,
"equalItemsWidth": false,
"choiceList": [
{ "value": "Enum.СпособыКурса.EnumValue.Авто", "presentation": { "ru": "Автоматически", "en": "Automatic" } },
{ "value": "Enum.СпособыКурса.EnumValue.Ручной", "presentation": "вручную" },
@@ -10,6 +10,9 @@
<ShowCloseButton>false</ShowCloseButton>
<HorizontalAlign>Left</HorizontalAlign>
<ChildrenAlign>ItemsLeftTitlesLeft</ChildrenAlign>
<ChildItemsWidth>Equal</ChildItemsWidth>
<VerticalAlign>Top</VerticalAlign>
<HorizontalSpacing>Double</HorizontalSpacing>
<AutoCommandBar name="ФормаКоманднаяПанель" id="-1">
<Autofill>false</Autofill>
</AutoCommandBar>
@@ -65,6 +65,8 @@
</xr:Value>
</xr:Item>
</ChoiceList>
<EqualItemsWidth>false</EqualItemsWidth>
<ItemTitleHeight>1</ItemTitleHeight>
<ContextMenu name="СпособКурсаКонтекстноеМеню" id="2"/>
<ExtendedTooltip name="СпособКурсаРасширеннаяПодсказка" id="3"/>
</RadioButtonField>