diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index d6626da5..ed5824f6 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.5 — Compile 1C DCS from JSON +# skd-compile v1.6 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -481,6 +481,9 @@ function Parse-FilterShorthand { } elseif ($valPart -match '^\d+(\.\d+)?$') { $result.value = $valPart $result["valueType"] = "xs:decimal" + } elseif ($valPart -match '^(Перечисление|Справочник|ПланСчетов|Документ|ПланВидовХарактеристик|ПланВидовРасчета)\.') { + $result.value = $valPart + $result["valueType"] = "dcscor:DesignTimeValue" } else { $result.value = $valPart $result["valueType"] = "xs:string" @@ -1520,7 +1523,7 @@ function Emit-AppearanceValue { X "$indent`t$(Esc-Xml $actualVal)" } elseif ($actualVal -eq "true" -or $actualVal -eq "false") { X "$indent`t$actualVal" - } elseif ($key -eq "Текст" -or $key -eq "Заголовок") { + } elseif ($key -eq "Текст" -or $key -eq "Заголовок" -or $key -eq "Формат") { X "$indent`t" X "$indent`t`t" X "$indent`t`t`tru" diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index 51ee0b27..624ee429 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.5 — Compile 1C DCS from JSON +# skd-compile v1.6 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -371,6 +371,9 @@ def parse_filter_shorthand(s): elif re.match(r'^\d+(\.\d+)?$', val_part): result['value'] = val_part result['valueType'] = 'xs:decimal' + elif re.match(r'^(Перечисление|Справочник|ПланСчетов|Документ|ПланВидовХарактеристик|ПланВидовРасчета)\.', val_part): + result['value'] = val_part + result['valueType'] = 'dcscor:DesignTimeValue' else: result['value'] = val_part result['valueType'] = 'xs:string' @@ -1281,7 +1284,7 @@ def emit_appearance_value(lines, key, val, indent): lines.append(f'{indent}\t{esc_xml(actual_val)}') elif actual_val == 'true' or actual_val == 'false': lines.append(f'{indent}\t{actual_val}') - elif key == '\u0422\u0435\u043a\u0441\u0442' or key == '\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a': + elif key in ('\u0422\u0435\u043a\u0441\u0442', '\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a', '\u0424\u043e\u0440\u043c\u0430\u0442'): lines.append(f'{indent}\t') lines.append(f'{indent}\t\t') lines.append(f'{indent}\t\t\tru') diff --git a/.claude/skills/skd-edit/scripts/skd-edit.ps1 b/.claude/skills/skd-edit/scripts/skd-edit.ps1 index cd281f75..1c5beb19 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.4 — Atomic 1C DCS editor +# skd-edit v1.5 — Atomic 1C DCS editor # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -357,6 +357,9 @@ function Parse-FilterShorthand { } elseif ($valPart -match '^\d+(\.\d+)?$') { $result.value = $valPart $result["valueType"] = "xs:decimal" + } elseif ($valPart -match '^(Перечисление|Справочник|ПланСчетов|Документ|ПланВидовХарактеристик|ПланВидовРасчета)\.') { + $result.value = $valPart + $result["valueType"] = "dcscor:DesignTimeValue" } else { $result.value = $valPart $result["valueType"] = "xs:string" @@ -503,12 +506,17 @@ function Parse-ConditionalAppearanceShorthand { $result.fields = @($forPart -split '\s*,\s*' | ForEach-Object { $_.Trim() } | Where-Object { $_ }) } - # Parse "when" filter + # Parse "when" filter (supports " or " for OrGroup) if ($whenIdx -ge 0) { $whenEnd = $s.Length if ($forIdx -gt $whenIdx) { $whenEnd = $forIdx } $whenPart = $s.Substring($whenIdx + 6, $whenEnd - $whenIdx - 6).Trim() - $result.filter = Parse-FilterShorthand $whenPart + $orParts = $whenPart -split '\s+or\s+' + if ($orParts.Count -gt 1) { + $result.filter = @($orParts | ForEach-Object { Parse-FilterShorthand $_.Trim() }) + } else { + $result.filter = Parse-FilterShorthand $whenPart + } } # Parse main part: "Param = Value" @@ -973,6 +981,20 @@ function Build-VariantFragment { return $lines -join "`r`n" } +function Emit-FilterComparison { + param($f, [string]$indent) + $lines = @() + $lines += "$indent" + $lines += "$indent`t$(Esc-Xml $f.field)" + $lines += "$indent`t$(Esc-Xml $f.op)" + if ($null -ne $f.value) { + $vt = if ($f["valueType"]) { $f["valueType"] } else { "xs:string" } + $lines += "$indent`t$(Esc-Xml "$($f.value)")" + } + $lines += "$indent" + return $lines +} + function Build-ConditionalAppearanceItemFragment { param($parsed, [string]$indent) @@ -996,15 +1018,17 @@ function Build-ConditionalAppearanceItemFragment { # filter if ($parsed.filter) { $lines += "$i`t" - $f = $parsed.filter - $lines += "$i`t`t" - $lines += "$i`t`t`t$(Esc-Xml $f.field)" - $lines += "$i`t`t`t$(Esc-Xml $f.op)" - if ($null -ne $f.value) { - $vt = if ($f["valueType"]) { $f["valueType"] } else { "xs:string" } - $lines += "$i`t`t`t$(Esc-Xml "$($f.value)")" + if ($parsed.filter -is [array]) { + # OrGroup + $lines += "$i`t`t" + $lines += "$i`t`t`tOrGroup" + foreach ($f in $parsed.filter) { + $lines += Emit-FilterComparison $f "$i`t`t`t" + } + $lines += "$i`t`t" + } else { + $lines += Emit-FilterComparison $parsed.filter "$i`t`t" } - $lines += "$i`t`t" $lines += "$i`t" } else { $lines += "$i`t" @@ -1013,18 +1037,25 @@ function Build-ConditionalAppearanceItemFragment { # appearance $lines += "$i`t" - # Auto-detect value type $val = $parsed.value - $valType = "xs:string" - if ($val -match '^(web|style|win):') { - $valType = "v8ui:Color" - } elseif ($val -eq "true" -or $val -eq "false") { - $valType = "xs:boolean" - } - $lines += "$i`t`t" $lines += "$i`t`t`t$(Esc-Xml $parsed.param)" - $lines += "$i`t`t`t$(Esc-Xml $val)" + + if ($val -match '^(web|style|win):') { + $lines += "$i`t`t`t$(Esc-Xml $val)" + } elseif ($val -eq "true" -or $val -eq "false") { + $lines += "$i`t`t`t$(Esc-Xml $val)" + } elseif ($parsed.param -eq "Формат" -or $parsed.param -eq "Текст" -or $parsed.param -eq "Заголовок") { + $lines += "$i`t`t`t" + $lines += "$i`t`t`t`t" + $lines += "$i`t`t`t`t`tru" + $lines += "$i`t`t`t`t`t$(Esc-Xml $val)" + $lines += "$i`t`t`t`t" + $lines += "$i`t`t`t" + } else { + $lines += "$i`t`t`t$(Esc-Xml $val)" + } + $lines += "$i`t`t" $lines += "$i`t" diff --git a/.claude/skills/skd-edit/scripts/skd-edit.py b/.claude/skills/skd-edit/scripts/skd-edit.py index c271704c..2c596f3e 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.4 — Atomic 1C DCS editor (Python port) +# skd-edit v1.5 — Atomic 1C DCS editor (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -350,6 +350,9 @@ def parse_filter_shorthand(s): elif re.match(r'^\d+(\.\d+)?$', val_part): result["value"] = val_part result["valueType"] = "xs:decimal" + elif re.match(r'^(Перечисление|Справочник|ПланСчетов|Документ|ПланВидовХарактеристик|ПланВидовРасчета)\.', val_part): + result["value"] = val_part + result["valueType"] = "dcscor:DesignTimeValue" else: result["value"] = val_part result["valueType"] = "xs:string" @@ -480,7 +483,11 @@ def parse_conditional_appearance_shorthand(s): if for_idx > when_idx: when_end = for_idx when_part = s[when_idx + 6:when_end].strip() - result["filter"] = parse_filter_shorthand(when_part) + or_parts = re.split(r'\s+or\s+', when_part) + if len(or_parts) > 1: + result["filter"] = [parse_filter_shorthand(p.strip()) for p in or_parts] + else: + result["filter"] = parse_filter_shorthand(when_part) main_part = s[:main_end].strip() eq_idx = main_part.find("=") @@ -866,6 +873,16 @@ def build_variant_fragment(parsed, indent): return "\r\n".join(lines) +def _emit_filter_comparison(lines, f, indent): + lines.append(f'{indent}') + lines.append(f'{indent}\t{esc_xml(f["field"])}') + lines.append(f"{indent}\t{esc_xml(f['op'])}") + if f.get("value") is not None: + vt = f.get("valueType", "xs:string") + lines.append(f'{indent}\t{esc_xml(str(f["value"]))}') + lines.append(f"{indent}") + + def build_conditional_appearance_item_fragment(parsed, indent): i = indent lines = [f"{i}"] @@ -881,15 +898,17 @@ def build_conditional_appearance_item_fragment(parsed, indent): lines.append(f"{i}\t") if parsed.get("filter"): - f = parsed["filter"] + flt = parsed["filter"] lines.append(f"{i}\t") - lines.append(f'{i}\t\t') - lines.append(f'{i}\t\t\t{esc_xml(f["field"])}') - lines.append(f"{i}\t\t\t{esc_xml(f['op'])}") - if f.get("value") is not None: - vt = f.get("valueType", "xs:string") - lines.append(f'{i}\t\t\t{esc_xml(str(f["value"]))}') - lines.append(f"{i}\t\t") + if isinstance(flt, list): + # OrGroup + lines.append(f'{i}\t\t') + lines.append(f"{i}\t\t\tOrGroup") + for f in flt: + _emit_filter_comparison(lines, f, f"{i}\t\t\t") + lines.append(f"{i}\t\t") + else: + _emit_filter_comparison(lines, flt, f"{i}\t\t") lines.append(f"{i}\t") else: lines.append(f"{i}\t") @@ -897,15 +916,23 @@ def build_conditional_appearance_item_fragment(parsed, indent): # appearance lines.append(f"{i}\t") val = parsed["value"] - val_type = "xs:string" - if re.match(r'^(web|style|win):', val): - val_type = "v8ui:Color" - elif val in ("true", "false"): - val_type = "xs:boolean" - lines.append(f'{i}\t\t') lines.append(f"{i}\t\t\t{esc_xml(parsed['param'])}") - lines.append(f'{i}\t\t\t{esc_xml(val)}') + + if re.match(r'^(web|style|win):', val): + lines.append(f'{i}\t\t\t{esc_xml(val)}') + elif val in ("true", "false"): + lines.append(f'{i}\t\t\t{esc_xml(val)}') + elif parsed["param"] in ("Формат", "Текст", "Заголовок"): + lines.append(f'{i}\t\t\t') + lines.append(f"{i}\t\t\t\t") + lines.append(f"{i}\t\t\t\t\tru") + lines.append(f"{i}\t\t\t\t\t{esc_xml(val)}") + lines.append(f"{i}\t\t\t\t") + lines.append(f"{i}\t\t\t") + else: + lines.append(f'{i}\t\t\t{esc_xml(val)}') + lines.append(f"{i}\t\t") lines.append(f"{i}\t")