fix(skd-compile): short form <dcsset:item> для StructureItemGroup внутри row/column

Анализ корпуса ERP (671 отчёт): items внутри dcsset:row/column/points/series
ВСЕГДА используют короткую форму <dcsset:item> без xsi:type (531 случай,
0 explicit). В остальных контекстах — explicit <dcsset:item xsi:type="dcsset:StructureItemGroup">.

Emit-StructureItem получил switch -shortGroup, который Emit-TableAxisBlock
передаёт для nested children. Флаг наследуется recursive в детей через
Emit-StructureItem рекурсию.

Снапшоты регенерированы.

sample30: −166 строк (1192 → 1026).
This commit is contained in:
Nick Shirokov
2026-05-23 21:46:27 +03:00
parent 21ae9a6d80
commit 53536b72f5
2 changed files with 32 additions and 14 deletions
@@ -1,4 +1,4 @@
# skd-compile v1.82 — Compile 1C DCS from JSON # skd-compile v1.83 — Compile 1C DCS from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param( param(
[string]$DefinitionFile, [string]$DefinitionFile,
@@ -2811,10 +2811,11 @@ function Emit-TableAxisBlock {
if ($block.outputParameters) { if ($block.outputParameters) {
Emit-OutputParameters -params $block.outputParameters -indent $indent Emit-OutputParameters -params $block.outputParameters -indent $indent
} }
# nested children (StructureItemGroup внутри table row/column или chart axis) # nested children (StructureItemGroup внутри table row/column или chart axis).
# Platform-pattern: items внутри row/column/points/series — ВСЕГДА short form (без xsi:type).
if ($block.children) { if ($block.children) {
foreach ($child in $block.children) { foreach ($child in $block.children) {
Emit-StructureItem -item $child -indent $indent Emit-StructureItem -item $child -indent $indent -shortGroup
} }
} }
if ($block.viewMode) { if ($block.viewMode) {
@@ -2833,12 +2834,18 @@ function Emit-TableAxisBlock {
} }
function Emit-StructureItem { function Emit-StructureItem {
param($item, [string]$indent) param($item, [string]$indent, [switch]$shortGroup)
$type = if ($item.type) { "$($item.type)" } else { "group" } $type = if ($item.type) { "$($item.type)" } else { "group" }
if ($type -eq "group") { if ($type -eq "group") {
X "$indent<dcsset:item xsi:type=`"dcsset:StructureItemGroup`">" # Platform пишет короткую форму (без xsi:type) для groups внутри table row/column,
# explicit StructureItemGroup в остальных случаях.
if ($shortGroup) {
X "$indent<dcsset:item>"
} else {
X "$indent<dcsset:item xsi:type=`"dcsset:StructureItemGroup`">"
}
# use=false — отключённая ветка структуры # use=false — отключённая ветка структуры
if ($item.use -eq $false) { if ($item.use -eq $false) {
@@ -2870,10 +2877,15 @@ function Emit-StructureItem {
Emit-OutputParameters -params $item.outputParameters -indent "$indent`t" Emit-OutputParameters -params $item.outputParameters -indent "$indent`t"
} }
# Nested children # Nested children — наследуем shortGroup от родителя (если родитель в short form,
# то и дети остаются short, как делает platform внутри row/column).
if ($item.children) { if ($item.children) {
foreach ($child in $item.children) { foreach ($child in $item.children) {
Emit-StructureItem -item $child -indent "$indent`t" if ($shortGroup) {
Emit-StructureItem -item $child -indent "$indent`t" -shortGroup
} else {
Emit-StructureItem -item $child -indent "$indent`t"
}
} }
} }
@@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# skd-compile v1.82 — Compile 1C DCS from JSON # skd-compile v1.83 — Compile 1C DCS from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse import argparse
import json import json
@@ -2268,10 +2268,11 @@ def emit_table_axis_block(lines, block, indent, emit_name=True):
emit_conditional_appearance(lines, block['conditionalAppearance'], indent) emit_conditional_appearance(lines, block['conditionalAppearance'], indent)
if block.get('outputParameters'): if block.get('outputParameters'):
emit_output_parameters(lines, block['outputParameters'], indent) emit_output_parameters(lines, block['outputParameters'], indent)
# nested children (StructureItemGroup внутри table row/column или chart axis) # nested children (StructureItemGroup внутри table row/column или chart axis).
# Platform-pattern: items внутри row/column/points/series — ВСЕГДА short form (без xsi:type).
if block.get('children'): if block.get('children'):
for child in block['children']: for child in block['children']:
emit_structure_item(lines, child, indent) emit_structure_item(lines, child, indent, short_group=True)
if block.get('viewMode'): if block.get('viewMode'):
lines.append(f'{indent}<dcsset:viewMode>{esc_xml(str(block["viewMode"]))}</dcsset:viewMode>') lines.append(f'{indent}<dcsset:viewMode>{esc_xml(str(block["viewMode"]))}</dcsset:viewMode>')
if block.get('userSettingID'): if block.get('userSettingID'):
@@ -2283,11 +2284,16 @@ def emit_table_axis_block(lines, block, indent, emit_name=True):
lines.append(f'{indent}<dcsset:itemsViewMode>{esc_xml(str(block["itemsViewMode"]))}</dcsset:itemsViewMode>') lines.append(f'{indent}<dcsset:itemsViewMode>{esc_xml(str(block["itemsViewMode"]))}</dcsset:itemsViewMode>')
def emit_structure_item(lines, item, indent): def emit_structure_item(lines, item, indent, short_group=False):
item_type = str(item.get('type', 'group')) item_type = str(item.get('type', 'group'))
if item_type == 'group': if item_type == 'group':
lines.append(f'{indent}<dcsset:item xsi:type="dcsset:StructureItemGroup">') # Platform пишет короткую форму (без xsi:type) для groups внутри table row/column,
# explicit StructureItemGroup в остальных случаях.
if short_group:
lines.append(f'{indent}<dcsset:item>')
else:
lines.append(f'{indent}<dcsset:item xsi:type="dcsset:StructureItemGroup">')
if item.get('use') is False: if item.get('use') is False:
lines.append(f'{indent}\t<dcsset:use>false</dcsset:use>') lines.append(f'{indent}\t<dcsset:use>false</dcsset:use>')
@@ -2311,10 +2317,10 @@ def emit_structure_item(lines, item, indent):
if item.get('outputParameters'): if item.get('outputParameters'):
emit_output_parameters(lines, item['outputParameters'], f'{indent}\t') emit_output_parameters(lines, item['outputParameters'], f'{indent}\t')
# Nested children # Nested children — наследуем short_group от родителя.
if item.get('children'): if item.get('children'):
for child in item['children']: for child in item['children']:
emit_structure_item(lines, child, f'{indent}\t') emit_structure_item(lines, child, f'{indent}\t', short_group=short_group)
# viewMode/itemsViewMode/userSettingID/userSettingPresentation — context-dependent # viewMode/itemsViewMode/userSettingID/userSettingPresentation — context-dependent
if item.get('viewMode'): if item.get('viewMode'):