From 7fa279c354517fb1dced24424f11a7ef385620eb Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 15 May 2026 17:39:24 +0300 Subject: [PATCH] =?UTF-8?q?feat(skd-edit):=20clear-conditionalAppearance?= =?UTF-8?q?=20+=20multiline=20patch-query=20(=D0=B4=D0=BE=D0=BA=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Новая операция clear-conditionalAppearance в стиле clear-selection/ order/filter. Закрывает потребность "заменить набор правил оформления" через clear + re-add. - patch-query: многострочные подстроки уже работали (string.Replace корректно обрабатывает \n). Зафиксировано в SKILL.md. - add-total: shorthand-шаблон с тремя случаями (Func, Func(expr), identity-выражение) — после fix Bug 6 поведение нужно явно объяснить. - Косметика: убрана утечка XML-внутренностей в комментарии примера set-field-role @period. - Пример patch-query @once заменён на более типовой случай уникальной подстроки (КАК ВТ_СтароеИмя вместо ЛЕВОЕ СОЕДИНЕНИЕ). Регресс: 33/33 PS, 33/33 PY, 33/33 платформенный verify. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/skills/skd-edit/SKILL.md | 14 ++++-- .claude/skills/skd-edit/scripts/skd-edit.ps1 | 16 ++++++- .claude/skills/skd-edit/scripts/skd-edit.py | 14 +++++- .../skd-edit/clear-conditionalAppearance.json | 25 ++++++++++ .../clear-conditionalAppearance/Template.xml | 47 +++++++++++++++++++ 5 files changed, 108 insertions(+), 8 deletions(-) create mode 100644 tests/skills/cases/skd-edit/clear-conditionalAppearance.json create mode 100644 tests/skills/cases/skd-edit/snapshots/clear-conditionalAppearance/Template.xml diff --git a/.claude/skills/skd-edit/SKILL.md b/.claude/skills/skd-edit/SKILL.md index 751a737e..df66f4c3 100644 --- a/.claude/skills/skd-edit/SKILL.md +++ b/.claude/skills/skd-edit/SKILL.md @@ -54,9 +54,12 @@ Shorthand: `"Имя [Заголовок]: тип @роль #ограничени ### add-total — добавить итог +Shorthand: `": <выражение>"`. Если выражение — известная аггрегатная функция без скобок (`Сумма`, `Количество`, `Минимум`, `Максимум`, `Среднее`), оно автоматически оборачивается в `Func(dataPath)`. Если функция со скобками или произвольное выражение — используется как есть. + ``` -"Цена: Среднее" -"Стоимость: Сумма(Кол * Цена)" +"Цена: Среднее" # → Среднее(Цена) +"Стоимость: Сумма(Кол * Цена)" # → как есть +"Проверка: Проверка" # identity: выражение = Проверка ``` ### add-calculated-field — добавить вычисляемое поле @@ -257,11 +260,13 @@ Shorthand: `"старое => новое [@once]"`. По умолчанию за ``` "СубконтоДт1) В => СубконтоКт1) В" -"ЛЕВОЕ СОЕДИНЕНИЕ => ВНУТРЕННЕЕ СОЕДИНЕНИЕ @once" +"КАК ВТ_СтароеИмя => КАК ВТ_НовоеИмя @once" ``` `@once` — упасть с ошибкой, если в запросе не **ровно одно** вхождение. Защищает от случайных замен в комментариях и однотипных идентификаторах. +Многострочные подстроки поддерживаются — переводы строк в `старое`/`новое` сравниваются буквально (включая отступы). + ### set-outputParameter — установить параметр вывода ``` @@ -311,7 +316,7 @@ Shorthand: `" [@флаги] [kv=значение]"`. **Полност "СуммаОстаток @balance" # простая балансовая роль "СуммаНач @balance balanceGroupName=Сумма balanceType=OpeningBalance" # с уточнением "Контрагент @dimension parentDimension=Группа" -"Период @period" # period → periodNumber=1 + periodType=Main +"Период @period" # роль периода ``` Флаги: `@balance`, `@dimension`, `@account`, `@period`, `@required`, `@autoOrder`, `@ignoreNullValues`. @@ -346,6 +351,7 @@ KV: `balanceGroupName`, `balanceType` (OpeningBalance/ClosingBalance), `parentDi | `clear-selection` | `*` | Очищает все элементы selection | | `clear-order` | `*` | Очищает все элементы order | | `clear-filter` | `*` | Очищает все элементы filter | +| `clear-conditionalAppearance` | `*` | Очищает все правила условного оформления | ## Верификация diff --git a/.claude/skills/skd-edit/scripts/skd-edit.ps1 b/.claude/skills/skd-edit/scripts/skd-edit.ps1 index 357fe1ad..6ed914ea 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.17 — Atomic 1C DCS editor +# skd-edit v1.18 — Atomic 1C DCS editor # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -13,7 +13,7 @@ param( "set-query","patch-query","set-outputParameter","set-structure", "modify-field","modify-filter","modify-dataParameter","modify-parameter","modify-structure","set-field-role", "rename-parameter","reorder-parameters", - "clear-selection","clear-order","clear-filter", + "clear-selection","clear-order","clear-filter","clear-conditionalAppearance", "remove-field","remove-total","remove-calculated-field","remove-parameter","remove-filter")] [string]$Operation, @@ -2858,6 +2858,18 @@ switch ($Operation) { } } + "clear-conditionalAppearance" { + $settings = Resolve-VariantSettings + $varName = Get-VariantName + $caEl = Find-FirstElement $settings @("conditionalAppearance") $setNs + if ($caEl) { + Clear-ContainerChildren $caEl + Write-Host "[OK] ConditionalAppearance cleared in variant `"$varName`"" + } else { + Write-Host "[INFO] No conditionalAppearance section in variant `"$varName`"" + } + } + "modify-filter" { $settings = Resolve-VariantSettings $varName = Get-VariantName diff --git a/.claude/skills/skd-edit/scripts/skd-edit.py b/.claude/skills/skd-edit/scripts/skd-edit.py index c8773eb4..68565c93 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.17 — Atomic 1C DCS editor (Python port) +# skd-edit v1.18 — Atomic 1C DCS editor (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -20,7 +20,7 @@ VALID_OPS = [ "set-query", "patch-query", "set-outputParameter", "set-structure", "modify-field", "modify-filter", "modify-dataParameter", "modify-parameter", "modify-structure", "set-field-role", "rename-parameter", "reorder-parameters", - "clear-selection", "clear-order", "clear-filter", + "clear-selection", "clear-order", "clear-filter", "clear-conditionalAppearance", "remove-field", "remove-total", "remove-calculated-field", "remove-parameter", "remove-filter", ] @@ -2380,6 +2380,16 @@ elif operation == "clear-filter": else: print(f'[INFO] No filter section in variant "{var_name}"') +elif operation == "clear-conditionalAppearance": + settings = resolve_variant_settings() + var_name = get_variant_name() + ca_el = find_first_element(settings, ["conditionalAppearance"], SET_NS) + if ca_el is not None: + clear_container_children(ca_el) + print(f'[OK] ConditionalAppearance cleared in variant "{var_name}"') + else: + print(f'[INFO] No conditionalAppearance section in variant "{var_name}"') + elif operation == "modify-filter": settings = resolve_variant_settings() var_name = get_variant_name() diff --git a/tests/skills/cases/skd-edit/clear-conditionalAppearance.json b/tests/skills/cases/skd-edit/clear-conditionalAppearance.json new file mode 100644 index 00000000..74b4dde3 --- /dev/null +++ b/tests/skills/cases/skd-edit/clear-conditionalAppearance.json @@ -0,0 +1,25 @@ +{ + "name": "clear-conditionalAppearance: очистить все правила оформления варианта", + "preRun": [ + { + "script": "skd-compile/scripts/skd-compile", + "input": { + "dataSets": [{ + "name": "Основной", + "query": "ВЫБРАТЬ Т.Сумма ИЗ Регистр КАК Т", + "fields": ["Сумма: decimal(15,2)"] + }] + }, + "args": { "-DefinitionFile": "{inputFile}", "-OutputPath": "{workDir}/Template.xml" } + }, + { + "script": "skd-edit/scripts/skd-edit", + "args": { "-TemplatePath": "{workDir}/Template.xml", "-Operation": "add-conditionalAppearance", "-Value": "ЦветТекста = web:Red when Сумма < 0 ;; ЦветФона = web:LightGreen when Сумма > 1000" } + } + ], + "params": { + "templatePath": "Template.xml", + "operation": "clear-conditionalAppearance", + "value": "*" + } +} diff --git a/tests/skills/cases/skd-edit/snapshots/clear-conditionalAppearance/Template.xml b/tests/skills/cases/skd-edit/snapshots/clear-conditionalAppearance/Template.xml new file mode 100644 index 00000000..62b2beb1 --- /dev/null +++ b/tests/skills/cases/skd-edit/snapshots/clear-conditionalAppearance/Template.xml @@ -0,0 +1,47 @@ + + + + ИсточникДанных1 + Local + + + Основной + + Сумма + Сумма + + xs:decimal + + 15 + 2 + Any + + + + ИсточникДанных1 + ВЫБРАТЬ Т.Сумма ИЗ Регистр КАК Т + + + Основной + + + ru + Основной + + + + + + + + + + + + + + + + + +