From e7cbf306a03d98927d52611312d704291b9a2378 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 15 May 2026 15:37:56 +0300 Subject: [PATCH] =?UTF-8?q?feat(skd-edit):=20availableValue=20=E2=80=94=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D1=81=20replace-=D1=81?= =?UTF-8?q?=D0=B5=D0=BC=D0=B0=D0=BD=D1=82=D0=B8=D0=BA=D0=BE=D0=B9=20=D0=B8?= =?UTF-8?q?=20=D0=B2=20add-parameter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Единый list-синтаксис: availableValue=v1[: p1], v2[: p2], ... Элементы через запятую, представление после двоеточия. - Запятые/двоеточия внутри значений и представлений — в одинарных кавычках: availableValue=Окр1: 'руб., коп.', Окр1000: руб. - add-parameter теперь принимает availableValue= и создаёт начальный список в одном вызове (раньше требовался последующий modify-parameter). - modify-parameter availableValue=... ЗАМЕНЯЕТ весь список (раньше append). Согласуется с остальными modify-* для одиночных свойств. - SKILL.md: добавлен shorthand-шаблон для modify-parameter, расширен для add-parameter [availableValue=список]. Существующие тесты мигрированы со старого ;;-batch на новый list-синтаксис. Снапшоты сохранились (тесты стартовали с пустого списка — semantics совпадает для greenfield). Регресс: 29/29 PS, 29/29 PY, 29/29 платформенный verify. Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/skills/skd-edit/SKILL.md | 15 +- .claude/skills/skd-edit/scripts/skd-edit.ps1 | 149 +++++++++++++++--- .claude/skills/skd-edit/scripts/skd-edit.py | 124 ++++++++++++--- .../add-parameter-with-availableValue.json | 21 +++ ...dify-parameter-availableValue-replace.json | 25 +++ .../skd-edit/modify-parameter-combined.json | 2 +- .../cases/skd-edit/modify-parameter.json | 2 +- .../Template.xml | 78 +++++++++ .../Template.xml | 78 +++++++++ 9 files changed, 438 insertions(+), 56 deletions(-) create mode 100644 tests/skills/cases/skd-edit/add-parameter-with-availableValue.json create mode 100644 tests/skills/cases/skd-edit/modify-parameter-availableValue-replace.json create mode 100644 tests/skills/cases/skd-edit/snapshots/add-parameter-with-availableValue/Template.xml create mode 100644 tests/skills/cases/skd-edit/snapshots/modify-parameter-availableValue-replace/Template.xml diff --git a/.claude/skills/skd-edit/SKILL.md b/.claude/skills/skd-edit/SKILL.md index 648e7fe8..41cd2ad8 100644 --- a/.claude/skills/skd-edit/SKILL.md +++ b/.claude/skills/skd-edit/SKILL.md @@ -80,7 +80,7 @@ Shorthand: `"Имя [Заголовок]: тип = Выражение #noFilter "Организация: CatalogRef.Организации" ``` -Shorthand: `"Имя [Заголовок]: тип = значение @флаги"`. `[Заголовок]` опциональный — добавляет ``. +Shorthand: `"Имя [Заголовок]: тип = значение [availableValue=список] [@флаги]"`. `[Заголовок]` опциональный — добавляет `<title>`. Флаги: - `@autoDates` — генерирует пару скрытых параметров `ДатаНачала`/`ДатаОкончания` для StandardPeriod-параметра. @@ -91,24 +91,31 @@ Shorthand: `"Имя [Заголовок]: тип = значение @флаги" "ПС: CatalogRef.Контрагенты = Справочник.Контрагенты.ПустаяСсылка @hidden" "Период: StandardPeriod = LastMonth @always" "ПСчет: ChartOfAccountsRef.Хозрасчетный = ПланСчетов.Хозрасчетный.X @hidden @always" +"Округление: EnumRef.Округления = Окр1 availableValue=Перечисление.Округления.Окр1: руб., Перечисление.Округления.Окр1000: тыс." +``` + +`availableValue=` задаёт начальный список допустимых значений. Формат списка: `v1[: p1], v2[: p2], ...` — элементы через `,`, представление после `:`. Если в значении или представлении встречается `,` или `:` — оборачивай в одинарные кавычки `'...'`: + +``` +"Округление: ... = Окр1 availableValue=Окр1_00: 'руб., коп.', Окр1: руб." ``` ### modify-parameter — изменить существующий параметр -Находит параметр по имени, добавляет/обновляет свойства. +Shorthand: `"ИмяПараметра [Заголовок] [ключ=значение]... [@флаги]"`. Находит параметр по имени, обновляет указанные свойства. ``` "ПорядокОкругления use=Always" "ПорядокОкругления [Округление сумм] denyIncompleteValues=true" "ПериодОтчета [Отчетный период]" # только title -"ПорядокОкругления availableValue=Перечисление.Округления.Окр1 presentation=руб." +"ПорядокОкругления availableValue=Перечисление.Округления.Окр1: руб., Перечисление.Округления.Окр1000: тыс." "СчетПС value=ПланСчетов.Хозрасчетный.КассаПредприятия" "Контрагент @hidden @always" ``` `[Заголовок]` опциональный — устанавливает или заменяет `<title>`. Можно вызывать без других kv-пар, чтобы только обновить title. -`availableValue=` добавляет один элемент списка допустимых значений (можно несколько через `;;`). Тип значения определяется автоматически (DesignTimeValue для ссылок). +`availableValue=` **заменяет весь список** допустимых значений (старые удаляются). Формат и кавычки — те же, что в `add-parameter`. `value=` заменяет значение параметра (тип значения подбирается автоматически по объявленному типу параметра). diff --git a/.claude/skills/skd-edit/scripts/skd-edit.ps1 b/.claude/skills/skd-edit/scripts/skd-edit.ps1 index 924b0bc1..a6874103 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.14 — Atomic 1C DCS editor +# skd-edit v1.15 — Atomic 1C DCS editor # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -297,7 +297,13 @@ function Parse-CalcShorthand { function Parse-ParamShorthand { param([string]$s) - $result = @{ name = ""; type = ""; value = $null; autoDates = $false; title = $null; hidden = $false; always = $false } + $result = @{ name = ""; type = ""; value = $null; autoDates = $false; title = $null; hidden = $false; always = $false; availableValues = @() } + + # Extract availableValue=... (must be before main parse — captures to end of string) + if ($s -match '\s*availableValue=(.+)$') { + $result.availableValues = Parse-AvailableValueList $Matches[1].Trim() + $s = ($s -replace '\s*availableValue=.+$', '').Trim() + } if ($s -match '@autoDates') { $result.autoDates = $true @@ -626,6 +632,75 @@ function Parse-OutputParamShorthand { return @{ key = $s.Trim(); value = "" } } +function Parse-AvailableValueList { + # Returns array of @{ value=...; presentation=... } from comma-separated list. + # Items can use 'single' or "double" quotes (stripped). Quoted spans preserve commas/colons. + param([string]$s) + + $result = @() + if (-not $s) { return ,$result } + + # Tokenize by ',' respecting quoted spans + $items = @() + $buf = New-Object System.Text.StringBuilder + $inQuote = $null + for ($i = 0; $i -lt $s.Length; $i++) { + $ch = $s[$i] + if ($inQuote) { + [void]$buf.Append($ch) + if ($ch -eq $inQuote) { $inQuote = $null } + } elseif ($ch -eq "'" -or $ch -eq '"') { + $inQuote = $ch + [void]$buf.Append($ch) + } elseif ($ch -eq ',') { + $items += $buf.ToString() + [void]$buf.Clear() + } else { + [void]$buf.Append($ch) + } + } + if ($buf.Length -gt 0) { $items += $buf.ToString() } + + # For each item: split into value[:presentation], strip quotes + $stripQuotes = { + param($t) + $t = $t.Trim() + if ($t.Length -ge 2 -and (($t[0] -eq "'" -and $t[-1] -eq "'") -or ($t[0] -eq '"' -and $t[-1] -eq '"'))) { + return $t.Substring(1, $t.Length - 2) + } + return $t + } + + foreach ($raw in $items) { + $item = $raw.Trim() + if (-not $item) { continue } + + # Find first ':' outside quotes + $colonIdx = -1 + $q = $null + for ($j = 0; $j -lt $item.Length; $j++) { + $c = $item[$j] + if ($q) { + if ($c -eq $q) { $q = $null } + } elseif ($c -eq "'" -or $c -eq '"') { + $q = $c + } elseif ($c -eq ':') { + $colonIdx = $j; break + } + } + + if ($colonIdx -ge 0) { + $valPart = $item.Substring(0, $colonIdx) + $presPart = $item.Substring($colonIdx + 1) + $result += @{ value = (& $stripQuotes $valPart); presentation = (& $stripQuotes $presPart) } + } else { + $result += @{ value = (& $stripQuotes $item); presentation = "" } + } + } + + return ,$result +} + # --- 4. Build-* functions (XML fragment generators) --- function Build-ValueTypeXml { @@ -858,6 +933,26 @@ function Build-ParamValueXml { return $lines } +function Build-AvailableValueFragment { + # Returns XML lines (array) for a single <availableValue> block. + param($item, [string]$declaredType, [string]$indent) + + $lines = @() + $lines += "$indent<availableValue>" + $valueLines = Build-ParamValueXml -type $declaredType -value $item.value -indent "$indent`t" + foreach ($vl in $valueLines) { $lines += $vl } + if ($item.presentation) { + $lines += "$indent`t<presentation xsi:type=`"v8:LocalStringType`">" + $lines += "$indent`t`t<v8:item>" + $lines += "$indent`t`t`t<v8:lang>ru</v8:lang>" + $lines += "$indent`t`t`t<v8:content>$(Esc-Xml $item.presentation)</v8:content>" + $lines += "$indent`t`t</v8:item>" + $lines += "$indent`t</presentation>" + } + $lines += "$indent</availableValue>" + return $lines +} + function Build-ParamFragment { param($parsed, [string]$indent) @@ -888,6 +983,13 @@ function Build-ParamFragment { $lines += "$i`t<availableAsField>false</availableAsField>" } + if ($parsed.availableValues -and $parsed.availableValues.Count -gt 0) { + foreach ($av in $parsed.availableValues) { + $avLines = Build-AvailableValueFragment -item $av -declaredType $parsed.type -indent "$i`t" + foreach ($l in $avLines) { $lines += $l } + } + } + if ($parsed.always) { $lines += "$i`t<use>Always</use>" } @@ -1944,13 +2046,10 @@ switch ($Operation) { } } - # Process availableValue + # Process availableValue — replace whole list with new items if ($avPart) { - $avRest = $avPart -replace '^availableValue=', '' - # Parse: "Перечисление...X presentation=текст с пробелами" - $avParts = $avRest -split '\s+presentation=', 2 - $avValue = $avParts[0].Trim() - $avPresentation = if ($avParts.Count -gt 1) { $avParts[1].Trim() } else { "" } + $avRest = ($avPart -replace '^availableValue=', '').Trim() + $avItems = Parse-AvailableValueList $avRest # Detect value type: prefer declared <valueType> of the parameter, else guess from value $declaredType = "" @@ -1967,33 +2066,31 @@ switch ($Operation) { } } - $avLines = @() - $avLines += "$childIndent<availableValue>" - $valueLines = Build-ParamValueXml -type $declaredType -value $avValue -indent "$childIndent`t" - foreach ($vl in $valueLines) { $avLines += $vl } - if ($avPresentation) { - $avLines += "$childIndent`t<presentation xsi:type=`"v8:LocalStringType`">" - $avLines += "$childIndent`t`t<v8:item>" - $avLines += "$childIndent`t`t`t<v8:lang>ru</v8:lang>" - $avLines += "$childIndent`t`t`t<v8:content>$(Esc-Xml $avPresentation)</v8:content>" - $avLines += "$childIndent`t`t</v8:item>" - $avLines += "$childIndent`t</presentation>" + # Remove all existing <availableValue> elements + $toRemove = @() + foreach ($ch in $paramEl.ChildNodes) { + if ($ch.NodeType -eq 'Element' -and $ch.LocalName -eq 'availableValue' -and $ch.NamespaceURI -eq $schNs) { + $toRemove += $ch + } } - $avLines += "$childIndent</availableValue>" - $fragXml = $avLines -join "`r`n" + foreach ($el in $toRemove) { Remove-NodeWithWhitespace $el } - # Insert before first of (denyIncompleteValues, use) in document order + # Insert each new <availableValue> before (denyIncompleteValues, use) $refNode = $null foreach ($child in $paramEl.ChildNodes) { if ($child.NodeType -eq 'Element' -and ($child.LocalName -eq 'denyIncompleteValues' -or $child.LocalName -eq 'use')) { $refNode = $child; break } } - $nodes = Import-Fragment $xmlDoc $fragXml - foreach ($node in $nodes) { - Insert-BeforeElement $paramEl $node $refNode $childIndent + foreach ($av in $avItems) { + $avLines = Build-AvailableValueFragment -item $av -declaredType $declaredType -indent $childIndent + $fragXml = $avLines -join "`r`n" + $nodes = Import-Fragment $xmlDoc $fragXml + foreach ($node in $nodes) { + Insert-BeforeElement $paramEl $node $refNode $childIndent + } } - Write-Host "[OK] Parameter `"$paramName`": availableValue added" + Write-Host "[OK] Parameter `"$paramName`": availableValue set to $($avItems.Count) item(s)" } # Process @hidden / @always flags (idempotent) diff --git a/.claude/skills/skd-edit/scripts/skd-edit.py b/.claude/skills/skd-edit/scripts/skd-edit.py index 4fbfdbd5..b222f952 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.14 — Atomic 1C DCS editor (Python port) +# skd-edit v1.15 — Atomic 1C DCS editor (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -299,7 +299,13 @@ def parse_calc_shorthand(s): def parse_param_shorthand(s): - result = {"name": "", "type": "", "value": None, "autoDates": False, "title": None, "hidden": False, "always": False} + result = {"name": "", "type": "", "value": None, "autoDates": False, "title": None, "hidden": False, "always": False, "availableValues": []} + + # Extract availableValue=... (must be before main parse — captures to end of string) + m_av = re.search(r'\s*availableValue=(.+)$', s) + if m_av: + result["availableValues"] = parse_available_value_list(m_av.group(1).strip()) + s = re.sub(r'\s*availableValue=.+$', '', s).strip() if re.search(r'@autoDates', s): result["autoDates"] = True @@ -581,6 +587,80 @@ def parse_output_param_shorthand(s): return {"key": s.strip(), "value": ""} +def parse_available_value_list(s): + """Returns list of {value, presentation} from comma-separated list. + Items can use single/double quotes (stripped). Quoted spans preserve commas/colons.""" + if not s: + return [] + + # Tokenize by ',' respecting quoted spans + items = [] + buf = [] + in_quote = None + for ch in s: + if in_quote: + buf.append(ch) + if ch == in_quote: + in_quote = None + elif ch in ("'", '"'): + in_quote = ch + buf.append(ch) + elif ch == ',': + items.append("".join(buf)) + buf = [] + else: + buf.append(ch) + if buf: + items.append("".join(buf)) + + def strip_quotes(t): + t = t.strip() + if len(t) >= 2 and ((t[0] == "'" and t[-1] == "'") or (t[0] == '"' and t[-1] == '"')): + return t[1:-1] + return t + + result = [] + for raw in items: + item = raw.strip() + if not item: + continue + # Find first ':' outside quotes + colon_idx = -1 + q = None + for j, c in enumerate(item): + if q: + if c == q: + q = None + elif c in ("'", '"'): + q = c + elif c == ':': + colon_idx = j + break + if colon_idx >= 0: + val_part = item[:colon_idx] + pres_part = item[colon_idx + 1:] + result.append({"value": strip_quotes(val_part), "presentation": strip_quotes(pres_part)}) + else: + result.append({"value": strip_quotes(item), "presentation": ""}) + return result + + +def build_available_value_fragment(item, declared_type, indent): + """Return XML lines for a single <availableValue> block.""" + lines = [f"{indent}<availableValue>"] + for vl in build_param_value_xml(declared_type, item["value"], f"{indent}\t"): + lines.append(vl) + if item.get("presentation"): + lines.append(f'{indent}\t<presentation xsi:type="v8:LocalStringType">') + lines.append(f"{indent}\t\t<v8:item>") + lines.append(f"{indent}\t\t\t<v8:lang>ru</v8:lang>") + lines.append(f"{indent}\t\t\t<v8:content>{esc_xml(item['presentation'])}</v8:content>") + lines.append(f"{indent}\t\t</v8:item>") + lines.append(f"{indent}\t</presentation>") + lines.append(f"{indent}</availableValue>") + return lines + + # ── 4. Build-* functions (XML fragment generators) ────────── def build_value_type_xml(type_str, indent): @@ -797,6 +877,10 @@ def build_param_fragment(parsed, indent): lines.append(f"{i}\t<useRestriction>true</useRestriction>") lines.append(f"{i}\t<availableAsField>false</availableAsField>") + for av in parsed.get("availableValues", []) or []: + for l in build_available_value_fragment(av, parsed.get("type", ""), f"{i}\t"): + lines.append(l) + if parsed.get("always"): lines.append(f"{i}\t<use>Always</use>") @@ -1664,11 +1748,8 @@ elif operation == "modify-parameter": # Process availableValue if av_part: - av_rest = av_part[len("availableValue="):] - # Parse: "Перечисление...X presentation=текст с пробелами" - av_parts = re.split(r'\s+presentation=', av_rest, 1) - av_value = av_parts[0].strip() - av_presentation = av_parts[1].strip() if len(av_parts) > 1 else "" + av_rest = av_part[len("availableValue="):].strip() + av_items = parse_available_value_list(av_rest) # Prefer declared <valueType> of the parameter; fall back to value pattern declared_type = "" @@ -1683,29 +1764,24 @@ elif operation == "modify-parameter": declared_type = re.sub(r'^d\d+p\d+:', '', (tnode.text or "").strip()) break - av_lines = [f"{child_indent}<availableValue>"] - for vl in build_param_value_xml(declared_type, av_value, f"{child_indent}\t"): - av_lines.append(vl) - if av_presentation: - av_lines.append(f'{child_indent}\t<presentation xsi:type="v8:LocalStringType">') - av_lines.append(f"{child_indent}\t\t<v8:item>") - av_lines.append(f"{child_indent}\t\t\t<v8:lang>ru</v8:lang>") - av_lines.append(f"{child_indent}\t\t\t<v8:content>{esc_xml(av_presentation)}</v8:content>") - av_lines.append(f"{child_indent}\t\t</v8:item>") - av_lines.append(f"{child_indent}\t</presentation>") - av_lines.append(f"{child_indent}</availableValue>") - frag_xml = "\r\n".join(av_lines) + # Remove all existing <availableValue> + to_remove = [ch for ch in param_el if isinstance(ch.tag, str) and local_name(ch) == "availableValue" and etree.QName(ch.tag).namespace == SCH_NS] + for el in to_remove: + remove_node_with_whitespace(el) - # Insert before first of (denyIncompleteValues, use) in document order + # Insert each new <availableValue> before (denyIncompleteValues, use) ref_node = None for child in param_el: if isinstance(child.tag, str) and local_name(child) in ("denyIncompleteValues", "use"): ref_node = child break - nodes = import_fragment(xml_doc, frag_xml) - for node in nodes: - insert_before_element(param_el, node, ref_node, child_indent) - print(f'[OK] Parameter "{param_name}": availableValue added') + for av in av_items: + av_lines = build_available_value_fragment(av, declared_type, child_indent) + frag_xml = "\r\n".join(av_lines) + nodes = import_fragment(xml_doc, frag_xml) + for node in nodes: + insert_before_element(param_el, node, ref_node, child_indent) + print(f'[OK] Parameter "{param_name}": availableValue set to {len(av_items)} item(s)') if flag_hidden: ur_el = next((ch for ch in param_el if isinstance(ch.tag, str) and local_name(ch) == "useRestriction" and etree.QName(ch.tag).namespace == SCH_NS), None) diff --git a/tests/skills/cases/skd-edit/add-parameter-with-availableValue.json b/tests/skills/cases/skd-edit/add-parameter-with-availableValue.json new file mode 100644 index 00000000..7a4f685f --- /dev/null +++ b/tests/skills/cases/skd-edit/add-parameter-with-availableValue.json @@ -0,0 +1,21 @@ +{ + "name": "add-parameter с initial availableValue list (с запятой в кавычках)", + "preRun": [ + { + "script": "skd-compile/scripts/skd-compile", + "input": { + "dataSets": [{ + "name": "Основной", + "query": "ВЫБРАТЬ Т.Поле ИЗ Регистр КАК Т", + "fields": ["Поле: string"] + }] + }, + "args": { "-DefinitionFile": "{inputFile}", "-OutputPath": "{workDir}/Template.xml" } + } + ], + "params": { + "templatePath": "Template.xml", + "operation": "add-parameter", + "value": "Округление: EnumRef.Округления = Окр1_00 availableValue=Перечисление.Округления.Окр1_00: 'руб., коп.', Перечисление.Округления.Окр1: руб., Перечисление.Округления.Окр1000: тыс. руб." + } +} diff --git a/tests/skills/cases/skd-edit/modify-parameter-availableValue-replace.json b/tests/skills/cases/skd-edit/modify-parameter-availableValue-replace.json new file mode 100644 index 00000000..00426015 --- /dev/null +++ b/tests/skills/cases/skd-edit/modify-parameter-availableValue-replace.json @@ -0,0 +1,25 @@ +{ + "name": "modify-parameter availableValue: replace whole list (старый список удалён, новый добавлен)", + "preRun": [ + { + "script": "skd-compile/scripts/skd-compile", + "input": { + "dataSets": [{ + "name": "Основной", + "query": "ВЫБРАТЬ Т.Поле ИЗ Регистр КАК Т", + "fields": ["Поле: string"] + }] + }, + "args": { "-DefinitionFile": "{inputFile}", "-OutputPath": "{workDir}/Template.xml" } + }, + { + "script": "skd-edit/scripts/skd-edit", + "args": { "-TemplatePath": "{workDir}/Template.xml", "-Operation": "add-parameter", "-Value": "Округление: EnumRef.Округления = Окр1_00 availableValue=Перечисление.Округления.Окр1_00: ст1, Перечисление.Округления.Окр1: ст2, Перечисление.Округления.Окр1000: ст3" } + } + ], + "params": { + "templatePath": "Template.xml", + "operation": "modify-parameter", + "value": "Округление availableValue=Перечисление.Округления.Окр1: руб., Перечисление.Округления.Окр1000: тыс., Перечисление.Округления.Окр1000000: млн." + } +} diff --git a/tests/skills/cases/skd-edit/modify-parameter-combined.json b/tests/skills/cases/skd-edit/modify-parameter-combined.json index 3d393da6..8b6e9334 100644 --- a/tests/skills/cases/skd-edit/modify-parameter-combined.json +++ b/tests/skills/cases/skd-edit/modify-parameter-combined.json @@ -17,6 +17,6 @@ "params": { "templatePath": "Template.xml", "operation": "modify-parameter", - "value": "ПорядокОкругления denyIncompleteValues=true use=Always availableValue=Перечисление.Округления.Окр1_00 presentation=руб. коп ;; ПорядокОкругления availableValue=Перечисление.Округления.Окр1 presentation=руб. ;; ПорядокОкругления availableValue=Перечисление.Округления.Окр1000 presentation=тыс. руб" + "value": "ПорядокОкругления denyIncompleteValues=true use=Always availableValue=Перечисление.Округления.Окр1_00: руб. коп, Перечисление.Округления.Окр1: руб., Перечисление.Округления.Окр1000: тыс. руб" } } diff --git a/tests/skills/cases/skd-edit/modify-parameter.json b/tests/skills/cases/skd-edit/modify-parameter.json index 05309342..b4edcb5f 100644 --- a/tests/skills/cases/skd-edit/modify-parameter.json +++ b/tests/skills/cases/skd-edit/modify-parameter.json @@ -17,6 +17,6 @@ "params": { "templatePath": "Template.xml", "operation": "modify-parameter", - "value": "ПорядокОкругления use=Always ;; ПорядокОкругления denyIncompleteValues=true ;; ПорядокОкругления availableValue=Перечисление.Округления.Окр1_00 presentation=руб. коп ;; ПорядокОкругления availableValue=Перечисление.Округления.Окр1 presentation=руб." + "value": "ПорядокОкругления use=Always ;; ПорядокОкругления denyIncompleteValues=true ;; ПорядокОкругления availableValue=Перечисление.Округления.Окр1_00: руб. коп, Перечисление.Округления.Окр1: руб." } } diff --git a/tests/skills/cases/skd-edit/snapshots/add-parameter-with-availableValue/Template.xml b/tests/skills/cases/skd-edit/snapshots/add-parameter-with-availableValue/Template.xml new file mode 100644 index 00000000..86f7a758 --- /dev/null +++ b/tests/skills/cases/skd-edit/snapshots/add-parameter-with-availableValue/Template.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<DataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema" xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <dataSource> + <name>ИсточникДанных1</name> + <dataSourceType>Local</dataSourceType> + </dataSource> + <dataSet xsi:type="DataSetQuery"> + <name>Основной</name> + <field xsi:type="DataSetFieldField"> + <dataPath>Поле</dataPath> + <field>Поле</field> + <valueType> + <v8:Type>xs:string</v8:Type> + <v8:StringQualifiers> + <v8:Length>0</v8:Length> + <v8:AllowedLength>Variable</v8:AllowedLength> + </v8:StringQualifiers> + </valueType> + </field> + <dataSource>ИсточникДанных1</dataSource> + <query>ВЫБРАТЬ Т.Поле ИЗ Регистр КАК Т</query> + </dataSet> + <parameter> + <name>Округление</name> + <valueType> + <v8:Type xmlns:d5p1="http://v8.1c.ru/8.1/data/enterprise/current-config">d5p1:EnumRef.Округления</v8:Type> + </valueType> + <value xsi:type="dcscor:DesignTimeValue">Окр1_00</value> + <availableValue> + <value xsi:type="dcscor:DesignTimeValue">Перечисление.Округления.Окр1_00</value> + <presentation xsi:type="v8:LocalStringType"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>руб., коп.</v8:content> + </v8:item> + </presentation> + </availableValue> + <availableValue> + <value xsi:type="dcscor:DesignTimeValue">Перечисление.Округления.Окр1</value> + <presentation xsi:type="v8:LocalStringType"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>руб.</v8:content> + </v8:item> + </presentation> + </availableValue> + <availableValue> + <value xsi:type="dcscor:DesignTimeValue">Перечисление.Округления.Окр1000</value> + <presentation xsi:type="v8:LocalStringType"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>тыс. руб.</v8:content> + </v8:item> + </presentation> + </availableValue> + </parameter> + <settingsVariant> + <dcsset:name>Основной</dcsset:name> + <dcsset:presentation xsi:type="v8:LocalStringType"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Основной</v8:content> + </v8:item> + </dcsset:presentation> + <dcsset:settings xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows"> + <dcsset:selection> + </dcsset:selection> + <dcsset:item xsi:type="dcsset:StructureItemGroup"> + <dcsset:order> + <dcsset:item xsi:type="dcsset:OrderItemAuto" /> + </dcsset:order> + <dcsset:selection> + <dcsset:item xsi:type="dcsset:SelectedItemAuto" /> + </dcsset:selection> + </dcsset:item> + </dcsset:settings> + </settingsVariant> +</DataCompositionSchema> diff --git a/tests/skills/cases/skd-edit/snapshots/modify-parameter-availableValue-replace/Template.xml b/tests/skills/cases/skd-edit/snapshots/modify-parameter-availableValue-replace/Template.xml new file mode 100644 index 00000000..967609b0 --- /dev/null +++ b/tests/skills/cases/skd-edit/snapshots/modify-parameter-availableValue-replace/Template.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<DataCompositionSchema xmlns="http://v8.1c.ru/8.1/data-composition-system/schema" xmlns:dcscom="http://v8.1c.ru/8.1/data-composition-system/common" xmlns:dcscor="http://v8.1c.ru/8.1/data-composition-system/core" xmlns:dcsset="http://v8.1c.ru/8.1/data-composition-system/settings" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <dataSource> + <name>ИсточникДанных1</name> + <dataSourceType>Local</dataSourceType> + </dataSource> + <dataSet xsi:type="DataSetQuery"> + <name>Основной</name> + <field xsi:type="DataSetFieldField"> + <dataPath>Поле</dataPath> + <field>Поле</field> + <valueType> + <v8:Type>xs:string</v8:Type> + <v8:StringQualifiers> + <v8:Length>0</v8:Length> + <v8:AllowedLength>Variable</v8:AllowedLength> + </v8:StringQualifiers> + </valueType> + </field> + <dataSource>ИсточникДанных1</dataSource> + <query>ВЫБРАТЬ Т.Поле ИЗ Регистр КАК Т</query> + </dataSet> + <parameter> + <name>Округление</name> + <valueType> + <v8:Type xmlns:d5p1="http://v8.1c.ru/8.1/data/enterprise/current-config">d5p1:EnumRef.Округления</v8:Type> + </valueType> + <value xsi:type="dcscor:DesignTimeValue">Окр1_00</value> + <availableValue> + <value xsi:type="dcscor:DesignTimeValue">Перечисление.Округления.Окр1</value> + <presentation xsi:type="v8:LocalStringType"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>руб.</v8:content> + </v8:item> + </presentation> + </availableValue> + <availableValue> + <value xsi:type="dcscor:DesignTimeValue">Перечисление.Округления.Окр1000</value> + <presentation xsi:type="v8:LocalStringType"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>тыс.</v8:content> + </v8:item> + </presentation> + </availableValue> + <availableValue> + <value xsi:type="dcscor:DesignTimeValue">Перечисление.Округления.Окр1000000</value> + <presentation xsi:type="v8:LocalStringType"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>млн.</v8:content> + </v8:item> + </presentation> + </availableValue> + </parameter> + <settingsVariant> + <dcsset:name>Основной</dcsset:name> + <dcsset:presentation xsi:type="v8:LocalStringType"> + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Основной</v8:content> + </v8:item> + </dcsset:presentation> + <dcsset:settings xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows"> + <dcsset:selection> + </dcsset:selection> + <dcsset:item xsi:type="dcsset:StructureItemGroup"> + <dcsset:order> + <dcsset:item xsi:type="dcsset:OrderItemAuto" /> + </dcsset:order> + <dcsset:selection> + <dcsset:item xsi:type="dcsset:SelectedItemAuto" /> + </dcsset:selection> + </dcsset:item> + </dcsset:settings> + </settingsVariant> +</DataCompositionSchema>