mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-07 12:10:21 +03:00
feat(form-decompile,form-compile): честно-табличные свойства ChangeRowSet/Order, AutoInsertNewRow, EnableDrag, RowFilter (кластер Table group A)
Свойства редактируемых (ValueTable) таблиц формы, терявшиеся при раундтрипе: - ChangeRowSet/ChangeRowOrder — теперь эмитятся явным значением, включая false (платформа пишет <ChangeRowSet>false</ChangeRowSet> на ValueTable; раньше компилятор эмитил только true → false терялся). Декомпилятор захватывает фактическое значение. - AutoInsertNewRow — новый ключ (автодобавление строки), захват/эмиссия при true. - EnableDrag — декомпилятор теперь захватывает (компилятор уже эмитил). - RowFilter — nil-плейсхолдер <RowFilter xsi:nil="true"/> (в корпусе ВСЕГДА nil, 0 с контентом). DSL-ключ rowFilter: null; компилятор эмитит nil при наличии ключа. Зеркало в form-compile.py идентично (py==ps1 проверено на ValueTable-формах). Валидация: все четыре — 0 LOST / 0 ADDED (полностью закрыты); round-trip CLEAN на ValueTable-формах (БанкиУниверсальногоОбмена, БанковскиеСчета); регресс 33/33 ps+py; harness 7971→7774 (−197), 0 fail. Вывод байт-идентичен реальным формам платформы. Spec: changeRowSet/changeRowOrder/autoInsertNewRow/enableDrag/rowFilter в table-секции. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
a9e1ab64c8
commit
1b56e7a735
@@ -1,4 +1,4 @@
|
||||
# form-compile v1.41 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.42 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[string]$JsonPath,
|
||||
@@ -2337,7 +2337,7 @@ function Emit-Element {
|
||||
# hierarchy
|
||||
"children"=1;"columns"=1
|
||||
# table-specific
|
||||
"changeRowSet"=1;"changeRowOrder"=1;"header"=1;"footer"=1
|
||||
"changeRowSet"=1;"changeRowOrder"=1;"autoInsertNewRow"=1;"rowFilter"=1;"header"=1;"footer"=1
|
||||
"commandBarLocation"=1;"searchStringLocation"=1;"viewStatusLocation"=1;"searchControlLocation"=1
|
||||
"excludedCommands"=1
|
||||
"choiceMode"=1;"initialTreeView"=1;"enableDrag"=1;"enableStartDrag"=1
|
||||
@@ -3016,8 +3016,16 @@ function Emit-Table {
|
||||
X "$inner<Representation>$($el.representation)</Representation>"
|
||||
}
|
||||
if ($el.titleLocation) { X "$inner<TitleLocation>$(Map-TitleLoc "$($el.titleLocation)")</TitleLocation>" }
|
||||
if ($el.changeRowSet -eq $true) { X "$inner<ChangeRowSet>true</ChangeRowSet>" }
|
||||
if ($el.changeRowOrder -eq $true) { X "$inner<ChangeRowOrder>true</ChangeRowOrder>" }
|
||||
# ChangeRowSet/Order — эмитим явное значение (в т.ч. false: платформа пишет его на ValueTable)
|
||||
if ($el.PSObject.Properties['changeRowSet'] -and $null -ne $el.changeRowSet) {
|
||||
X "$inner<ChangeRowSet>$(if ($el.changeRowSet -eq $true){'true'}else{'false'})</ChangeRowSet>"
|
||||
}
|
||||
if ($el.PSObject.Properties['changeRowOrder'] -and $null -ne $el.changeRowOrder) {
|
||||
X "$inner<ChangeRowOrder>$(if ($el.changeRowOrder -eq $true){'true'}else{'false'})</ChangeRowOrder>"
|
||||
}
|
||||
if ($el.autoInsertNewRow -eq $true) { X "$inner<AutoInsertNewRow>true</AutoInsertNewRow>" }
|
||||
# RowFilter — nil-плейсхолдер (всегда пустой); ключ присутствует → эмитим
|
||||
if ($el.PSObject.Properties['rowFilter']) { X "$inner<RowFilter xsi:nil=`"true`"/>" }
|
||||
if ($el.height) { X "$inner<HeightInTableRows>$($el.height)</HeightInTableRows>" }
|
||||
if ($el.header -eq $false) { X "$inner<Header>false</Header>" }
|
||||
if ($el.footer -eq $true) { X "$inner<Footer>true</Footer>" }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# form-compile v1.41 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.42 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import copy
|
||||
@@ -1775,7 +1775,7 @@ KNOWN_KEYS = {
|
||||
"hyperlink", "formatted",
|
||||
"showTitle", "united", "collapsed",
|
||||
"children", "columns",
|
||||
"changeRowSet", "changeRowOrder", "header", "footer",
|
||||
"changeRowSet", "changeRowOrder", "autoInsertNewRow", "rowFilter", "header", "footer",
|
||||
"commandBarLocation", "searchStringLocation", "viewStatusLocation", "searchControlLocation",
|
||||
"excludedCommands",
|
||||
"pagesRepresentation",
|
||||
@@ -2716,10 +2716,16 @@ def emit_table(lines, el, name, eid, indent):
|
||||
lines.append(f'{inner}<Representation>{el["representation"]}</Representation>')
|
||||
if el.get('titleLocation'):
|
||||
lines.append(f'{inner}<TitleLocation>{map_title_loc(el["titleLocation"])}</TitleLocation>')
|
||||
if el.get('changeRowSet') is True:
|
||||
lines.append(f'{inner}<ChangeRowSet>true</ChangeRowSet>')
|
||||
if el.get('changeRowOrder') is True:
|
||||
lines.append(f'{inner}<ChangeRowOrder>true</ChangeRowOrder>')
|
||||
# ChangeRowSet/Order — явное значение (в т.ч. false: платформа пишет его на ValueTable)
|
||||
if 'changeRowSet' in el and el['changeRowSet'] is not None:
|
||||
lines.append(f'{inner}<ChangeRowSet>{"true" if el["changeRowSet"] is True else "false"}</ChangeRowSet>')
|
||||
if 'changeRowOrder' in el and el['changeRowOrder'] is not None:
|
||||
lines.append(f'{inner}<ChangeRowOrder>{"true" if el["changeRowOrder"] is True else "false"}</ChangeRowOrder>')
|
||||
if el.get('autoInsertNewRow') is True:
|
||||
lines.append(f'{inner}<AutoInsertNewRow>true</AutoInsertNewRow>')
|
||||
# RowFilter — nil-плейсхолдер (ключ присутствует → эмитим)
|
||||
if 'rowFilter' in el:
|
||||
lines.append(f'{inner}<RowFilter xsi:nil="true"/>')
|
||||
if el.get('height'):
|
||||
lines.append(f'{inner}<HeightInTableRows>{el["height"]}</HeightInTableRows>')
|
||||
if el.get('header') is False:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# form-decompile v0.23 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# form-decompile v0.24 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||
param(
|
||||
@@ -974,8 +974,11 @@ function Decompile-Element {
|
||||
Add-CommonProps $obj $node $name
|
||||
$tl = Get-Child $node 'TitleLocation'; if ($tl) { $obj['titleLocation'] = $tl.ToLower() }
|
||||
$rep = Get-Child $node 'Representation'; if ($rep) { $obj['representation'] = $rep }
|
||||
if ((Get-Child $node 'ChangeRowSet') -eq 'true') { $obj['changeRowSet'] = $true }
|
||||
if ((Get-Child $node 'ChangeRowOrder') -eq 'true') { $obj['changeRowOrder'] = $true }
|
||||
$crs = Get-Child $node 'ChangeRowSet'; if ($null -ne $crs) { $obj['changeRowSet'] = ($crs -eq 'true') }
|
||||
$cro = Get-Child $node 'ChangeRowOrder'; if ($null -ne $cro) { $obj['changeRowOrder'] = ($cro -eq 'true') }
|
||||
if ((Get-Child $node 'AutoInsertNewRow') -eq 'true') { $obj['autoInsertNewRow'] = $true }
|
||||
if ((Get-Child $node 'EnableDrag') -eq 'true') { $obj['enableDrag'] = $true }
|
||||
if ($node.SelectSingleNode("lf:RowFilter", $ns)) { $obj['rowFilter'] = $null }
|
||||
if ((Get-Child $node 'Header') -eq 'false') { $obj['header'] = $false }
|
||||
if ((Get-Child $node 'Footer') -eq 'true') { $obj['footer'] = $true }
|
||||
$htr = Get-Child $node 'HeightInTableRows'; if ($htr) { $obj['height'] = [int]$htr }
|
||||
|
||||
@@ -315,8 +315,11 @@
|
||||
| `path` | string | DataPath |
|
||||
| `columns` | array | Колонки (элементы input/check/labelField/picField, либо `columnGroup` для группировки) |
|
||||
| `representation` | string | `List`, `Tree`, `HierarchicalList` |
|
||||
| `changeRowSet` | bool | Разрешить добавление/удаление строк |
|
||||
| `changeRowOrder` | bool | Разрешить перемещение строк |
|
||||
| `changeRowSet` | bool | Разрешить добавление/удаление строк (эмитится явное значение, в т.ч. `false`) |
|
||||
| `changeRowOrder` | bool | Разрешить перемещение строк (явное значение) |
|
||||
| `autoInsertNewRow` | bool | Автодобавление новой строки |
|
||||
| `enableDrag` | bool | Разрешить перетаскивание из таблицы |
|
||||
| `rowFilter` | null | Отбор строк (nil-плейсхолдер `<RowFilter xsi:nil="true"/>`); значение всегда `null` |
|
||||
| `height` | int | Высота в строках таблицы |
|
||||
| `header` | bool | Показывать шапку |
|
||||
| `footer` | bool | Показывать подвал |
|
||||
|
||||
Reference in New Issue
Block a user