diff --git a/.claude/skills/skd-compile/SKILL.md b/.claude/skills/skd-compile/SKILL.md index 29da5a3a..de19fec7 100644 --- a/.claude/skills/skd-compile/SKILL.md +++ b/.claude/skills/skd-compile/SKILL.md @@ -142,7 +142,7 @@ Shorthand: `"Имя [Заголовок]: тип = значение @флаги" } ``` -В варианте настроек `"dataParameters": "auto"` автоматически генерирует записи для всех не-hidden параметров с `userSettingID`. Для `StandardPeriod` вариант периода наследуется из дефолта параметра (`Custom`, если не задан). +В варианте настроек `"dataParameters": "auto"` автоматически генерирует записи для всех не-hidden параметров с `userSettingID`. Значения по умолчанию копируются из параметра с правильным xsi:type (boolean/decimal/date/string/DesignTimeValue для ссылочных, StandardPeriod — с наследованием variant). Параметры без дефолта или с `StandardPeriod=Custom` помечаются `false` и `` (активируются пользователем). ### Фильтры — shorthand diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index b662e310..58e83992 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.16 — Compile 1C DCS from JSON +# skd-compile v1.17 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -1847,7 +1847,10 @@ function Emit-DataParameters { X "$indent`t`t$(Esc-Xml "$($dp.parameter)")" # Value - if ($null -ne $dp.value) { + if ($dp.nilValue -eq $true) { + X "$indent`t`t" + } elseif ($null -ne $dp.value) { + $vtype = "$($dp.valueType)" if ($dp.value -is [PSCustomObject] -and $dp.value.variant) { # StandardPeriod (object form from JSON) X "$indent`t`t" @@ -1862,11 +1865,17 @@ function Emit-DataParameters { X "$indent`t`t`t0001-01-01T00:00:00" X "$indent`t`t`t0001-01-01T00:00:00" X "$indent`t`t" - } elseif ($dp.value -is [bool]) { + } elseif ($vtype -eq 'boolean' -or $dp.value -is [bool]) { $bv = "$($dp.value)".ToLower() X "$indent`t`t$(Esc-Xml $bv)" - } elseif ("$($dp.value)" -match '^\d{4}-\d{2}-\d{2}T') { + } elseif ($vtype -match '^date' -or "$($dp.value)" -match '^\d{4}-\d{2}-\d{2}T') { X "$indent`t`t$(Esc-Xml "$($dp.value)")" + } elseif ($vtype -match '^decimal') { + X "$indent`t`t$(Esc-Xml "$($dp.value)")" + } elseif ($vtype -match '^string') { + X "$indent`t`t$(Esc-Xml "$($dp.value)")" + } elseif ("$($dp.value)" -match '^(ПланСчетов|Справочник|Перечисление|Документ|ПланВидовХарактеристик|ПланВидовРасчета|БизнесПроцесс|Задача|РегистрСведений|ПланОбмена)\.' -or "$($dp.value)" -match '^(ChartOfAccounts|Catalog|Enum|Document|ChartOfCharacteristicTypes|ChartOfCalculationTypes|BusinessProcess|Task|InformationRegister|ExchangePlan)\.') { + X "$indent`t`t$(Esc-Xml "$($dp.value)")" } else { X "$indent`t`t$(Esc-Xml "$($dp.value)")" } @@ -2162,31 +2171,45 @@ function Emit-SettingsVariants { # DataParameters if ($s.dataParameters -eq 'auto') { - # Auto-generate dataParameters for all non-hidden params + # Auto-generate dataParameters for all non-hidden params. + # Pattern follows 1C Designer / ERP persistence: + # - value set (non-default) → emit value, use=true (implicit) + # - value missing / Custom period → false + $autoDP = @() foreach ($ap in $script:allParams) { - if (-not $ap.hidden) { - $dpItem = New-Object PSObject - $dpItem | Add-Member -NotePropertyName "parameter" -NotePropertyValue $ap.name - $dpItem | Add-Member -NotePropertyName "use" -NotePropertyValue $false - $dpItem | Add-Member -NotePropertyName "userSettingID" -NotePropertyValue "auto" - # For StandardPeriod emit with variant inherited from - # the parameter default (Custom if none) — matches how 1C Designer - # persists SettingsParameterValue for period parameters. - if ($ap.type -eq 'StandardPeriod') { - $variant = 'Custom' - $av = $ap.value - if ($null -ne $av) { - if (($av -is [PSCustomObject] -or $av -is [hashtable]) -and $av.variant) { - $variant = "$($av.variant)" - } elseif ("$av") { - $variant = "$av" - } + if ($ap.hidden) { continue } + $dpItem = New-Object PSObject + $dpItem | Add-Member -NotePropertyName "parameter" -NotePropertyValue $ap.name + $dpItem | Add-Member -NotePropertyName "userSettingID" -NotePropertyValue "auto" + + $hasMeaningfulValue = $false + + if ($ap.type -eq 'StandardPeriod') { + # Inherit variant; Custom is treated as "empty" + $variant = 'Custom' + $av = $ap.value + if ($null -ne $av) { + if (($av -is [PSCustomObject] -or $av -is [hashtable]) -and $av.variant) { + $variant = "$($av.variant)" + } elseif ("$av") { + $variant = "$av" } - $dpItem | Add-Member -NotePropertyName "value" -NotePropertyValue @{ variant = $variant } } - $autoDP += $dpItem + $dpItem | Add-Member -NotePropertyName "value" -NotePropertyValue @{ variant = $variant } + if ($variant -ne 'Custom') { $hasMeaningfulValue = $true } + } elseif ($null -ne $ap.value -and "$($ap.value)" -ne '') { + $dpItem | Add-Member -NotePropertyName "value" -NotePropertyValue $ap.value + $dpItem | Add-Member -NotePropertyName "valueType" -NotePropertyValue "$($ap.type)" + $hasMeaningfulValue = $true + } else { + $dpItem | Add-Member -NotePropertyName "nilValue" -NotePropertyValue $true } + + if (-not $hasMeaningfulValue) { + $dpItem | Add-Member -NotePropertyName "use" -NotePropertyValue $false + } + + $autoDP += $dpItem } if ($autoDP.Count -gt 0) { Emit-DataParameters -items $autoDP -indent "`t`t`t" diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 406433d0..f1dc2157 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.16 — Compile 1C DCS from JSON +# skd-compile v1.17 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -1569,8 +1569,11 @@ def emit_data_parameters(lines, items, indent): lines.append(f'{indent}\t\t{esc_xml(str(dp["parameter"]))}') # Value - if dp.get('value') is not None: + if dp.get('nilValue') is True: + lines.append(f'{indent}\t\t') + elif dp.get('value') is not None: val = dp['value'] + vtype = str(dp.get('valueType') or '') if isinstance(val, dict) and val.get('variant'): # StandardPeriod lines.append(f'{indent}\t\t') @@ -1578,11 +1581,17 @@ def emit_data_parameters(lines, items, indent): lines.append(f'{indent}\t\t\t0001-01-01T00:00:00') lines.append(f'{indent}\t\t\t0001-01-01T00:00:00') lines.append(f'{indent}\t\t') - elif isinstance(val, bool): + elif vtype == 'boolean' or isinstance(val, bool): bv = str(val).lower() lines.append(f'{indent}\t\t{esc_xml(bv)}') - elif re.match(r'^\d{4}-\d{2}-\d{2}T', str(val)): + elif re.match(r'^date', vtype) or re.match(r'^\d{4}-\d{2}-\d{2}T', str(val)): lines.append(f'{indent}\t\t{esc_xml(str(val))}') + elif re.match(r'^decimal', vtype): + lines.append(f'{indent}\t\t{esc_xml(str(val))}') + elif re.match(r'^string', vtype): + lines.append(f'{indent}\t\t{esc_xml(str(val))}') + elif re.match(r'^(\u041f\u043b\u0430\u043d\u0421\u0447\u0435\u0442\u043e\u0432|\u0421\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a|\u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435|\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442|\u041f\u043b\u0430\u043d\u0412\u0438\u0434\u043e\u0432\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a|\u041f\u043b\u0430\u043d\u0412\u0438\u0434\u043e\u0432\u0420\u0430\u0441\u0447\u0435\u0442\u0430|\u0411\u0438\u0437\u043d\u0435\u0441\u041f\u0440\u043e\u0446\u0435\u0441\u0441|\u0417\u0430\u0434\u0430\u0447\u0430|\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0421\u0432\u0435\u0434\u0435\u043d\u0438\u0439|\u041f\u043b\u0430\u043d\u041e\u0431\u043c\u0435\u043d\u0430)\.', str(val)) or re.match(r'^(ChartOfAccounts|Catalog|Enum|Document|ChartOfCharacteristicTypes|ChartOfCalculationTypes|BusinessProcess|Task|InformationRegister|ExchangePlan)\.', str(val)): + lines.append(f'{indent}\t\t{esc_xml(str(val))}') else: lines.append(f'{indent}\t\t{esc_xml(str(val))}') @@ -1815,28 +1824,42 @@ def emit_settings_variants(lines, defn): # DataParameters if s.get('dataParameters') == 'auto': - # Auto-generate dataParameters for all non-hidden params + # Auto-generate dataParameters for all non-hidden params. + # Pattern follows 1C Designer / ERP persistence: + # value set (non-default) → emit value, use=true (implicit) + # value missing / Custom period → false + auto_dp = [] for ap in _all_params: - if not ap['hidden']: - item = { - 'parameter': ap['name'], - 'use': False, - 'userSettingID': 'auto', - } - # For StandardPeriod emit with variant inherited - # from the parameter default (Custom if none) — matches how - # 1C Designer persists SettingsParameterValue for period params. - if ap.get('type') == 'StandardPeriod': - variant = 'Custom' - av = ap.get('value') - if av is not None: - if isinstance(av, dict) and av.get('variant'): - variant = str(av['variant']) - elif str(av): - variant = str(av) - item['value'] = {'variant': variant} - auto_dp.append(item) + if ap['hidden']: + continue + item = { + 'parameter': ap['name'], + 'userSettingID': 'auto', + } + has_meaningful_value = False + + if ap.get('type') == 'StandardPeriod': + variant = 'Custom' + av = ap.get('value') + if av is not None: + if isinstance(av, dict) and av.get('variant'): + variant = str(av['variant']) + elif str(av): + variant = str(av) + item['value'] = {'variant': variant} + if variant != 'Custom': + has_meaningful_value = True + elif ap.get('value') is not None and str(ap.get('value')) != '': + item['value'] = ap['value'] + item['valueType'] = str(ap.get('type') or '') + has_meaningful_value = True + else: + item['nilValue'] = True + + if not has_meaningful_value: + item['use'] = False + + auto_dp.append(item) if auto_dp: emit_data_parameters(lines, auto_dp, '\t\t\t') elif s.get('dataParameters'): diff --git a/tests/skills/cases/skd-compile/auto-data-parameters.json b/tests/skills/cases/skd-compile/auto-data-parameters.json index edac3b7a..bcdf23a4 100644 --- a/tests/skills/cases/skd-compile/auto-data-parameters.json +++ b/tests/skills/cases/skd-compile/auto-data-parameters.json @@ -1,5 +1,5 @@ { - "name": "dataParameters: auto — наследование variant для StandardPeriod", + "name": "dataParameters: auto — наследование значений по всем типам", "params": { "outputPath": "Template.xml" }, "input": { "dataSets": [{ @@ -9,7 +9,12 @@ "parameters": [ "Период: СтандартныйПериод = LastMonth @autoDates", "ПериодБезДефолта: СтандартныйПериод", - "Флаг: boolean = true" + "Флаг: boolean = true", + "Сумма: decimal(15,2) = 0", + "Ставка: decimal(5,2) = 13.5", + "Метка: string(50) = ТестовоеЗначение", + "ПустаяСтрока: string(50)", + "Валюта: СправочникСсылка.Валюты = Справочник.Валюты.EmptyRef" ], "settingsVariants": [{ "name": "Основной", diff --git a/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml b/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml index 30fbec67..a6771bb2 100644 --- a/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml +++ b/tests/skills/cases/skd-compile/snapshots/auto-data-parameters/Template.xml @@ -83,6 +83,58 @@ true + + Сумма + + xs:decimal + + 15 + 2 + Any + + + 0 + + + Ставка + + xs:decimal + + 5 + 2 + Any + + + 13.5 + + + Метка + + xs:string + + 50 + Variable + + + ТестовоеЗначение + + + ПустаяСтрока + + xs:string + + 50 + Variable + + + + + Валюта + + d5p1:CatalogRef.Валюты + + Справочник.Валюты.EmptyRef + Основной @@ -94,7 +146,6 @@ - false Период LastMonth @@ -114,10 +165,36 @@ UUID-002 - false Флаг + true UUID-003 + + Сумма + 0 + UUID-004 + + + Ставка + 13.5 + UUID-005 + + + Метка + ТестовоеЗначение + UUID-006 + + + false + ПустаяСтрока + + UUID-007 + + + Валюта + Справочник.Валюты.EmptyRef + UUID-008 +