mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-18 07:35:52 +03:00
feat(form-decompile,form-compile): поведение группы — ключ behavior (usual/collapsible/popup)
<Behavior> у UsualGroup: дефолт Авто (не эмитится), явные Обычное/Свертываемая/Всплывающая эмитятся. Платформа пишет тег только при не-Авто (чистое правило эмиссии). Раньше декомпилятор мапил только Collapsible (в group:'collapsible'), теряя явный Usual (28069) и PopUp (141). Развязаны group (направление) и behavior: - group: horizontal/vertical/alwaysHorizontal/alwaysVertical (направление); - behavior: usual/collapsible/popup → <Behavior>; отсутствие = Авто. Legacy group:'collapsible' принимается (= vertical + behavior collapsible) — старые входы целы. Collapsed обобщён: эмитится при collapsed:true независимо от behavior (в XML <Collapsed> изредка есть и у PopUp/Usual — round-trip ловит фактическое наличие). TOTAL diff lines выборки 2.17: 3347 → 3179 (-168). UsualGroup>Behavior residual → 0. Снапшот groups (behavior usual + collapsible/collapsed) сертифицирован в 1С (8.3.24). Регресс form-compile 34/34 зелёный на ps + python. decompile v0.38, compile v1.56. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
786bdf97d9
commit
27f5da4829
@@ -1,4 +1,4 @@
|
|||||||
# form-compile v1.55 — Compile 1C managed form from JSON or object metadata
|
# form-compile v1.56 — Compile 1C managed form from JSON or object metadata
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[string]$JsonPath,
|
[string]$JsonPath,
|
||||||
@@ -2435,7 +2435,7 @@ function Emit-Element {
|
|||||||
# label/hyperlink
|
# label/hyperlink
|
||||||
"hyperlink"=1;"formatted"=1
|
"hyperlink"=1;"formatted"=1
|
||||||
# group-specific
|
# group-specific
|
||||||
"showTitle"=1;"united"=1;"collapsed"=1
|
"showTitle"=1;"united"=1;"collapsed"=1;"behavior"=1
|
||||||
# hierarchy
|
# hierarchy
|
||||||
"children"=1;"columns"=1
|
"children"=1;"columns"=1
|
||||||
# table-specific
|
# table-specific
|
||||||
@@ -2635,23 +2635,27 @@ function Emit-Group {
|
|||||||
|
|
||||||
Emit-Title -el $el -name $name -indent $inner
|
Emit-Title -el $el -name $name -indent $inner
|
||||||
|
|
||||||
# Group orientation
|
# Group orientation (направление). Legacy: group:'collapsible' = Vertical + behavior collapsible.
|
||||||
$groupVal = "$($el.group)"
|
$groupVal = "$($el.group)".ToLower()
|
||||||
$orientation = switch ($groupVal) {
|
$orientation = switch ($groupVal) {
|
||||||
"horizontal" { "Horizontal" }
|
"horizontal" { "Horizontal" }
|
||||||
"vertical" { "Vertical" }
|
"vertical" { "Vertical" }
|
||||||
"alwaysHorizontal" { "AlwaysHorizontal" }
|
"alwayshorizontal" { "AlwaysHorizontal" }
|
||||||
"alwaysVertical" { "AlwaysVertical" }
|
"alwaysvertical" { "AlwaysVertical" }
|
||||||
|
"collapsible" { "Vertical" }
|
||||||
default { $null }
|
default { $null }
|
||||||
}
|
}
|
||||||
if ($orientation) { X "$inner<Group>$orientation</Group>" }
|
if ($orientation) { X "$inner<Group>$orientation</Group>" }
|
||||||
|
|
||||||
# Behavior
|
# Behavior: ключ behavior (usual/collapsible/popup) → <Behavior>; отсутствие = Авто (не эмитим).
|
||||||
if ($groupVal -eq "collapsible") {
|
# Legacy: group:'collapsible' эквивалентно behavior:'collapsible'.
|
||||||
X "$inner<Group>Vertical</Group>"
|
$behaviorVal = if ($el.behavior) { "$($el.behavior)".ToLower() } elseif ($groupVal -eq "collapsible") { "collapsible" } else { $null }
|
||||||
X "$inner<Behavior>Collapsible</Behavior>"
|
$bmap = @{ "usual"="Usual"; "collapsible"="Collapsible"; "popup"="PopUp" }
|
||||||
if ($el.collapsed -eq $true) { X "$inner<Collapsed>true</Collapsed>" }
|
if ($behaviorVal -and $bmap.ContainsKey($behaviorVal)) {
|
||||||
|
X "$inner<Behavior>$($bmap[$behaviorVal])</Behavior>"
|
||||||
}
|
}
|
||||||
|
# Collapsed — у Collapsible и PopUp (не привязано к одному behavior)
|
||||||
|
if ($el.collapsed -eq $true) { X "$inner<Collapsed>true</Collapsed>" }
|
||||||
|
|
||||||
# Representation
|
# Representation
|
||||||
if ($el.representation) {
|
if ($el.representation) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# form-compile v1.55 — Compile 1C managed form from JSON or object metadata
|
# form-compile v1.56 — Compile 1C managed form from JSON or object metadata
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
import argparse
|
import argparse
|
||||||
import copy
|
import copy
|
||||||
@@ -1773,7 +1773,7 @@ KNOWN_KEYS = {
|
|||||||
"spinButton", "dropListButton", "markIncomplete", "skipOnInput", "inputHint",
|
"spinButton", "dropListButton", "markIncomplete", "skipOnInput", "inputHint",
|
||||||
"textEdit",
|
"textEdit",
|
||||||
"hyperlink", "formatted",
|
"hyperlink", "formatted",
|
||||||
"showTitle", "united", "collapsed",
|
"showTitle", "united", "collapsed", "behavior",
|
||||||
"children", "columns",
|
"children", "columns",
|
||||||
"changeRowSet", "changeRowOrder", "autoInsertNewRow", "rowFilter", "header", "footer",
|
"changeRowSet", "changeRowOrder", "autoInsertNewRow", "rowFilter", "header", "footer",
|
||||||
"commandBarLocation", "searchStringLocation", "viewStatusLocation", "searchControlLocation",
|
"commandBarLocation", "searchStringLocation", "viewStatusLocation", "searchControlLocation",
|
||||||
@@ -2545,23 +2545,27 @@ def emit_group(lines, el, name, eid, indent):
|
|||||||
emit_title(lines, el, name, inner)
|
emit_title(lines, el, name, inner)
|
||||||
|
|
||||||
# Group orientation
|
# Group orientation
|
||||||
group_val = str(el.get('group', ''))
|
# Group orientation (направление). Legacy: group:'collapsible' = Vertical + behavior collapsible.
|
||||||
|
group_val = str(el.get('group', '')).lower()
|
||||||
orientation_map = {
|
orientation_map = {
|
||||||
'horizontal': 'Horizontal',
|
'horizontal': 'Horizontal',
|
||||||
'vertical': 'Vertical',
|
'vertical': 'Vertical',
|
||||||
'alwaysHorizontal': 'AlwaysHorizontal',
|
'alwayshorizontal': 'AlwaysHorizontal',
|
||||||
'alwaysVertical': 'AlwaysVertical',
|
'alwaysvertical': 'AlwaysVertical',
|
||||||
|
'collapsible': 'Vertical',
|
||||||
}
|
}
|
||||||
orientation = orientation_map.get(group_val)
|
orientation = orientation_map.get(group_val)
|
||||||
if orientation:
|
if orientation:
|
||||||
lines.append(f'{inner}<Group>{orientation}</Group>')
|
lines.append(f'{inner}<Group>{orientation}</Group>')
|
||||||
|
|
||||||
# Behavior
|
# Behavior: ключ behavior (usual/collapsible/popup) → <Behavior>; отсутствие = Авто (не эмитим).
|
||||||
if group_val == 'collapsible':
|
behavior_val = str(el['behavior']).lower() if el.get('behavior') else ('collapsible' if group_val == 'collapsible' else None)
|
||||||
lines.append(f'{inner}<Group>Vertical</Group>')
|
bmap = {'usual': 'Usual', 'collapsible': 'Collapsible', 'popup': 'PopUp'}
|
||||||
lines.append(f'{inner}<Behavior>Collapsible</Behavior>')
|
if behavior_val and behavior_val in bmap:
|
||||||
if el.get('collapsed') is True:
|
lines.append(f'{inner}<Behavior>{bmap[behavior_val]}</Behavior>')
|
||||||
lines.append(f'{inner}<Collapsed>true</Collapsed>')
|
# Collapsed — у Collapsible и PopUp (не привязано к одному behavior)
|
||||||
|
if el.get('collapsed') is True:
|
||||||
|
lines.append(f'{inner}<Collapsed>true</Collapsed>')
|
||||||
|
|
||||||
# Representation
|
# Representation
|
||||||
if el.get('representation'):
|
if el.get('representation'):
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# form-decompile v0.37 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
# form-decompile v0.38 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||||
param(
|
param(
|
||||||
@@ -989,12 +989,15 @@ function Decompile-Element {
|
|||||||
|
|
||||||
switch ($tag) {
|
switch ($tag) {
|
||||||
'UsualGroup' {
|
'UsualGroup' {
|
||||||
|
# group = направление (<Group>); behavior = <Behavior> (Авто = нет тега → ключ опускаем).
|
||||||
$g = Get-Child $node 'Group'
|
$g = Get-Child $node 'Group'
|
||||||
$gmap = @{ 'Horizontal'='horizontal'; 'Vertical'='vertical'; 'AlwaysHorizontal'='alwaysHorizontal'; 'AlwaysVertical'='alwaysVertical' }
|
$gmap = @{ 'Horizontal'='horizontal'; 'Vertical'='vertical'; 'AlwaysHorizontal'='alwaysHorizontal'; 'AlwaysVertical'='alwaysVertical' }
|
||||||
|
if ($g -and $gmap.ContainsKey($g)) { $obj[$key] = $gmap[$g] } else { $obj[$key] = 'vertical' }
|
||||||
$behavior = Get-Child $node 'Behavior'
|
$behavior = Get-Child $node 'Behavior'
|
||||||
if ($behavior -eq 'Collapsible') { $obj[$key] = 'collapsible' }
|
if ($behavior) {
|
||||||
elseif ($g -and $gmap.ContainsKey($g)) { $obj[$key] = $gmap[$g] }
|
$bmap = @{ 'Usual'='usual'; 'Collapsible'='collapsible'; 'PopUp'='popup' }
|
||||||
else { $obj[$key] = 'vertical' }
|
if ($bmap.ContainsKey($behavior)) { $obj['behavior'] = $bmap[$behavior] } else { $obj['behavior'] = $behavior }
|
||||||
|
}
|
||||||
$obj['name'] = $name
|
$obj['name'] = $name
|
||||||
Add-CommonProps $obj $node $name
|
Add-CommonProps $obj $node $name
|
||||||
$rep = Get-Child $node 'Representation'
|
$rep = Get-Child $node 'Representation'
|
||||||
|
|||||||
@@ -272,7 +272,9 @@ companion-панели с собственным контентом. Оба не
|
|||||||
|
|
||||||
| Свойство | Тип | Описание |
|
| Свойство | Тип | Описание |
|
||||||
|----------|-----|----------|
|
|----------|-----|----------|
|
||||||
| `group` | string | Ориентация: `horizontal`, `vertical`, `alwaysHorizontal`, `alwaysVertical`, `collapsible` |
|
| `group` | string | Ориентация: `horizontal`, `vertical`, `alwaysHorizontal`, `alwaysVertical`. (Legacy: `collapsible` = `vertical` + `behavior:'collapsible'`) |
|
||||||
|
| `behavior` | string | Поведение (`<Behavior>`): `usual`, `collapsible`, `popup`. **Отсутствие = Авто** (дефолт, не эмитится). Свёртываемая/всплывающая несут доп. свойства |
|
||||||
|
| `collapsed` | bool | Свёрнута (у `collapsible`/`popup`) |
|
||||||
| `children` | array | Вложенные элементы |
|
| `children` | array | Вложенные элементы |
|
||||||
| `showTitle` | bool | Показывать заголовок группы |
|
| `showTitle` | bool | Показывать заголовок группы |
|
||||||
| `representation` | string | `none`, `normal`, `weak`, `strong` |
|
| `representation` | string | `none`, `normal`, `weak`, `strong` |
|
||||||
|
|||||||
@@ -17,12 +17,12 @@
|
|||||||
"title": "Группы",
|
"title": "Группы",
|
||||||
"elements": [
|
"elements": [
|
||||||
{ "cmdBar": "КоманднаяПанель", "autofill": true },
|
{ "cmdBar": "КоманднаяПанель", "autofill": true },
|
||||||
{ "group": "horizontal", "name": "ГруппаШапка", "showTitle": true, "title": "Шапка", "horizontalStretch": true, "groupHorizontalAlign": "Right", "children": [
|
{ "group": "horizontal", "name": "ГруппаШапка", "behavior": "usual", "showTitle": true, "title": "Шапка", "horizontalStretch": true, "groupHorizontalAlign": "Right", "children": [
|
||||||
{ "input": "Поле1", "path": "Поле1", "title": "Поле 1", "width": 20, "skipOnInput": true },
|
{ "input": "Поле1", "path": "Поле1", "title": "Поле 1", "width": 20, "skipOnInput": true },
|
||||||
{ "input": "Поле2", "path": "Поле2", "title": "Поле 2" },
|
{ "input": "Поле2", "path": "Поле2", "title": "Поле 2" },
|
||||||
{ "labelField": "Метка", "path": "Поле1", "groupVerticalAlign": "Center" }
|
{ "labelField": "Метка", "path": "Поле1", "groupVerticalAlign": "Center" }
|
||||||
]},
|
]},
|
||||||
{ "group": "vertical", "name": "ГруппаПодвал", "title": { "ru": "Подвал", "en": "Footer" }, "children": [
|
{ "group": "vertical", "name": "ГруппаПодвал", "behavior": "collapsible", "collapsed": true, "title": { "ru": "Подвал", "en": "Footer" }, "children": [
|
||||||
{ "input": "Поле3", "path": "Поле3", "title": "Поле 3" }
|
{ "input": "Поле3", "path": "Поле3", "title": "Поле 3" }
|
||||||
]}
|
]}
|
||||||
],
|
],
|
||||||
|
|||||||
+3
@@ -23,6 +23,7 @@
|
|||||||
</v8:item>
|
</v8:item>
|
||||||
</Title>
|
</Title>
|
||||||
<Group>Horizontal</Group>
|
<Group>Horizontal</Group>
|
||||||
|
<Behavior>Usual</Behavior>
|
||||||
<HorizontalStretch>true</HorizontalStretch>
|
<HorizontalStretch>true</HorizontalStretch>
|
||||||
<GroupHorizontalAlign>Right</GroupHorizontalAlign>
|
<GroupHorizontalAlign>Right</GroupHorizontalAlign>
|
||||||
<ExtendedTooltip name="ГруппаШапкаРасширеннаяПодсказка" id="4"/>
|
<ExtendedTooltip name="ГруппаШапкаРасширеннаяПодсказка" id="4"/>
|
||||||
@@ -71,6 +72,8 @@
|
|||||||
</v8:item>
|
</v8:item>
|
||||||
</Title>
|
</Title>
|
||||||
<Group>Vertical</Group>
|
<Group>Vertical</Group>
|
||||||
|
<Behavior>Collapsible</Behavior>
|
||||||
|
<Collapsed>true</Collapsed>
|
||||||
<ExtendedTooltip name="ГруппаПодвалРасширеннаяПодсказка" id="15"/>
|
<ExtendedTooltip name="ГруппаПодвалРасширеннаяПодсказка" id="15"/>
|
||||||
<ChildItems>
|
<ChildItems>
|
||||||
<InputField name="Поле3" id="16">
|
<InputField name="Поле3" id="16">
|
||||||
|
|||||||
Reference in New Issue
Block a user