feat(skd-edit): add-selection @group= targets named StructureItemGroup

- add-selection supports @group=Name to add selection items to a named grouping instead of variant level
- Finds StructureItemGroup by dcsset:name, falls back to variant level if not found
- Document @group= in SKILL.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-04-06 19:35:07 +03:00
parent 17afd807d2
commit 6404016afb
3 changed files with 59 additions and 4 deletions
+6
View File
@@ -129,6 +129,12 @@ Shorthand: `"Поле [desc]"`. По умолчанию asc. `Auto` — авто
`Folder(Название: поле1, поле2)` — группа полей (SelectedItemFolder) с заголовком и `placement=Auto`.
`@group=ИмяГруппировки` — добавить в selection именованной группировки (вместо уровня варианта):
```
"Folder(Поступление: ПолеА, ПолеБ) @group=ДанныеОтчета"
```
### add-dataSetLink — добавить связь наборов данных
Shorthand: `"Источник > Приёмник on ВырИсточника = ВырПриёмника [param Имя]"`.
+26 -2
View File
@@ -1882,8 +1882,31 @@ switch ($Operation) {
foreach ($val in $values) {
$fieldName = $val.Trim()
$groupName = $null
$selection = Ensure-SettingsChild $settings "selection" @()
# Extract @group=Name
if ($fieldName -match '\s*@group=(\S+)') {
$groupName = $Matches[1]
$fieldName = ($fieldName -replace '\s*@group=\S+', '').Trim()
}
if ($groupName) {
# Find named StructureItemGroup
$dcssetNs = "http://v8.1c.ru/8.1/data-composition-system/settings"
$nsMgr = New-Object System.Xml.XmlNamespaceManager($xmlDoc.NameTable)
$nsMgr.AddNamespace("dcsset", $dcssetNs)
$groupEl = $settings.SelectSingleNode(".//dcsset:item[@xsi:type='dcsset:StructureItemGroup'][dcsset:name='$groupName']", $nsMgr)
if (-not $groupEl) {
Write-Host "[WARN] StructureItemGroup `"$groupName`" not found — adding to variant level"
$targetEl = $settings
} else {
$targetEl = $groupEl
}
} else {
$targetEl = $settings
}
$selection = Ensure-SettingsChild $targetEl "selection" @()
$selIndent = Get-ContainerChildIndent $selection
$selXml = Build-SelectionItemFragment -fieldName $fieldName -indent $selIndent
@@ -1892,7 +1915,8 @@ switch ($Operation) {
Insert-BeforeElement $selection $node $null $selIndent
}
Write-Host "[OK] Selection `"$fieldName`" added to variant `"$varName`""
$target = if ($groupName) { "group `"$groupName`"" } else { "variant `"$varName`"" }
Write-Host "[OK] Selection `"$fieldName`" added to $target"
}
}
+27 -2
View File
@@ -1594,13 +1594,38 @@ elif operation == "add-selection":
var_name = get_variant_name()
for val in values:
field_name = val.strip()
selection = ensure_settings_child(settings, "selection", [])
group_name = None
# Extract @group=Name
gm = re.search(r'\s*@group=(\S+)', field_name)
if gm:
group_name = gm.group(1)
field_name = re.sub(r'\s*@group=\S+', '', field_name).strip()
if group_name:
# Find named StructureItemGroup
target_el = None
for item in settings.iter(f"{{{SET_NS}}}item"):
xsi_type = item.get(f"{{{XSI_NS}}}type", "")
if "StructureItemGroup" in xsi_type:
name_el = item.find(f"{{{SET_NS}}}name")
if name_el is not None and name_el.text == group_name:
target_el = item
break
if target_el is None:
print(f'[WARN] StructureItemGroup "{group_name}" not found -- adding to variant level')
target_el = settings
else:
target_el = settings
selection = ensure_settings_child(target_el, "selection", [])
sel_indent = get_container_child_indent(selection)
sel_xml = build_selection_item_fragment(field_name, sel_indent)
sel_nodes = import_fragment(xml_doc, sel_xml)
for node in sel_nodes:
insert_before_element(selection, node, None, sel_indent)
print(f'[OK] Selection "{field_name}" added to variant "{var_name}"')
target = f'group "{group_name}"' if group_name else f'variant "{var_name}"'
print(f'[OK] Selection "{field_name}" added to {target}')
elif operation == "set-query":
ds_node = resolve_data_set()