From 9b331aa41d36fa8f529ec585ff96ed03ded20cf9 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 24 May 2026 18:23:36 +0300 Subject: [PATCH] =?UTF-8?q?feat(skd):=20user-settings=20+=20axis-viewMode?= =?UTF-8?q?=20+=20use=3Dfalse=20=D0=BD=D0=B0=20StructureItemTable/Chart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раньше для StructureItemTable читали только viewMode/userSettingID/ userSettingPresentation/itemsViewMode, а для StructureItemChart — вовсе ничего из user-settings. Также не поддерживали axis-level режим доступности секций (columnsViewMode/rowsViewMode/pointsViewMode/ seriesViewMode) и use=false на самих table/chart. Расширено: - table: + use=false, + columnsViewMode, + rowsViewMode - chart: + use=false, + viewMode, + userSettingID, + userSettingPresentation, + itemsViewMode, + pointsViewMode, + seriesViewMode Все эти атрибуты эмитятся платформой как direct children самой item-ноды после rows/columns (table) или points/series (chart). DSL — простые поля прямо на table/chart-объекте (как у table уже было для viewMode/etc). Sample30 total: 729 → 620 строк diff (-109). --- .../skd-compile/scripts/skd-compile.ps1 | 41 ++++++++++++++++++- .../skills/skd-compile/scripts/skd-compile.py | 31 +++++++++++++- .../skd-decompile/scripts/skd-decompile.ps1 | 25 ++++++++++- docs/skd-dsl-spec.md | 5 ++- 4 files changed, 97 insertions(+), 5 deletions(-) diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index 9e7900ac..d484f0bd 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.95 — Compile 1C DCS from JSON +# skd-compile v1.96 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -3097,6 +3097,11 @@ function Emit-StructureItem { elseif ($type -eq "table") { X "$indent" + # use=false — отключённая таблица + if ($item.use -eq $false) { + X "$indent`tfalse" + } + if ($item.name) { X "$indent`t$(Esc-Xml "$($item.name)")" } @@ -3129,6 +3134,13 @@ function Emit-StructureItem { if ($item.outputParameters) { Emit-OutputParameters -params $item.outputParameters -indent "$indent`t" } + # columnsViewMode / rowsViewMode — axis-level режим доступности (после rows/columns) + if ($item.columnsViewMode) { + X "$indent`t$(Esc-Xml "$($item.columnsViewMode)")" + } + if ($item.rowsViewMode) { + X "$indent`t$(Esc-Xml "$($item.rowsViewMode)")" + } # viewMode / userSettingID / userSettingPresentation / itemsViewMode на самой таблице if ($item.viewMode) { X "$indent`t$(Esc-Xml "$($item.viewMode)")" @@ -3149,6 +3161,11 @@ function Emit-StructureItem { elseif ($type -eq "chart") { X "$indent" + # use=false — отключённая диаграмма + if ($item.use -eq $false) { + X "$indent`tfalse" + } + if ($item.name) { X "$indent`t$(Esc-Xml "$($item.name)")" } @@ -3196,6 +3213,28 @@ function Emit-StructureItem { Emit-OutputParameters -params $item.outputParameters -indent "$indent`t" } + # pointsViewMode / seriesViewMode — axis-level режим доступности (после points/series) + if ($item.pointsViewMode) { + X "$indent`t$(Esc-Xml "$($item.pointsViewMode)")" + } + if ($item.seriesViewMode) { + X "$indent`t$(Esc-Xml "$($item.seriesViewMode)")" + } + # viewMode / userSettingID / userSettingPresentation / itemsViewMode на самой диаграмме + if ($item.viewMode) { + X "$indent`t$(Esc-Xml "$($item.viewMode)")" + } + if ($item.userSettingID) { + $gid = if ("$($item.userSettingID)" -eq "auto") { New-Guid-String } else { "$($item.userSettingID)" } + X "$indent`t$(Esc-Xml $gid)" + } + if ($item.userSettingPresentation) { + Emit-MLText -tag "dcsset:userSettingPresentation" -text $item.userSettingPresentation -indent "$indent`t" + } + if ($item.itemsViewMode) { + X "$indent`t$(Esc-Xml "$($item.itemsViewMode)")" + } + X "$indent" } elseif ($type -eq "nestedObject") { diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 53bec39d..7213089f 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.95 — Compile 1C DCS from JSON +# skd-compile v1.96 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -2456,6 +2456,10 @@ def emit_structure_item(lines, item, indent, short_group=False): elif item_type == 'table': lines.append(f'{indent}') + # use=false — отключённая таблица + if item.get('use') is False: + lines.append(f'{indent}\tfalse') + if item.get('name'): lines.append(f'{indent}\t{esc_xml(str(item["name"]))}') @@ -2480,6 +2484,11 @@ def emit_structure_item(lines, item, indent, short_group=False): emit_conditional_appearance(lines, item['conditionalAppearance'], f'{indent}\t') if item.get('outputParameters'): emit_output_parameters(lines, item['outputParameters'], f'{indent}\t') + # columnsViewMode / rowsViewMode — axis-level режим доступности + if item.get('columnsViewMode'): + lines.append(f'{indent}\t{esc_xml(str(item["columnsViewMode"]))}') + if item.get('rowsViewMode'): + lines.append(f'{indent}\t{esc_xml(str(item["rowsViewMode"]))}') # viewMode / userSettingID / userSettingPresentation / itemsViewMode на самой таблице if item.get('viewMode'): lines.append(f'{indent}\t{esc_xml(str(item["viewMode"]))}') @@ -2496,6 +2505,10 @@ def emit_structure_item(lines, item, indent, short_group=False): elif item_type == 'chart': lines.append(f'{indent}') + # use=false — отключённая диаграмма + if item.get('use') is False: + lines.append(f'{indent}\tfalse') + if item.get('name'): lines.append(f'{indent}\t{esc_xml(str(item["name"]))}') @@ -2523,6 +2536,22 @@ def emit_structure_item(lines, item, indent, short_group=False): if item.get('outputParameters'): emit_output_parameters(lines, item['outputParameters'], f'{indent}\t') + # pointsViewMode / seriesViewMode — axis-level режим доступности + if item.get('pointsViewMode'): + lines.append(f'{indent}\t{esc_xml(str(item["pointsViewMode"]))}') + if item.get('seriesViewMode'): + lines.append(f'{indent}\t{esc_xml(str(item["seriesViewMode"]))}') + # viewMode / userSettingID / userSettingPresentation / itemsViewMode на самой диаграмме + if item.get('viewMode'): + lines.append(f'{indent}\t{esc_xml(str(item["viewMode"]))}') + if item.get('userSettingID'): + gid = new_uuid() if str(item['userSettingID']) == 'auto' else str(item['userSettingID']) + lines.append(f'{indent}\t{esc_xml(gid)}') + if item.get('userSettingPresentation'): + emit_mltext(lines, f'{indent}\t', 'dcsset:userSettingPresentation', item['userSettingPresentation']) + if item.get('itemsViewMode'): + lines.append(f'{indent}\t{esc_xml(str(item["itemsViewMode"]))}') + lines.append(f'{indent}') elif item_type == 'nestedObject': diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index 9ba8e212..3393376f 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.78 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.79 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -2212,7 +2212,10 @@ function Build-Structure { $tCa = Build-ConditionalAppearance -caNode $tCaN -loc "$loc/$idx/ca" if ($tCa.Count -gt 0) { $entry['conditionalAppearance'] = $tCa } } - # viewMode / userSettingID / userSettingPresentation на самой таблице (direct child) + # use=false на самой таблице — отключённая ветка + $tUse = Get-Text $it "dcsset:use" + if ($tUse -eq 'false') { $entry['use'] = $false } + # viewMode / userSettingID / userSettingPresentation / itemsViewMode / rowsViewMode / columnsViewMode на самой таблице foreach ($ch in $it.ChildNodes) { if ($ch.NodeType -ne 'Element' -or $ch.NamespaceURI -ne 'http://v8.1c.ru/8.1/data-composition-system/settings') { continue } if ($ch.LocalName -eq 'viewMode' -and -not $entry.Contains('viewMode')) { $entry['viewMode'] = $ch.InnerText } @@ -2222,6 +2225,8 @@ function Build-Structure { if ($uspV) { $entry['userSettingPresentation'] = $uspV } } elseif ($ch.LocalName -eq 'itemsViewMode' -and -not $entry.Contains('itemsViewMode')) { $entry['itemsViewMode'] = $ch.InnerText } + elseif ($ch.LocalName -eq 'columnsViewMode' -and -not $entry.Contains('columnsViewMode')) { $entry['columnsViewMode'] = $ch.InnerText } + elseif ($ch.LocalName -eq 'rowsViewMode' -and -not $entry.Contains('rowsViewMode')) { $entry['rowsViewMode'] = $ch.InnerText } } $items += $entry $idx++ @@ -2293,6 +2298,22 @@ function Build-Structure { $opN = $it.SelectSingleNode("dcsset:outputParameters", $ns) $op = Build-OutputParameters -opNode $opN if ($op -and $op.Count -gt 0) { $entry['outputParameters'] = $op } + # use=false на самой диаграмме — отключённая ветка + $chUse = Get-Text $it "dcsset:use" + if ($chUse -eq 'false') { $entry['use'] = $false } + # viewMode / userSettingID / userSettingPresentation / itemsViewMode / pointsViewMode / seriesViewMode на chart + foreach ($ch in $it.ChildNodes) { + if ($ch.NodeType -ne 'Element' -or $ch.NamespaceURI -ne 'http://v8.1c.ru/8.1/data-composition-system/settings') { continue } + if ($ch.LocalName -eq 'viewMode' -and -not $entry.Contains('viewMode')) { $entry['viewMode'] = $ch.InnerText } + elseif ($ch.LocalName -eq 'userSettingID' -and -not $entry.Contains('userSettingID')) { $entry['userSettingID'] = 'auto' } + elseif ($ch.LocalName -eq 'userSettingPresentation' -and -not $entry.Contains('userSettingPresentation')) { + $uspV = Get-MLText $ch + if ($uspV) { $entry['userSettingPresentation'] = $uspV } + } + elseif ($ch.LocalName -eq 'itemsViewMode' -and -not $entry.Contains('itemsViewMode')) { $entry['itemsViewMode'] = $ch.InnerText } + elseif ($ch.LocalName -eq 'pointsViewMode' -and -not $entry.Contains('pointsViewMode')) { $entry['pointsViewMode'] = $ch.InnerText } + elseif ($ch.LocalName -eq 'seriesViewMode' -and -not $entry.Contains('seriesViewMode')) { $entry['seriesViewMode'] = $ch.InnerText } + } $items += $entry $idx++ continue diff --git a/docs/skd-dsl-spec.md b/docs/skd-dsl-spec.md index d735e67c..94bf44e9 100644 --- a/docs/skd-dsl-spec.md +++ b/docs/skd-dsl-spec.md @@ -929,7 +929,8 @@ Platform-pattern: `startDate`/`endDate`/`date` эмитятся ТОЛЬКО д Каждая `column`/`row` принимает те же поля что и `group`: `name`, `groupBy`/`groupFields`, `filter`, `order`, `selection`, `outputParameters`, `conditionalAppearance`, `children` (вложенные `StructureItemGroup`), плюс user-settings — `viewMode`, `userSettingID`, `userSettingPresentation`, `itemsViewMode` (регистрация column/row как пункта «Изменить вариант»). -На самой `table` (отдельно от column/row) также допустимы `selection`, `conditionalAppearance`, `outputParameters`, плюс user-settings: `viewMode`, `userSettingID`, `userSettingPresentation`, `itemsViewMode` — общие настройки таблицы (заголовок, выводимые поля, форматирование). +На самой `table` (отдельно от column/row) также допустимы `selection`, `conditionalAppearance`, `outputParameters`, плюс user-settings: `viewMode`, `userSettingID`, `userSettingPresentation`, `itemsViewMode`, `columnsViewMode`, `rowsViewMode`, `use` (`false` = таблица отключена). +- `columnsViewMode` / `rowsViewMode` — режим доступности секции колонок / строк в пользовательских настройках (значения: `Normal` / `QuickAccess` / `Inaccessible`). > **Внутренний паттерн**: `` внутри ``/``/``/`` платформа всегда сериализует в **короткой форме** `` без `xsi:type`. Compile эмитит этот вариант автоматически для `children` table axis. @@ -946,6 +947,8 @@ Platform-pattern: `startDate`/`endDate`/`date` эмитятся ТОЛЬКО д `points` и `series` принимают те же поля что table column/row (включая `name` и user-settings). +На самой chart-item: `viewMode`, `userSettingID`, `userSettingPresentation`, `itemsViewMode`, `pointsViewMode`, `seriesViewMode`, `use: false` (диаграмма отключена). `pointsViewMode`/`seriesViewMode` — аналоги `columnsViewMode`/`rowsViewMode` у таблицы. + **Multi-series / multi-points** — `points` и `series` могут быть массивом объектов, тогда генерируется несколько `` или `` подряд (каждый со своими `groupBy`, `filter`, user-settings). Используется например для разделения данных диаграммы на несколько серий по разным фильтрам: ```json