diff --git a/.claude/skills/skd-edit/SKILL.md b/.claude/skills/skd-edit/SKILL.md index 3d523338..24ffb3ae 100644 --- a/.claude/skills/skd-edit/SKILL.md +++ b/.claude/skills/skd-edit/SKILL.md @@ -129,6 +129,12 @@ Shorthand: `"Поле [desc]"`. По умолчанию asc. `Auto` — авто `Folder(Название: поле1, поле2)` — группа полей (SelectedItemFolder) с заголовком и `placement=Auto`. +`@group=ИмяГруппировки` — добавить в selection именованной группировки (вместо уровня варианта): + +``` +"Folder(Поступление: ПолеА, ПолеБ) @group=ДанныеОтчета" +``` + ### add-dataSetLink — добавить связь наборов данных Shorthand: `"Источник > Приёмник on ВырИсточника = ВырПриёмника [param Имя]"`. diff --git a/.claude/skills/skd-edit/scripts/skd-edit.ps1 b/.claude/skills/skd-edit/scripts/skd-edit.ps1 index 0214e0ad..f7430037 100644 --- a/.claude/skills/skd-edit/scripts/skd-edit.ps1 +++ b/.claude/skills/skd-edit/scripts/skd-edit.ps1 @@ -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" } } diff --git a/.claude/skills/skd-edit/scripts/skd-edit.py b/.claude/skills/skd-edit/scripts/skd-edit.py index dfdb3a30..3c74f62c 100644 --- a/.claude/skills/skd-edit/scripts/skd-edit.py +++ b/.claude/skills/skd-edit/scripts/skd-edit.py @@ -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()