From c8cba6f7ce3e9bdc3520cf14c310496dae5bd6ed Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 24 May 2026 17:41:44 +0300 Subject: [PATCH] =?UTF-8?q?feat(skd):=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B9=20xmlns=20+=20use=3Dfalse=20=D0=BD?= =?UTF-8?q?=D0=B0=20nested=20sub-items=20outputParameters?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit В chart-параметрах типа ТипДиаграммы.СоединениеЗначенийПоСериям platform эмитит nested SettingsParameterValue с: - false (sub-параметр отключён) - (локальный xmlns на value — префикс не объявлен в корне схемы) Раньше теряли оба: - decompile не читал sub.use и не резолвил xmlns кастомного xsi:type - compile эмитил value без xmlns и без use=false decompile: читаем dcscor:use на sub-item, резолвим prefix→URI через GetNamespaceOfPrefix; если URI не из стандартных корневых xmlns — сохраняем valueType как объект {uri, name}. compile (PS+Py): новый helper Emit-OutputParametersSubItem; если valueType — объект, эмитим xmlns:dN= + xsi:type=dN:; + false если sub.use === false. Sample30 total: 809 → 794 строк diff. --- .../skd-compile/scripts/skd-compile.ps1 | 70 ++++++++++++++----- .../skills/skd-compile/scripts/skd-compile.py | 35 +++++++--- .../skd-decompile/scripts/skd-decompile.ps1 | 27 ++++++- 3 files changed, 104 insertions(+), 28 deletions(-) diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index 0f35d537..c625dfe0 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.92 — Compile 1C DCS from JSON +# skd-compile v1.93 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -2482,6 +2482,55 @@ function Emit-ConditionalAppearance { X "$indent" } +# Эмиссия nested sub-item внутри SettingsParameterValue (chart-параметры типа +# ТипДиаграммы.СоединениеЗначенийПоСериям). Поддерживает use=false и valueType +# либо строкой ("xs:string", "dN:Foo" если префикс известен в корне), либо +# объектом {uri, name} — эмитим локальный xmlns на value. +function Emit-OutputParametersSubItem { + param([string]$subName, $subWrap, [string]$indent) + $subVal = $subWrap + $subVT = 'xs:string' + $subUseFalse = $false + $subUri = $null + $subLocalName = $null + if ($subWrap -is [PSCustomObject]) { + if ($subWrap.PSObject.Properties['value']) { $subVal = $subWrap.value } + if ($subWrap.PSObject.Properties['valueType']) { + $vt = $subWrap.valueType + if ($vt -is [PSCustomObject] -and $vt.PSObject.Properties['uri']) { + $subUri = "$($vt.uri)"; $subLocalName = "$($vt.name)" + } elseif ($vt -is [System.Collections.IDictionary] -and $vt.Contains('uri')) { + $subUri = "$($vt['uri'])"; $subLocalName = "$($vt['name'])" + } else { + $subVT = "$vt" + } + } + if ($subWrap.PSObject.Properties['use'] -and $subWrap.use -eq $false) { $subUseFalse = $true } + } elseif ($subWrap -is [System.Collections.IDictionary]) { + if ($subWrap.Contains('value')) { $subVal = $subWrap['value'] } + if ($subWrap.Contains('valueType')) { + $vt = $subWrap['valueType'] + if ($vt -is [PSCustomObject] -and $vt.PSObject.Properties['uri']) { + $subUri = "$($vt.uri)"; $subLocalName = "$($vt.name)" + } elseif ($vt -is [System.Collections.IDictionary] -and $vt.Contains('uri')) { + $subUri = "$($vt['uri'])"; $subLocalName = "$($vt['name'])" + } else { + $subVT = "$vt" + } + } + if ($subWrap.Contains('use') -and $subWrap['use'] -eq $false) { $subUseFalse = $true } + } + X "$indent`t`t" + if ($subUseFalse) { X "$indent`t`t`tfalse" } + X "$indent`t`t`t$(Esc-Xml $subName)" + if ($subUri) { + X "$indent`t`t`t$(Esc-Xml "$subVal")" + } else { + X "$indent`t`t`t$(Esc-Xml "$subVal")" + } + X "$indent`t`t" +} + function Emit-OutputParameters { param($params, [string]$indent, $blockViewMode = $null) @@ -2559,28 +2608,17 @@ function Emit-OutputParameters { } else { X "$indent`t`t$(Esc-Xml "$rawVal")" } - # Nested sub-параметры (ТипДиаграммы.ВидПодписей и т.п.) — эмитим между value и extras + # Nested sub-параметры (ТипДиаграммы.ВидПодписей и т.п.) — эмитим между value и extras. + # valueType: строка → xsi:type=string, объект {uri, name} → локальный xmlns:dN + xsi:type=dN:name. if ($wrapItems) { $itemProps = if ($wrapItems -is [PSCustomObject]) { $wrapItems.PSObject.Properties } else { $null } if ($itemProps) { foreach ($ip in $itemProps) { - $subName = $ip.Name; $subWrap = $ip.Value - $subVal = if ($subWrap -is [PSCustomObject] -and $subWrap.PSObject.Properties['value']) { $subWrap.value } else { $subWrap } - $subVT = if ($subWrap -is [PSCustomObject] -and $subWrap.PSObject.Properties['valueType']) { "$($subWrap.valueType)" } else { 'xs:string' } - X "$indent`t`t" - X "$indent`t`t`t$(Esc-Xml $subName)" - X "$indent`t`t`t$(Esc-Xml "$subVal")" - X "$indent`t`t" + Emit-OutputParametersSubItem -subName $ip.Name -subWrap $ip.Value -indent $indent } } elseif ($wrapItems -is [System.Collections.IDictionary]) { foreach ($k in $wrapItems.Keys) { - $subWrap = $wrapItems[$k] - $subVal = if ($subWrap -is [System.Collections.IDictionary] -and $subWrap.Contains('value')) { $subWrap['value'] } else { $subWrap } - $subVT = if ($subWrap -is [System.Collections.IDictionary] -and $subWrap.Contains('valueType')) { "$($subWrap['valueType'])" } else { 'xs:string' } - X "$indent`t`t" - X "$indent`t`t`t$(Esc-Xml $k)" - X "$indent`t`t`t$(Esc-Xml "$subVal")" - X "$indent`t`t" + Emit-OutputParametersSubItem -subName $k -subWrap $wrapItems[$k] -indent $indent } } } diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 2d31ecb4..1859376a 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.92 — Compile 1C DCS from JSON +# skd-compile v1.93 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -2081,18 +2081,35 @@ def emit_output_parameters(lines, params, indent): emit_mltext(lines, f'{indent}\t\t', 'dcscor:value', val) else: lines.append(f'{indent}\t\t{esc_xml(str(val))}') - # Nested sub-параметры (ТипДиаграммы.ВидПодписей и т.п.) + # Nested sub-параметры (ТипДиаграммы.ВидПодписей и т.п.). + # valueType: строка → xsi:type=string, объект {uri, name} → локальный xmlns:dN. if wrap_items and isinstance(wrap_items, dict): for sub_name, sub_wrap in wrap_items.items(): - if isinstance(sub_wrap, dict) and 'value' in sub_wrap: - sub_val = sub_wrap['value'] - sub_vt = sub_wrap.get('valueType', 'xs:string') - else: - sub_val = sub_wrap - sub_vt = 'xs:string' + sub_val = sub_wrap + sub_vt = 'xs:string' + sub_use_false = False + sub_uri = None + sub_local_name = None + if isinstance(sub_wrap, dict): + if 'value' in sub_wrap: + sub_val = sub_wrap['value'] + if 'valueType' in sub_wrap: + vt = sub_wrap['valueType'] + if isinstance(vt, dict) and 'uri' in vt: + sub_uri = str(vt['uri']) + sub_local_name = str(vt['name']) + else: + sub_vt = str(vt) + if sub_wrap.get('use') is False: + sub_use_false = True lines.append(f'{indent}\t\t') + if sub_use_false: + lines.append(f'{indent}\t\t\tfalse') lines.append(f'{indent}\t\t\t{esc_xml(sub_name)}') - lines.append(f'{indent}\t\t\t{esc_xml(str(sub_val))}') + if sub_uri: + lines.append(f'{indent}\t\t\t{esc_xml(str(sub_val))}') + else: + lines.append(f'{indent}\t\t\t{esc_xml(str(sub_val))}') lines.append(f'{indent}\t\t') if wrap_vm: lines.append(f'{indent}\t\t{esc_xml(str(wrap_vm))}') diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index b2ac96f4..d160641f 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.75 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.76 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -1846,8 +1846,29 @@ function Build-OutputParameters { if ($subType -eq 'LocalStringType') { $subRaw = Get-MLText $subVal } elseif ($subType -eq 'Font') { $subRaw = Get-FontValue $subVal } else { $subRaw = $subVal.InnerText } - # Сохраняем как {value, valueType} чтобы compile воспроизвёл xsi:type - $nestedItems[$subName] = [ordered]@{ value = $subRaw; valueType = $subFull } + # Резолвим prefix → URI: если URI не из стандартных корневых xmlns — + # сохраняем как объект {uri, name} чтобы compile эмитил xmlns локально. + $subTypeField = $subFull + if ($subFull -and $subFull -match '^([^:]+):(.+)$') { + $pfx = $matches[1]; $localName = $matches[2] + $uri = $subVal.GetNamespaceOfPrefix($pfx) + if ($uri -and $uri -notin @( + 'http://www.w3.org/2001/XMLSchema', + 'http://www.w3.org/2001/XMLSchema-instance', + 'http://v8.1c.ru/8.1/data-composition-system/schema', + 'http://v8.1c.ru/8.1/data-composition-system/settings', + 'http://v8.1c.ru/8.1/data-composition-system/core', + 'http://v8.1c.ru/8.1/data-composition-system/common', + 'http://v8.1c.ru/8.1/data/core', + 'http://v8.1c.ru/8.1/data/ui' + )) { + $subTypeField = [ordered]@{ uri = $uri; name = $localName } + } + } + $entry = [ordered]@{ value = $subRaw; valueType = $subTypeField } + $subUse = Get-Text $sub "dcscor:use" + if ($subUse -eq 'false') { $entry['use'] = $false } + $nestedItems[$subName] = $entry } # Extras (use=false / viewMode / userSettingID / userSettingPresentation / nested items) → wrapper. $useV = Get-Text $it "dcscor:use"