diff --git a/.claude/skills/skd-edit/SKILL.md b/.claude/skills/skd-edit/SKILL.md index 62e30aa7..c62dc28c 100644 --- a/.claude/skills/skd-edit/SKILL.md +++ b/.claude/skills/skd-edit/SKILL.md @@ -163,6 +163,15 @@ Shorthand: `"Параметр = значение [when условие] [for По Не поддерживает пакетный режим. Value — полный текст запроса или `@path/to/file.sql` (ссылка на внешний файл). Путь разрешается относительно Template.xml, затем CWD. +### patch-query — точечная замена в тексте запроса + +Shorthand: `"старое => новое"`. Заменяет все вхождения подстроки. Поддерживает пакетный режим и `-DataSet`. + +``` +"СубконтоДт1) В => СубконтоКт1) В" +"ЛЕВОЕ СОЕДИНЕНИЕ => ВНУТРЕННЕЕ СОЕДИНЕНИЕ" +``` + ### set-outputParameter — установить параметр вывода ``` diff --git a/.claude/skills/skd-edit/scripts/skd-edit.ps1 b/.claude/skills/skd-edit/scripts/skd-edit.ps1 index 6aa6afe4..2f948692 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.2 — Atomic 1C DCS editor +# skd-edit v1.3 — Atomic 1C DCS editor # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -9,7 +9,7 @@ param( "add-field","add-total","add-calculated-field","add-parameter","add-filter", "add-dataParameter","add-order","add-selection","add-dataSetLink", "add-dataSet","add-variant","add-conditionalAppearance", - "set-query","set-outputParameter","set-structure", + "set-query","patch-query","set-outputParameter","set-structure", "modify-field","modify-filter","modify-dataParameter", "clear-selection","clear-order","clear-filter", "remove-field","remove-total","remove-calculated-field","remove-parameter","remove-filter")] @@ -1740,6 +1740,34 @@ switch ($Operation) { Write-Host "[OK] Query replaced in dataset `"$dsName`"" } + "patch-query" { + $dsNode = Resolve-DataSet + $dsName = Get-DataSetName $dsNode + + $queryEl = Find-FirstElement $dsNode @("query") $schNs + if (-not $queryEl) { + Write-Error "No element found in dataset '$dsName'" + exit 1 + } + + foreach ($val in $values) { + $sepIdx = $val.IndexOf(" => ") + if ($sepIdx -lt 0) { + Write-Error "patch-query value must contain ' => ' separator: old => new" + exit 1 + } + $oldStr = $val.Substring(0, $sepIdx) + $newStr = $val.Substring($sepIdx + 4) + $queryText = $queryEl.InnerText + if (-not $queryText.Contains($oldStr)) { + Write-Error "Substring not found in query of dataset '$dsName': $oldStr" + exit 1 + } + $queryEl.InnerText = $queryText.Replace($oldStr, $newStr) + Write-Host "[OK] Query patched in dataset `"$dsName`": replaced '$oldStr'" + } + } + "set-outputParameter" { $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 e1b6e1c0..ef06eccb 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.2 — Atomic 1C DCS editor (Python port) +# skd-edit v1.3 — Atomic 1C DCS editor (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -17,7 +17,7 @@ VALID_OPS = [ "add-field", "add-total", "add-calculated-field", "add-parameter", "add-filter", "add-dataParameter", "add-order", "add-selection", "add-dataSetLink", "add-dataSet", "add-variant", "add-conditionalAppearance", - "set-query", "set-outputParameter", "set-structure", + "set-query", "patch-query", "set-outputParameter", "set-structure", "modify-field", "modify-filter", "modify-dataParameter", "clear-selection", "clear-order", "clear-filter", "remove-field", "remove-total", "remove-calculated-field", "remove-parameter", "remove-filter", @@ -1488,6 +1488,27 @@ elif operation == "set-query": query_el.text = resolve_query_value(value_arg, query_base_dir) print(f'[OK] Query replaced in dataset "{ds_name}"') +elif operation == "patch-query": + ds_node = resolve_data_set() + ds_name = get_data_set_name(ds_node) + query_el = find_first_element(ds_node, ["query"], SCH_NS) + if query_el is None: + print(f"No element found in dataset '{ds_name}'", file=sys.stderr) + sys.exit(1) + for val in values: + sep_idx = val.find(" => ") + if sep_idx < 0: + print("patch-query value must contain ' => ' separator: old => new", file=sys.stderr) + sys.exit(1) + old_str = val[:sep_idx] + new_str = val[sep_idx + 4:] + query_text = query_el.text or "" + if old_str not in query_text: + print(f"Substring not found in query of dataset '{ds_name}': {old_str}", file=sys.stderr) + sys.exit(1) + query_el.text = query_text.replace(old_str, new_str) + print(f'[OK] Query patched in dataset "{ds_name}": replaced \'{old_str}\'') + elif operation == "set-outputParameter": settings = resolve_variant_settings() var_name = get_variant_name() diff --git a/docs/skd-guide.md b/docs/skd-guide.md index 39a2c021..65cb07e2 100644 --- a/docs/skd-guide.md +++ b/docs/skd-guide.md @@ -8,7 +8,7 @@ |-------|-----------|----------| | `/skd-info` | ` [-Mode] [-Name]` | Анализ структуры СКД: наборы, поля, параметры, ресурсы, варианты (11 режимов, включая full) | | `/skd-compile` | `[-DefinitionFile \| -Value ] -OutputPath ` | Генерация Template.xml из JSON DSL: наборы, поля, итоги, параметры, варианты | -| `/skd-edit` | ` -Operation -Value ""` | Точечное редактирование: 25 атомарных операций (add/set/modify/clear/remove) | +| `/skd-edit` | ` -Operation -Value ""` | Точечное редактирование: 26 атомарных операций (add/set/patch/modify/clear/remove) | | `/skd-validate` | ` [-MaxErrors 20]` | Валидация структурной корректности: ~30 проверок | ## Рабочий цикл diff --git a/tests/skills/cases/skd-edit/patch-query.json b/tests/skills/cases/skd-edit/patch-query.json new file mode 100644 index 00000000..4c9b6b77 --- /dev/null +++ b/tests/skills/cases/skd-edit/patch-query.json @@ -0,0 +1,21 @@ +{ + "name": "Точечная замена в тексте запроса", + "preRun": [ + { + "script": "skd-compile/scripts/skd-compile", + "input": { + "dataSets": [{ + "name": "Основной", + "query": "ВЫБРАТЬ 1 КАК Поле", + "fields": ["Поле"] + }] + }, + "args": { "-DefinitionFile": "{inputFile}", "-OutputPath": "{workDir}/Template.xml" } + } + ], + "params": { + "templatePath": "Template.xml", + "operation": "patch-query", + "value": "1 КАК Поле => Т.Наименование КАК Имя" + } +} diff --git a/tests/skills/cases/skd-edit/snapshots/patch-query/Template.xml b/tests/skills/cases/skd-edit/snapshots/patch-query/Template.xml new file mode 100644 index 00000000..5d81c376 --- /dev/null +++ b/tests/skills/cases/skd-edit/snapshots/patch-query/Template.xml @@ -0,0 +1,37 @@ + + + + ИсточникДанных1 + Local + + + Основной + + Поле + Поле + + ИсточникДанных1 + ВЫБРАТЬ Т.Наименование КАК Имя + + + Основной + + + ru + Основной + + + + + + + + + + + + + + + +