mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-14 18:04:58 +03:00
feat(form-decompile,form-compile): табличные скаляры ChoiceMode/SelectionMode/RowSelectionMode/Vertical-HorizontalLines + дегейт UseAlternationRowColor/InitialTreeView/RowPictureDataPath/RowsPicture (кластер Table scalars)
Свойства таблицы, терявшиеся на раундтрипе. Часть была захвачена в декомпиляторе под gate динсписка (<UpdateOnDataChange>) → терялась на обычных ValueTable-таблицах. Новые скаляры (захват + эмиссия, все типы таблиц): - choiceMode (компилятор уже эмитил — добавлен захват), selectionMode (SingleRow/…), rowSelectionMode (Row/…), verticalLines/horizontalLines (явное false). Дегейт (вынесены из блока динсписка в общую обработку Table — ловятся на ЛЮБОЙ таблице): - useAlternationRowColor, initialTreeView, rowsPicture — захват/эмиссия без gate. - rowPictureDataPath — инверсия умного дефолта DefaultPicture осталась дин-список-only; обычные таблицы захватывают/эмитят литерал. Зеркало form-compile.py идентично (py==ps1 проверено). Валидация: все 7 целевых — 0 LOST / 0 ADDED; round-trip на ValueTable-формах (АдреснаяКнига и др.); регресс 33/33 ps+py; harness 8448→8368 (на честной метрике после фикса атрибуции), 0 fail. Остаток по таблицам — companion-контент (ExtendedTooltip/AutoCommandBar/ContextMenu) и цвета/шрифты — отдельные кластеры. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# form-compile v1.42 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.43 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[string]$JsonPath,
|
||||
@@ -2342,6 +2342,7 @@ function Emit-Element {
|
||||
"excludedCommands"=1
|
||||
"choiceMode"=1;"initialTreeView"=1;"enableDrag"=1;"enableStartDrag"=1
|
||||
"rowPictureDataPath"=1;"tableAutofill"=1
|
||||
"rowSelectionMode"=1;"verticalLines"=1;"horizontalLines"=1
|
||||
# dynamic-list table block
|
||||
"defaultItem"=1;"useAlternationRowColor"=1;"fileDragMode"=1;"autoRefresh"=1
|
||||
"autoRefreshPeriod"=1;"choiceFoldersAndItems"=1;"restoreCurrentRow"=1;"showRoot"=1
|
||||
@@ -2972,9 +2973,7 @@ function Emit-LabelField {
|
||||
# DSL-ключ переопределяет; декомпилятор инвертирует (опускает значения = дефолту).
|
||||
function Emit-DynListTableBlock {
|
||||
param($el, [string]$indent)
|
||||
# UseAlternationRowColor — специфично для list-таблицы (defaultItem/fileDragMode/
|
||||
# enableStartDrag — общие, эмитятся в Emit-Layout)
|
||||
if ($el.useAlternationRowColor -eq $true) { X "$indent<UseAlternationRowColor>true</UseAlternationRowColor>" }
|
||||
# (useAlternationRowColor — общее свойство таблицы, эмитится в Emit-Table)
|
||||
# Group A (гарант. блок, n=5079): дефолт + override
|
||||
$ar = if ($el.autoRefresh -eq $true) { "true" } else { "false" }
|
||||
X "$indent<AutoRefresh>$ar</AutoRefresh>"
|
||||
@@ -3037,6 +3036,11 @@ function Emit-Table {
|
||||
X "$inner<SearchStringLocation>$($el.searchStringLocation)</SearchStringLocation>"
|
||||
}
|
||||
if ($el.choiceMode -eq $true) { X "$inner<ChoiceMode>true</ChoiceMode>" }
|
||||
if ($el.useAlternationRowColor -eq $true) { X "$inner<UseAlternationRowColor>true</UseAlternationRowColor>" }
|
||||
if ($el.selectionMode) { X "$inner<SelectionMode>$($el.selectionMode)</SelectionMode>" }
|
||||
if ($el.rowSelectionMode) { X "$inner<RowSelectionMode>$($el.rowSelectionMode)</RowSelectionMode>" }
|
||||
if ($el.verticalLines -eq $false) { X "$inner<VerticalLines>false</VerticalLines>" }
|
||||
if ($el.horizontalLines -eq $false) { X "$inner<HorizontalLines>false</HorizontalLines>" }
|
||||
if ($el.initialTreeView) { X "$inner<InitialTreeView>$($el.initialTreeView)</InitialTreeView>" }
|
||||
if ($el.enableDrag -eq $true) { X "$inner<EnableDrag>true</EnableDrag>" }
|
||||
if ($el.rowPictureDataPath) { X "$inner<RowPictureDataPath>$($el.rowPictureDataPath)</RowPictureDataPath>" }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# form-compile v1.42 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.43 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import copy
|
||||
@@ -1783,6 +1783,7 @@ KNOWN_KEYS = {
|
||||
"src", "valuesPicture", "loadTransparent",
|
||||
"autofill",
|
||||
"choiceMode", "initialTreeView", "enableDrag", "enableStartDrag",
|
||||
"rowSelectionMode", "verticalLines", "horizontalLines",
|
||||
"rowPictureDataPath", "tableAutofill",
|
||||
# dynamic-list table block
|
||||
"defaultItem", "useAlternationRowColor", "fileDragMode", "autoRefresh",
|
||||
@@ -2671,10 +2672,7 @@ def emit_label_field(lines, el, name, eid, indent):
|
||||
|
||||
# Блок свойств таблицы, привязанной к динамическому списку (Group A defaults + B/C).
|
||||
def emit_dynlist_table_block(lines, el, indent):
|
||||
# UseAlternationRowColor — специфично для list-таблицы (defaultItem/fileDragMode/
|
||||
# enableStartDrag — общие, эмитятся в emit_layout)
|
||||
if el.get('useAlternationRowColor') is True:
|
||||
lines.append(f'{indent}<UseAlternationRowColor>true</UseAlternationRowColor>')
|
||||
# (useAlternationRowColor — общее свойство таблицы, эмитится в emit_table)
|
||||
# Group A (гарант. блок): дефолт + override
|
||||
ar = 'true' if el.get('autoRefresh') is True else 'false'
|
||||
lines.append(f'{indent}<AutoRefresh>{ar}</AutoRefresh>')
|
||||
@@ -2740,6 +2738,16 @@ def emit_table(lines, el, name, eid, indent):
|
||||
|
||||
if el.get('choiceMode') is True:
|
||||
lines.append(f'{inner}<ChoiceMode>true</ChoiceMode>')
|
||||
if el.get('useAlternationRowColor') is True:
|
||||
lines.append(f'{inner}<UseAlternationRowColor>true</UseAlternationRowColor>')
|
||||
if el.get('selectionMode'):
|
||||
lines.append(f'{inner}<SelectionMode>{el["selectionMode"]}</SelectionMode>')
|
||||
if el.get('rowSelectionMode'):
|
||||
lines.append(f'{inner}<RowSelectionMode>{el["rowSelectionMode"]}</RowSelectionMode>')
|
||||
if el.get('verticalLines') is False:
|
||||
lines.append(f'{inner}<VerticalLines>false</VerticalLines>')
|
||||
if el.get('horizontalLines') is False:
|
||||
lines.append(f'{inner}<HorizontalLines>false</HorizontalLines>')
|
||||
if el.get('initialTreeView'):
|
||||
lines.append(f'{inner}<InitialTreeView>{el["initialTreeView"]}</InitialTreeView>')
|
||||
if el.get('enableDrag') is True:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# form-decompile v0.24 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# form-decompile v0.25 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||
param(
|
||||
@@ -986,10 +986,18 @@ function Decompile-Element {
|
||||
$ssl = Get-Child $node 'SearchStringLocation'; if ($ssl) { $obj['searchStringLocation'] = $ssl }
|
||||
$vsl = Get-Child $node 'ViewStatusLocation'; if ($vsl) { $obj['viewStatusLocation'] = $vsl }
|
||||
$scl = Get-Child $node 'SearchControlLocation'; if ($scl) { $obj['searchControlLocation'] = $scl }
|
||||
# --- Блок свойств дин-список-таблицы (признак: дочерний <UpdateOnDataChange>) ---
|
||||
# --- Общие свойства таблицы (любой тип таблицы, не только динсписок) ---
|
||||
if ((Get-Child $node 'ChoiceMode') -eq 'true') { $obj['choiceMode'] = $true }
|
||||
$selm = Get-Child $node 'SelectionMode'; if ($selm) { $obj['selectionMode'] = $selm }
|
||||
$rsm = Get-Child $node 'RowSelectionMode'; if ($rsm) { $obj['rowSelectionMode'] = $rsm }
|
||||
if ((Get-Child $node 'VerticalLines') -eq 'false') { $obj['verticalLines'] = $false }
|
||||
if ((Get-Child $node 'HorizontalLines') -eq 'false') { $obj['horizontalLines'] = $false }
|
||||
if ((Get-Child $node 'UseAlternationRowColor') -eq 'true') { $obj['useAlternationRowColor'] = $true }
|
||||
$itv = Get-Child $node 'InitialTreeView'; if ($itv) { $obj['initialTreeView'] = $itv }
|
||||
$rpRef = $node.SelectSingleNode("lf:RowsPicture/xr:Ref", $ns); if ($rpRef) { $obj['rowsPicture'] = $rpRef.InnerText }
|
||||
$rpdp = Get-Child $node 'RowPictureDataPath'
|
||||
# --- Блок дин-список-таблицы (признак: дочерний <UpdateOnDataChange>) ---
|
||||
if (Has-Child $node 'UpdateOnDataChange') {
|
||||
$listName = Get-Child $node 'DataPath'
|
||||
# Group A (инверсия дефолтов)
|
||||
if ((Get-Child $node 'AutoRefresh') -eq 'true') { $obj['autoRefresh'] = $true }
|
||||
$arp = Get-Child $node 'AutoRefreshPeriod'; if ($arp -and $arp -ne '60') { $obj['autoRefreshPeriod'] = [int]$arp }
|
||||
$cfi = Get-Child $node 'ChoiceFoldersAndItems'; if ($cfi -and $cfi -ne 'Items') { $obj['choiceFoldersAndItems'] = $cfi }
|
||||
@@ -998,17 +1006,11 @@ function Decompile-Element {
|
||||
if ((Get-Child $node 'AllowRootChoice') -eq 'true') { $obj['allowRootChoice'] = $true }
|
||||
$uodc = Get-Child $node 'UpdateOnDataChange'; if ($uodc -and $uodc -ne 'Auto') { $obj['updateOnDataChange'] = $uodc }
|
||||
if ((Get-Child $node 'AllowGettingCurrentRowURL') -eq 'false') { $obj['allowGettingCurrentRowURL'] = $false }
|
||||
# list-таблица: useAlternationRowColor/initialTreeView (defaultItem/enableStartDrag/
|
||||
# fileDragMode — общие, ловятся в Add-Layout)
|
||||
if ((Get-Child $node 'UseAlternationRowColor') -eq 'true') { $obj['useAlternationRowColor'] = $true }
|
||||
$itv = Get-Child $node 'InitialTreeView'; if ($itv) { $obj['initialTreeView'] = $itv }
|
||||
# Group C
|
||||
$rpdp = Get-Child $node 'RowPictureDataPath'
|
||||
# RowPictureDataPath: инверсия умного дефолта <Список>.DefaultPicture
|
||||
if ($null -eq $rpdp) { $obj['rowPictureDataPath'] = '' }
|
||||
elseif ($rpdp -ne "$listName.DefaultPicture") { $obj['rowPictureDataPath'] = $rpdp }
|
||||
$rpRef = $node.SelectSingleNode("lf:RowsPicture/xr:Ref", $ns); if ($rpRef) { $obj['rowsPicture'] = $rpRef.InnerText }
|
||||
elseif ($rpdp -ne "$($obj['path']).DefaultPicture") { $obj['rowPictureDataPath'] = $rpdp }
|
||||
$usg = Get-Child $node 'UserSettingsGroup'; if ($usg) { $obj['userSettingsGroup'] = $usg }
|
||||
}
|
||||
} elseif ($rpdp) { $obj['rowPictureDataPath'] = $rpdp }
|
||||
$csNode = $node.SelectSingleNode("lf:CommandSet", $ns)
|
||||
if ($csNode) {
|
||||
$exc = New-Object System.Collections.ArrayList
|
||||
|
||||
@@ -320,6 +320,13 @@
|
||||
| `autoInsertNewRow` | bool | Автодобавление новой строки |
|
||||
| `enableDrag` | bool | Разрешить перетаскивание из таблицы |
|
||||
| `rowFilter` | null | Отбор строк (nil-плейсхолдер `<RowFilter xsi:nil="true"/>`); значение всегда `null` |
|
||||
| `choiceMode` | bool | Режим выбора |
|
||||
| `useAlternationRowColor` | bool | Чередование цвета строк |
|
||||
| `selectionMode` | string | Режим выделения (`SingleRow`, …) |
|
||||
| `rowSelectionMode` | string | Режим выделения строки (`Row`, …) |
|
||||
| `verticalLines` / `horizontalLines` | bool | Линии сетки (эмитится явное `false`) |
|
||||
| `initialTreeView` | string | `ExpandTopLevel`, `ExpandAllLevels`, `NoExpand` |
|
||||
| `rowsPicture` | string | Картинка строк (`CommonPicture.X`) |
|
||||
| `height` | int | Высота в строках таблицы |
|
||||
| `header` | bool | Показывать шапку |
|
||||
| `footer` | bool | Показывать подвал |
|
||||
@@ -336,8 +343,6 @@
|
||||
| Свойство | Тип | Умолчание | Описание |
|
||||
|----------|-----|-----------|----------|
|
||||
| `rowPictureDataPath` | string | `<Список>.DefaultPicture` (если есть осн. таблица) | Путь к картинке строки. `""` — подавить авто-вывод |
|
||||
| `useAlternationRowColor` | bool | — | Чередование цвета строк |
|
||||
| `initialTreeView` | string | — | `ExpandTopLevel`, `ExpandAllLevels`, `NoExpand` |
|
||||
| `autoRefresh` | bool | `false` | Автообновление |
|
||||
| `autoRefreshPeriod` | int | `60` | Период автообновления, сек |
|
||||
| `choiceFoldersAndItems` | string | `Items` | `Items`, `Folders`, `FoldersAndItems` |
|
||||
|
||||
Reference in New Issue
Block a user