diff --git a/.claude/skills/skd-edit/scripts/skd-edit.ps1 b/.claude/skills/skd-edit/scripts/skd-edit.ps1 index f5875e6f..357fe1ad 100644 --- a/.claude/skills/skd-edit/scripts/skd-edit.ps1 +++ b/.claude/skills/skd-edit/scripts/skd-edit.ps1 @@ -1,4 +1,4 @@ -# skd-edit v1.16 — Atomic 1C DCS editor +# skd-edit v1.17 — Atomic 1C DCS editor # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -238,14 +238,25 @@ function Read-FieldProperties($fieldEl) { function Parse-TotalShorthand { param([string]$s) + # "DataPath: Func" or "DataPath: Func(expr)" or "DataPath: ИмяРесурса" (identity) $parts = $s -split ':', 2 $dataPath = $parts[0].Trim() $funcPart = $parts[1].Trim() + # Known DCS aggregate functions (ru + en) + $aggFuncs = @('Сумма','Количество','Минимум','Максимум','Среднее', + 'Sum','Count','Min','Max','Avg', + 'Minimum','Maximum','Average') + if ($funcPart -match '^\w+\(') { + # Already has expression form: Func(expr) return @{ dataPath = $dataPath; expression = $funcPart } - } else { + } elseif ($funcPart -in $aggFuncs) { + # Short: Func → Func(DataPath) return @{ dataPath = $dataPath; expression = "$funcPart($dataPath)" } + } else { + # Identity or custom expression — use as-is + return @{ dataPath = $dataPath; expression = $funcPart } } } diff --git a/.claude/skills/skd-edit/scripts/skd-edit.py b/.claude/skills/skd-edit/scripts/skd-edit.py index 88f4d11d..c8773eb4 100644 --- a/.claude/skills/skd-edit/scripts/skd-edit.py +++ b/.claude/skills/skd-edit/scripts/skd-edit.py @@ -1,4 +1,4 @@ -# skd-edit v1.16 — Atomic 1C DCS editor (Python port) +# skd-edit v1.17 — Atomic 1C DCS editor (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -250,13 +250,21 @@ def read_field_properties(field_el): def parse_total_shorthand(s): + # "DataPath: Func" or "DataPath: Func(expr)" or "DataPath: ИмяРесурса" (identity) parts = s.split(":", 1) data_path = parts[0].strip() func_part = parts[1].strip() + + agg_funcs = {'Сумма', 'Количество', 'Минимум', 'Максимум', 'Среднее', + 'Sum', 'Count', 'Min', 'Max', 'Avg', + 'Minimum', 'Maximum', 'Average'} + if re.match(r'^\w+\(', func_part): return {"dataPath": data_path, "expression": func_part} - else: + elif func_part in agg_funcs: return {"dataPath": data_path, "expression": f"{func_part}({data_path})"} + else: + return {"dataPath": data_path, "expression": func_part} def parse_calc_shorthand(s): diff --git a/tests/skills/cases/skd-edit/add-total-identity.json b/tests/skills/cases/skd-edit/add-total-identity.json new file mode 100644 index 00000000..051418c6 --- /dev/null +++ b/tests/skills/cases/skd-edit/add-total-identity.json @@ -0,0 +1,21 @@ +{ + "name": "add-total: 'X: X' — identity expression (без обёртки в Func)", + "preRun": [ + { + "script": "skd-compile/scripts/skd-compile", + "input": { + "dataSets": [{ + "name": "Основной", + "query": "ВЫБРАТЬ Т.Проверка ИЗ Регистр КАК Т", + "fields": ["Проверка: decimal(15,2)"] + }] + }, + "args": { "-DefinitionFile": "{inputFile}", "-OutputPath": "{workDir}/Template.xml" } + } + ], + "params": { + "templatePath": "Template.xml", + "operation": "add-total", + "value": "Проверка: Проверка" + } +} diff --git a/tests/skills/cases/skd-edit/snapshots/add-total-identity/Template.xml b/tests/skills/cases/skd-edit/snapshots/add-total-identity/Template.xml new file mode 100644 index 00000000..f63ec0d8 --- /dev/null +++ b/tests/skills/cases/skd-edit/snapshots/add-total-identity/Template.xml @@ -0,0 +1,49 @@ + + + + ИсточникДанных1 + Local + + + Основной + + Проверка + Проверка + + xs:decimal + + 15 + 2 + Any + + + + ИсточникДанных1 + ВЫБРАТЬ Т.Проверка ИЗ Регистр КАК Т + + + Проверка + Проверка + + + Основной + + + ru + Основной + + + + + + + + + + + + + + + +