From e4dcef8c905d6cdce9df677ffec87f9646a03845 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 6 Apr 2026 14:44:14 +0300 Subject: [PATCH] fix(skd-compile): DesignTimeValue, useRestriction for hidden, named structure groups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - fix: auto-detect DesignTimeValue for ПланСчетов/Справочник/Перечисление/Документ values (#9) - fix: hidden params auto-set useRestriction=true alongside availableAsField=false (#11) - feat: named groups in structure shorthand "ИмяГруппы[Поле] > details" (#10) - version bump: skd-compile v1.5 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../skd-compile/scripts/skd-compile.ps1 | 19 ++++++++++++----- .../skills/skd-compile/scripts/skd-compile.py | 21 ++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index b89ec461..d6626da5 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.4 — Compile 1C DCS from JSON +# skd-compile v1.5 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -857,8 +857,14 @@ function Emit-SingleParam { # Value Emit-ParamValue -type $parsed.type -val $parsed.value -indent "`t`t" + # Hidden implies useRestriction=true + availableAsField=false + if ($parsed.hidden -eq $true) { + $parsed.availableAsField = $false + $parsed.useRestriction = $true + } + # UseRestriction - if ($p -isnot [string] -and $p.useRestriction -eq $true) { + if ($parsed.useRestriction -eq $true -or ($p -isnot [string] -and $p.useRestriction -eq $true)) { X "`t`ttrue" } @@ -867,9 +873,6 @@ function Emit-SingleParam { X "`t`t$(Esc-Xml $parsed.expression)" } - # Hidden implies availableAsField=false - if ($parsed.hidden -eq $true) { $parsed.availableAsField = $false } - # AvailableAsField if ($parsed.availableAsField -eq $false) { X "`t`tfalse" @@ -957,6 +960,8 @@ function Emit-ParamValue { X "$indent$(Esc-Xml $valStr)" } elseif ($valStr -eq "true" -or $valStr -eq "false") { X "$indent$(Esc-Xml $valStr)" + } elseif ($valStr -match '^(ПланСчетов|Справочник|Перечисление|Документ|ПланВидовХарактеристик|ПланВидовРасчета|БизнесПроцесс|Задача|РегистрСведений|ПланОбмена)\.' -or $valStr -match '^(ChartOfAccounts|Catalog|Enum|Document|ChartOfCharacteristicTypes|ChartOfCalculationTypes|BusinessProcess|Task|InformationRegister|ExchangePlan)\.') { + X "$indent$(Esc-Xml $valStr)" } else { X "$indent$(Esc-Xml $valStr)" } @@ -1744,6 +1749,10 @@ function Parse-StructureShorthand { if ($seg -match '^(?i)(details|детали)$') { # Empty groupBy = detailed records $group | Add-Member -NotePropertyName "groupBy" -NotePropertyValue @() + } elseif ($seg -match '^(.+)\[(.+)\]$') { + # Named group: "ИмяГруппы[Поле]" + $group | Add-Member -NotePropertyName "name" -NotePropertyValue $Matches[1].Trim() + $group | Add-Member -NotePropertyName "groupBy" -NotePropertyValue @($Matches[2].Trim()) } else { $group | Add-Member -NotePropertyName "groupBy" -NotePropertyValue @($seg) } diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 35a86414..51ee0b27 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.4 — Compile 1C DCS from JSON +# skd-compile v1.5 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -702,6 +702,8 @@ def emit_param_value(lines, type_str, val, indent): lines.append(f'{indent}{esc_xml(val_str)}') elif val_str == 'true' or val_str == 'false': lines.append(f'{indent}{esc_xml(val_str)}') + elif re.match(r'^(ПланСчетов|Справочник|Перечисление|Документ|ПланВидовХарактеристик|ПланВидовРасчета|БизнесПроцесс|Задача|РегистрСведений|ПланОбмена|ChartOfAccounts|Catalog|Enum|Document|ChartOfCharacteristicTypes|ChartOfCalculationTypes|BusinessProcess|Task|InformationRegister|ExchangePlan)\.', val_str): + lines.append(f'{indent}{esc_xml(val_str)}') else: lines.append(f'{indent}{esc_xml(val_str)}') @@ -726,15 +728,18 @@ def emit_single_param(lines, p, parsed): # Value emit_param_value(lines, parsed.get('type', ''), parsed.get('value'), '\t\t') + # Hidden implies useRestriction=true + availableAsField=false + if parsed.get('hidden') is True: + parsed['availableAsField'] = False + parsed['useRestriction'] = True + # UseRestriction - if p is not None and not isinstance(p, str) and p.get('useRestriction') is True: + if parsed.get('useRestriction') is True or (p is not None and not isinstance(p, str) and p.get('useRestriction') is True): lines.append('\t\ttrue') # Expression if parsed.get('expression'): lines.append(f'\t\t{esc_xml(parsed["expression"])}') - - # Hidden implies availableAsField=false if parsed.get('hidden'): parsed['availableAsField'] = False @@ -1461,7 +1466,13 @@ def parse_structure_shorthand(s): if re.match(r'(?i)^(details|\u0434\u0435\u0442\u0430\u043b\u0438)$', seg): group['groupBy'] = [] else: - group['groupBy'] = [seg] + # Named group: "ИмяГруппы[Поле]" + m_named = re.match(r'^(.+)\[(.+)\]$', seg) + if m_named: + group['name'] = m_named.group(1).strip() + group['groupBy'] = [m_named.group(2).strip()] + else: + group['groupBy'] = [seg] if innermost is not None: group['children'] = [innermost]