From b892379202325215c97e11d21c31a0f7da1b636b Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Thu, 23 Jul 2026 13:05:22 +0300 Subject: [PATCH] =?UTF-8?q?fix(skd-compile):=20=D0=B0=D0=B2=D1=82=D0=BE-Au?= =?UTF-8?q?to=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=81=D0=B5=D0=B9=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B,=20=D0=B4=D0=B8=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=20=D0=B8=20=D0=BE=D0=B1=D1=8A?= =?UTF-8?q?=D0=B5=D0=BA=D1=82=D0=BD=D1=8B=D1=85=20=D0=B3=D1=80=D1=83=D0=BF?= =?UTF-8?q?=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Оси таблицы (columns/rows), точки/серии диаграмм и объектные группировки без явного selection получали пустой пивот молча — ресурсы не попадали в ячейки пересечения. Теперь при отсутствии ключа selection/order эмитится SelectedItemAuto/OrderItemAuto (как строковый shorthand и как ручное добавление оси в Конфигураторе). Пустой [] уважается как «явно ничего». skd-decompile теперь эмитит [] для отсутствующих selection/order на осях, группах и диаграммах — decompile→compile round-trip остаётся бит-в-бит (иначе compile впаял бы Auto на боевых узлах без выбора, напр. ветках use=false). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../skd-compile/scripts/skd-compile.ps1 | 40 +++--- .../skills/skd-compile/scripts/skd-compile.py | 31 +++-- .../skd-decompile/scripts/skd-decompile.ps1 | 36 +++-- .../skd-decompile/scripts/skd-decompile.py | 37 +++--- docs/skd-dsl-spec.md | 4 +- .../available-values-and-folders/Template.xml | 3 + .../snapshots/structure-chart/Template.xml | 99 ++++++++++++++ .../structure-object-form/Template.xml | 6 + .../Template.xml | 67 ++++++++++ .../structure-table-pivot/Template.xml | 123 ++++++++++++++++++ .../cases/skd-compile/structure-chart.json | 32 +++++ .../structure-object-group-no-selection.json | 27 ++++ .../skd-compile/structure-table-pivot.json | 38 ++++++ .../table-axis-no-selection/Template.xml | 81 ++++++++++++ .../structure-nested-and-folder/Template.xml | 6 + .../decompiled.json | 2 +- .../table-axis-no-selection/Template.xml | 81 ++++++++++++ .../table-axis-no-selection/decompiled.json | 4 + .../table-axis-no-selection.json | 6 + 19 files changed, 657 insertions(+), 66 deletions(-) create mode 100644 tests/skills/cases/skd-compile/snapshots/structure-chart/Template.xml create mode 100644 tests/skills/cases/skd-compile/snapshots/structure-object-group-no-selection/Template.xml create mode 100644 tests/skills/cases/skd-compile/snapshots/structure-table-pivot/Template.xml create mode 100644 tests/skills/cases/skd-compile/structure-chart.json create mode 100644 tests/skills/cases/skd-compile/structure-object-group-no-selection.json create mode 100644 tests/skills/cases/skd-compile/structure-table-pivot.json create mode 100644 tests/skills/cases/skd-decompile/fixtures/table-axis-no-selection/Template.xml create mode 100644 tests/skills/cases/skd-decompile/snapshots/table-axis-no-selection/Template.xml create mode 100644 tests/skills/cases/skd-decompile/snapshots/table-axis-no-selection/decompiled.json create mode 100644 tests/skills/cases/skd-decompile/table-axis-no-selection.json diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index c613e42e..ebb12f6e 100644 --- a/.claude/skills/skd-compile/scripts/skd-compile.ps1 +++ b/.claude/skills/skd-compile/scripts/skd-compile.ps1 @@ -1,4 +1,4 @@ -# skd-compile v1.108 — Compile 1C DCS from JSON +# skd-compile v1.109 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -3202,12 +3202,15 @@ function Emit-TableAxisBlock { if ($block.filter) { Emit-Filter -items $block.filter -indent $indent } - if ($block.order) { - Emit-Order -items $block.order -indent $indent - } - if ($block.selection) { - Emit-Selection -items $block.selection -indent $indent - } + # Платформа на осях (column/row/point/series) всегда пишет order+selection; при отсутствии + # ключа кладёт Auto (как ручное добавление оси в конфигураторе). Ключ присутствует (в т.ч. + # пустой [] ) — уважаем как задано. + $hasOrderKey = $block.PSObject.Properties.Match('order').Count -gt 0 + $orderItems = if ($hasOrderKey) { $block.order } else { @('Auto') } + Emit-Order -items $orderItems -indent $indent + $hasSelKey = $block.PSObject.Properties.Match('selection').Count -gt 0 + $selItems = if ($hasSelKey) { $block.selection } else { @('Auto') } + Emit-Selection -items $selItems -indent $indent if ($block.conditionalAppearance) { Emit-ConditionalAppearance -items $block.conditionalAppearance -indent $indent } @@ -3262,13 +3265,15 @@ function Emit-StructureItem { $gb = if ($item.groupBy) { $item.groupBy } else { $item.groupFields } Emit-GroupItems -groupBy $gb -indent "$indent`t" - # Emit order/selection only if specified — platform doesn't always emit them on group - if ($item.order) { - Emit-Order -items $item.order -indent "$indent`t" -blockViewMode $item.orderViewMode -blockUserSettingID $item.orderUserSettingID - } - if ($item.selection) { - Emit-Selection -items $item.selection -indent "$indent`t" - } + # Платформа на группировке (плоской и вложенной в ось, short/explicit) всегда пишет + # order+selection; при отсутствии ключа кладёт Auto. Ключ присутствует (в т.ч. пустой []) + # — уважаем как задано (blockViewMode/userSettingID имеют смысл только при явном order). + $hasGrpOrderKey = $item.PSObject.Properties.Match('order').Count -gt 0 + $grpOrderItems = if ($hasGrpOrderKey) { $item.order } else { @('Auto') } + Emit-Order -items $grpOrderItems -indent "$indent`t" -blockViewMode $item.orderViewMode -blockUserSettingID $item.orderUserSettingID + $hasGrpSelKey = $item.PSObject.Properties.Match('selection').Count -gt 0 + $grpSelItems = if ($hasGrpSelKey) { $item.selection } else { @('Auto') } + Emit-Selection -items $grpSelItems -indent "$indent`t" Emit-Filter -items $item.filter -indent "$indent`t" @@ -3422,8 +3427,11 @@ function Emit-StructureItem { } } - # Selection (chart values) - Emit-Selection -items $item.selection -indent "$indent`t" + # Selection (chart values) — платформа всегда пишет chart-level selection; при отсутствии + # ключа кладёт Auto. + $hasChartSelKey = $item.PSObject.Properties.Match('selection').Count -gt 0 + $chartSelItems = if ($hasChartSelKey) { $item.selection } else { @('Auto') } + Emit-Selection -items $chartSelItems -indent "$indent`t" if ($item.outputParameters) { Emit-OutputParameters -params $item.outputParameters -indent "$indent`t" diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index bc85253c..39f73019 100644 --- a/.claude/skills/skd-compile/scripts/skd-compile.py +++ b/.claude/skills/skd-compile/scripts/skd-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# skd-compile v1.108 — Compile 1C DCS from JSON +# skd-compile v1.109 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -2631,10 +2631,13 @@ def emit_table_axis_block(lines, block, indent, emit_name=True): emit_group_items(lines, gb, indent) if block.get('filter'): emit_filter(lines, block['filter'], indent) - if block.get('order'): - emit_order(lines, block['order'], indent) - if block.get('selection'): - emit_selection(lines, block['selection'], indent) + # Платформа на осях (column/row/point/series) всегда пишет order+selection; при отсутствии + # ключа кладёт Auto (как ручное добавление оси в конфигураторе). Ключ присутствует (в т.ч. + # пустой [] ) — уважаем как задано. + order_items = block['order'] if 'order' in block else ['Auto'] + emit_order(lines, order_items, indent) + sel_items = block['selection'] if 'selection' in block else ['Auto'] + emit_selection(lines, sel_items, indent) if block.get('conditionalAppearance'): emit_conditional_appearance(lines, block['conditionalAppearance'], indent) if block.get('outputParameters'): @@ -2674,11 +2677,13 @@ def emit_structure_item(lines, item, indent, short_group=False): emit_group_items(lines, item.get('groupBy') or item.get('groupFields'), f'{indent}\t') - # Emit order/selection only if specified — platform doesn't always emit them on group - if item.get('order'): - emit_order(lines, item['order'], f'{indent}\t', block_view_mode=item.get('orderViewMode'), block_user_setting_id=item.get('orderUserSettingID')) - if item.get('selection'): - emit_selection(lines, item['selection'], f'{indent}\t') + # Платформа на группировке (плоской и вложенной в ось, short/explicit) всегда пишет + # order+selection; при отсутствии ключа кладёт Auto. Ключ присутствует (в т.ч. пустой []) + # — уважаем как задано (blockViewMode/userSettingID имеют смысл только при явном order). + grp_order_items = item['order'] if 'order' in item else ['Auto'] + emit_order(lines, grp_order_items, f'{indent}\t', block_view_mode=item.get('orderViewMode'), block_user_setting_id=item.get('orderUserSettingID')) + grp_sel_items = item['selection'] if 'selection' in item else ['Auto'] + emit_selection(lines, grp_sel_items, f'{indent}\t') emit_filter(lines, item.get('filter'), f'{indent}\t') @@ -2783,8 +2788,10 @@ def emit_structure_item(lines, item, indent, short_group=False): emit_table_axis_block(lines, sb, f'{indent}\t\t') lines.append(f'{indent}\t') - # Selection (chart values) - emit_selection(lines, item.get('selection'), f'{indent}\t') + # Selection (chart values) — платформа всегда пишет chart-level selection; при отсутствии + # ключа кладёт Auto. + chart_sel_items = item['selection'] if 'selection' in item else ['Auto'] + emit_selection(lines, chart_sel_items, f'{indent}\t') if item.get('outputParameters'): emit_output_parameters(lines, item['outputParameters'], f'{indent}\t') diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index 96e276a0..74b95ab5 100644 --- a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 +++ b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 @@ -1,4 +1,4 @@ -# skd-decompile v0.90 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.91 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -2223,18 +2223,20 @@ function Build-TableAxisBlock { foreach ($fc in $fNode.SelectNodes("dcsset:item", $ns)) { $fa += (Build-FilterItem -itemNode $fc -loc "$loc/filter") } $entry['filter'] = $fa } - # order — preserve presence (even [Auto]) for bit-perfect round-trip + # order/selection — всегда явные (принцип «декомпилятор всегда явный»): [Auto] сохраняем как есть, + # отсутствие/пустоту эмитим как [] — иначе compile впаяет дефолтный Auto (round-trip рвётся на + # осях без выбора, напр. ветки use=false). [] на входе compile → эмитит ничего = «нет выбора». + # NB: прямое присваивание @() (не через if-выражение — там пустой массив схлопнется в $null). $ordNode = $node.SelectSingleNode("dcsset:order", $ns) if ($ordNode) { $ordItems = Build-Order -ordNode $ordNode -loc "$loc/order" - if ($ordItems.Count -gt 0) { $entry['order'] = $ordItems } - } - # selection — preserve presence (even [Auto]) + if ($ordItems.Count -gt 0) { $entry['order'] = $ordItems } else { $entry['order'] = @() } + } else { $entry['order'] = @() } $selNode = $node.SelectSingleNode("dcsset:selection", $ns) if ($selNode) { $selItems = Build-Selection -selNode $selNode -loc "$loc/selection" - if ($selItems.Count -gt 0) { $entry['selection'] = $selItems } - } + if ($selItems.Count -gt 0) { $entry['selection'] = $selItems } else { $entry['selection'] = @() } + } else { $entry['selection'] = @() } # conditionalAppearance block $caN = $node.SelectSingleNode("dcsset:conditionalAppearance", $ns) if ($caN) { @@ -2381,11 +2383,13 @@ function Build-Structure { $entry['series'] = $sArr } # Selection (chart values) — сохраняем даже [Auto] для bit-perfect presence + # chart-level selection — всегда явно ([] при отсутствии/пустоте, иначе compile впаяет Auto). + # NB: прямое присваивание @() (не через if-выражение — пустой массив там схлопнется в $null). $selN = $it.SelectSingleNode("dcsset:selection", $ns) if ($selN) { $selI = Build-Selection -selNode $selN -loc "$loc/$idx/selection" - if ($selI.Count -gt 0) { $entry['selection'] = $selI } - } + if ($selI.Count -gt 0) { $entry['selection'] = $selI } else { $entry['selection'] = @() } + } else { $entry['selection'] = @() } $opN = $it.SelectSingleNode("dcsset:outputParameters", $ns) $op = Build-OutputParameters -opNode $opN if ($op -and $op.Count -gt 0) { $entry['outputParameters'] = $op } @@ -2427,17 +2431,21 @@ function Build-Structure { $gFields = Get-GroupFields -parentNode $it -loc $loc if ($gFields.Count -gt 0) { $entry['groupFields'] = $gFields } - # Local selection — preserve presence (even [Auto]) for bit-perfect round-trip + # Local selection/order — всегда явные: [Auto] как есть, отсутствие/пустоту как [] (иначе compile + # впаяет дефолтный Auto → round-trip рвётся на группах без выбора, напр. ветки use=false). + # [] не Auto-only → Try-StructureShorthand не свернёт такую группу в shorthand (и не добавит Auto). + # NB: прямое присваивание @() (не через if-выражение — пустой массив там схлопнется в $null). $selNode = $it.SelectSingleNode("dcsset:selection", $ns) if ($selNode) { $selItems = Build-Selection -selNode $selNode -loc "$loc/selection" - if ($selItems.Count -gt 0) { $entry['selection'] = $selItems } - } - # Local order — same + if ($selItems.Count -gt 0) { $entry['selection'] = $selItems } else { $entry['selection'] = @() } + } else { $entry['selection'] = @() } $ordNode = $it.SelectSingleNode("dcsset:order", $ns) if ($ordNode) { $ordItems = Build-Order -ordNode $ordNode -loc "$loc/order" - if ($ordItems.Count -gt 0) { $entry['order'] = $ordItems } + if ($ordItems.Count -gt 0) { $entry['order'] = $ordItems } else { $entry['order'] = @() } + } else { $entry['order'] = @() } + if ($ordNode) { # Block-level viewMode/userSettingID на foreach ($ch in $ordNode.ChildNodes) { if ($ch.NodeType -ne 'Element' -or $ch.NamespaceURI -ne 'http://v8.1c.ru/8.1/data-composition-system/settings') { continue } diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.py b/.claude/skills/skd-decompile/scripts/skd-decompile.py index a88dc660..4b32fc35 100644 --- a/.claude/skills/skd-decompile/scripts/skd-decompile.py +++ b/.claude/skills/skd-decompile/scripts/skd-decompile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# skd-decompile v0.90 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.91 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -2327,16 +2327,14 @@ def build_table_axis_block(node, loc, include_name=False): for fc in f_node.select_nodes("dcsset:item"): fa.append(build_filter_item(fc, "%s/filter" % loc)) entry['filter'] = fa + # order/selection — всегда явные ([Auto] как есть, отсутствие/пустоту как []): иначе compile + # впаяет дефолтный Auto → round-trip рвётся на осях без выбора (напр. ветки use=false). ord_node = node.select_single_node("dcsset:order") - if ord_node: - ord_items = build_order(ord_node, "%s/order" % loc) - if len(ord_items) > 0: - entry['order'] = ord_items + ord_items = build_order(ord_node, "%s/order" % loc) if ord_node else [] + entry['order'] = ord_items if len(ord_items) > 0 else [] sel_node = node.select_single_node("dcsset:selection") - if sel_node: - sel_items = build_selection(sel_node, "%s/selection" % loc) - if len(sel_items) > 0: - entry['selection'] = sel_items + sel_items = build_selection(sel_node, "%s/selection" % loc) if sel_node else [] + entry['selection'] = sel_items if len(sel_items) > 0 else [] ca_n = node.select_single_node("dcsset:conditionalAppearance") if ca_n: ca = build_conditional_appearance(ca_n, "%s/ca" % loc) @@ -2485,11 +2483,10 @@ def build_structure(node, loc): s_arr.append(build_table_axis_block(s, "%s/%d/series[%d]" % (loc, idx, si))) si += 1 entry['series'] = s_arr + # chart-level selection — всегда явно ([] при отсутствии/пустоте, иначе compile впаяет Auto) sel_n = it.select_single_node("dcsset:selection") - if sel_n: - sel_i = build_selection(sel_n, "%s/%d/selection" % (loc, idx)) - if len(sel_i) > 0: - entry['selection'] = sel_i + sel_i = build_selection(sel_n, "%s/%d/selection" % (loc, idx)) if sel_n else [] + entry['selection'] = sel_i if len(sel_i) > 0 else [] op_n = it.select_single_node("dcsset:outputParameters") op = build_output_parameters(op_n) if op and len(op) > 0: @@ -2532,16 +2529,16 @@ def build_structure(node, loc): if len(g_fields) > 0: entry['groupFields'] = g_fields + # Local selection/order — всегда явные ([Auto] как есть, отсутствие/пустоту как []): иначе + # compile впаяет дефолтный Auto → round-trip рвётся на группах без выбора (напр. use=false). + # [] не Auto-only → try_structure_shorthand не свернёт такую группу в shorthand (без Auto). sel_node = it.select_single_node("dcsset:selection") - if sel_node: - sel_items = build_selection(sel_node, "%s/selection" % loc) - if len(sel_items) > 0: - entry['selection'] = sel_items + sel_items = build_selection(sel_node, "%s/selection" % loc) if sel_node else [] + entry['selection'] = sel_items if len(sel_items) > 0 else [] ord_node = it.select_single_node("dcsset:order") + ord_items = build_order(ord_node, "%s/order" % loc) if ord_node else [] + entry['order'] = ord_items if len(ord_items) > 0 else [] if ord_node: - ord_items = build_order(ord_node, "%s/order" % loc) - if len(ord_items) > 0: - entry['order'] = ord_items for ch in ord_node.child_nodes: if ch.namespace_uri != NS_SET: continue diff --git a/docs/skd-dsl-spec.md b/docs/skd-dsl-spec.md index eb753be8..32bfa1a9 100644 --- a/docs/skd-dsl-spec.md +++ b/docs/skd-dsl-spec.md @@ -921,15 +921,13 @@ Platform-pattern: `startDate`/`endDate`/`date` эмитятся ТОЛЬКО д "type": "table", "name": "Таблица", "rows": [ - { "groupBy": ["Номенклатура"], "selection": ["Auto"], "order": ["Auto"] } + { "groupBy": ["Номенклатура"] } ], "columns": [ { "name": "Период", "groupBy": ["Период"], "filter": ["Сумма > 0"], - "selection": ["Auto"], - "order": ["Auto"], "outputParameters": { "РасположениеИтогов": "None" }, "userSettingID": "auto", "userSettingPresentation": { "ru": "Колонка с периодом" } diff --git a/tests/skills/cases/skd-compile/snapshots/available-values-and-folders/Template.xml b/tests/skills/cases/skd-compile/snapshots/available-values-and-folders/Template.xml index c3dec644..5fbe7363 100644 --- a/tests/skills/cases/skd-compile/snapshots/available-values-and-folders/Template.xml +++ b/tests/skills/cases/skd-compile/snapshots/available-values-and-folders/Template.xml @@ -176,6 +176,9 @@ 0001-01-01T00:00:00 + + + diff --git a/tests/skills/cases/skd-compile/snapshots/structure-chart/Template.xml b/tests/skills/cases/skd-compile/snapshots/structure-chart/Template.xml new file mode 100644 index 00000000..d10b5d52 --- /dev/null +++ b/tests/skills/cases/skd-compile/snapshots/structure-chart/Template.xml @@ -0,0 +1,99 @@ + + + + ИсточникДанных1 + Local + + + Основной + + Период + Период + + xs:dateTime + + Date + + + + + Номенклатура + Номенклатура + + true + + + d5p1:CatalogRef.Номенклатура + + + + Сумма + Сумма + + xs:decimal + + 15 + 2 + Any + + + + ИсточникДанных1 + ВЫБРАТЬ Т.Период, Т.Номенклатура, Т.Сумма ИЗ Регистр КАК Т + + + Основной + + + ru + Основной + + + + + + Сумма + + + + + + + Период + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + Номенклатура + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + + + + diff --git a/tests/skills/cases/skd-compile/snapshots/structure-object-form/Template.xml b/tests/skills/cases/skd-compile/snapshots/structure-object-form/Template.xml index c43f3611..eff26c7e 100644 --- a/tests/skills/cases/skd-compile/snapshots/structure-object-form/Template.xml +++ b/tests/skills/cases/skd-compile/snapshots/structure-object-form/Template.xml @@ -61,6 +61,9 @@ 0001-01-01T00:00:00 + + + Организация @@ -79,6 +82,9 @@ 0001-01-01T00:00:00 + + + Номенклатура diff --git a/tests/skills/cases/skd-compile/snapshots/structure-object-group-no-selection/Template.xml b/tests/skills/cases/skd-compile/snapshots/structure-object-group-no-selection/Template.xml new file mode 100644 index 00000000..c5c266eb --- /dev/null +++ b/tests/skills/cases/skd-compile/snapshots/structure-object-group-no-selection/Template.xml @@ -0,0 +1,67 @@ + + + + ИсточникДанных1 + Local + + + Основной + + Организация + Организация + + true + + + d5p1:CatalogRef.Организации + + + + Сумма + Сумма + + xs:decimal + + 15 + 2 + Any + + + + ИсточникДанных1 + ВЫБРАТЬ Т.Организация, Т.Сумма ИЗ Регистр КАК Т + + + Основной + + + ru + Основной + + + + + + Сумма + + + + + + Организация + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + diff --git a/tests/skills/cases/skd-compile/snapshots/structure-table-pivot/Template.xml b/tests/skills/cases/skd-compile/snapshots/structure-table-pivot/Template.xml new file mode 100644 index 00000000..ae755f73 --- /dev/null +++ b/tests/skills/cases/skd-compile/snapshots/structure-table-pivot/Template.xml @@ -0,0 +1,123 @@ + + + + ИсточникДанных1 + Local + + + Основной + + Период + Период + + xs:dateTime + + Date + + + + + Номенклатура + Номенклатура + + true + + + d5p1:CatalogRef.Номенклатура + + + + Характеристика + Характеристика + + true + + + d5p1:CatalogRef.ХарактеристикиНоменклатуры + + + + КОформлениюПриход + КОформлениюПриход + + xs:decimal + + 15 + 2 + Any + + + + ИсточникДанных1 + ВЫБРАТЬ Т.Период, Т.Номенклатура, Т.Характеристика, Т.КОформлениюПриход ИЗ Регистр КАК Т + + + Основной + + + ru + Основной + + + + + + КОформлениюПриход + + + + + + + Период + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + Номенклатура + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + Характеристика + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + + diff --git a/tests/skills/cases/skd-compile/structure-chart.json b/tests/skills/cases/skd-compile/structure-chart.json new file mode 100644 index 00000000..a57bdd69 --- /dev/null +++ b/tests/skills/cases/skd-compile/structure-chart.json @@ -0,0 +1,32 @@ +{ + "name": "Объектная диаграмма: point/series без selection/order + chart-level selection получают авто-Auto (issue #53)", + "params": { "outputPath": "Template.xml" }, + "input": { + "dataSets": [{ + "name": "Основной", + "query": "ВЫБРАТЬ Т.Период, Т.Номенклатура, Т.Сумма ИЗ Регистр КАК Т", + "fields": [ + "Период: date", + "Номенклатура: CatalogRef.Номенклатура @dimension", + "Сумма: decimal(15,2)" + ] + }], + "settingsVariants": [{ + "name": "Основной", + "settings": { + "selection": ["Сумма"], + "structure": [ + { + "type": "chart", + "points": { "groupFields": ["Период"] }, + "series": { "groupFields": ["Номенклатура"] } + } + ] + } + }] + }, + "validatePath": "Template.xml", + "expect": { + "files": ["Template.xml"] + } +} diff --git a/tests/skills/cases/skd-compile/structure-object-group-no-selection.json b/tests/skills/cases/skd-compile/structure-object-group-no-selection.json new file mode 100644 index 00000000..f0ecd98c --- /dev/null +++ b/tests/skills/cases/skd-compile/structure-object-group-no-selection.json @@ -0,0 +1,27 @@ +{ + "name": "Плоская объектная группа без selection/order получает авто-Auto (issue #53)", + "params": { "outputPath": "Template.xml" }, + "input": { + "dataSets": [{ + "name": "Основной", + "query": "ВЫБРАТЬ Т.Организация, Т.Сумма ИЗ Регистр КАК Т", + "fields": [ + "Организация: CatalogRef.Организации @dimension", + "Сумма: decimal(15,2)" + ] + }], + "settingsVariants": [{ + "name": "Основной", + "settings": { + "selection": ["Сумма"], + "structure": [ + { "groupFields": ["Организация"] } + ] + } + }] + }, + "validatePath": "Template.xml", + "expect": { + "files": ["Template.xml"] + } +} diff --git a/tests/skills/cases/skd-compile/structure-table-pivot.json b/tests/skills/cases/skd-compile/structure-table-pivot.json new file mode 100644 index 00000000..3c12a42f --- /dev/null +++ b/tests/skills/cases/skd-compile/structure-table-pivot.json @@ -0,0 +1,38 @@ +{ + "name": "Объектная таблица-пивот: оси без selection/order получают авто-Auto (issue #53)", + "params": { "outputPath": "Template.xml" }, + "input": { + "dataSets": [{ + "name": "Основной", + "query": "ВЫБРАТЬ Т.Период, Т.Номенклатура, Т.Характеристика, Т.КОформлениюПриход ИЗ Регистр КАК Т", + "fields": [ + "Период: date", + "Номенклатура: CatalogRef.Номенклатура @dimension", + "Характеристика: CatalogRef.ХарактеристикиНоменклатуры @dimension", + "КОформлениюПриход: decimal(15,2)" + ] + }], + "settingsVariants": [{ + "name": "Основной", + "settings": { + "selection": ["КОформлениюПриход"], + "structure": [ + { + "type": "table", + "columns": [ { "groupFields": ["Период"] } ], + "rows": [ + { + "groupFields": ["Номенклатура"], + "children": [ { "groupFields": ["Характеристика"] } ] + } + ] + } + ] + } + }] + }, + "validatePath": "Template.xml", + "expect": { + "files": ["Template.xml"] + } +} diff --git a/tests/skills/cases/skd-decompile/fixtures/table-axis-no-selection/Template.xml b/tests/skills/cases/skd-decompile/fixtures/table-axis-no-selection/Template.xml new file mode 100644 index 00000000..3c535be3 --- /dev/null +++ b/tests/skills/cases/skd-decompile/fixtures/table-axis-no-selection/Template.xml @@ -0,0 +1,81 @@ + + + + ИсточникДанных1 + Local + + + Основной + + Организация + Организация + + xs:string + + 0 + Variable + + + + + Сумма + Сумма + + xs:decimal + + 15 + 2 + Any + + + + ИсточникДанных1 + ВЫБРАТЬ Т.Организация, Т.Сумма ИЗ Регистр КАК Т + + + Основной + + + ru + Основной + + + + + + Сумма + + + + + + + Организация + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + Организация + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/Template.xml b/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/Template.xml index 19e807d7..7d0feae5 100644 --- a/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/Template.xml +++ b/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/Template.xml @@ -127,6 +127,12 @@ 0001-01-01T00:00:00 + + + + + + ДанныеЧасть1 diff --git a/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/decompiled.json index 552092db..0d3f5dd1 100644 --- a/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/decompiled.json @@ -5,7 +5,7 @@ "name": "Основной", "settings": { "selection": ["Период", { "field": "Сумма", "title": "Итого" }, { "folder": "Группа итогов", "items": ["ВидРасчета", { "field": "Сумма", "title": "Сумма с расшифровкой" }, { "folder": "Подгруппа", "items": ["Подразделение"] }] }], - "structure": [{ "name": "Группа1", "groupFields": [{ "field": "Период", "periodAdditionType": "Day" }, { "field": "Подразделение", "groupType": "Hierarchy" }], "children": [{ "type": "nestedObject", "objectID": "ДанныеЧасть1", "settings": { "selection": ["ВидРасчета", "Сумма"] } }] }] + "structure": [{ "name": "Группа1", "groupFields": [{ "field": "Период", "periodAdditionType": "Day" }, { "field": "Подразделение", "groupType": "Hierarchy" }], "selection": ["Auto"], "order": ["Auto"], "children": [{ "type": "nestedObject", "objectID": "ДанныеЧасть1", "settings": { "selection": ["ВидРасчета", "Сумма"] } }] }] } } ] diff --git a/tests/skills/cases/skd-decompile/snapshots/table-axis-no-selection/Template.xml b/tests/skills/cases/skd-decompile/snapshots/table-axis-no-selection/Template.xml new file mode 100644 index 00000000..f6b96a5c --- /dev/null +++ b/tests/skills/cases/skd-decompile/snapshots/table-axis-no-selection/Template.xml @@ -0,0 +1,81 @@ + + + + ИсточникДанных1 + Local + + + Основной + + Организация + Организация + + xs:string + + 0 + Variable + + + + + Сумма + Сумма + + xs:decimal + + 15 + 2 + Any + + + + ИсточникДанных1 + ВЫБРАТЬ Т.Организация, Т.Сумма ИЗ Регистр КАК Т + + + Основной + + + ru + Основной + + + + + + Сумма + + + + + + + Организация + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + + + + + + Организация + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/table-axis-no-selection/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/table-axis-no-selection/decompiled.json new file mode 100644 index 00000000..2f38e9b8 --- /dev/null +++ b/tests/skills/cases/skd-decompile/snapshots/table-axis-no-selection/decompiled.json @@ -0,0 +1,4 @@ +{ + "dataSets": [{ "name": "Основной", "query": "ВЫБРАТЬ Т.Организация, Т.Сумма ИЗ Регистр КАК Т", "fields": ["Организация: string", "Сумма: decimal(15,2)"] }], + "settingsVariants": [{ "name": "Основной", "settings": { "selection": ["Сумма"], "structure": [{ "type": "table", "columns": [{ "groupFields": ["Организация"], "order": ["Auto"], "selection": ["Auto"] }], "rows": [{ "groupFields": ["Организация"], "order": [], "selection": [] }] }] } }] +} \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/table-axis-no-selection.json b/tests/skills/cases/skd-decompile/table-axis-no-selection.json new file mode 100644 index 00000000..731e6389 --- /dev/null +++ b/tests/skills/cases/skd-decompile/table-axis-no-selection.json @@ -0,0 +1,6 @@ +{ + "name": "Ось таблицы без / декомпилится в [] (страж round-trip regression, issue #53)", + "setup": "fixture:table-axis-no-selection", + "params": { "templatePath": "Template.xml" }, + "outputPath": "decompiled.json" +}