Split fields mode into fields, links, and totals modes

Separate concerns for cleaner output: fields shows only dataset
field tables, links shows dataset connections, totals shows
calculated fields and resources.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-02-10 18:00:30 +03:00
co-authored by Claude Opus 4.6
parent d210d21079
commit 24358f212f
2 changed files with 113 additions and 38 deletions
+33 -8
View File
@@ -1,7 +1,7 @@
--- ---
name: skd-info name: skd-info
description: Анализ структуры схемы компоновки данных 1С (СКД) — наборы, поля, параметры, варианты description: Анализ структуры схемы компоновки данных 1С (СКД) — наборы, поля, параметры, варианты
argument-hint: <TemplatePath> [-Mode overview|query|fields|params|variant] [-Name <dataset|variant>] argument-hint: <TemplatePath> [-Mode overview|query|fields|links|totals|params|variant] [-Name <dataset|variant>]
allowed-tools: allowed-tools:
- Bash - Bash
- Read - Read
@@ -24,7 +24,7 @@ allowed-tools:
| Параметр | Обязательный | По умолчанию | Описание | | Параметр | Обязательный | По умолчанию | Описание |
|--------------|:------------:|--------------|---------------------------------------------------| |--------------|:------------:|--------------|---------------------------------------------------|
| TemplatePath | да | — | Путь к Template.xml или каталогу макета | | TemplatePath | да | — | Путь к Template.xml или каталогу макета |
| Mode | нет | `overview` | Режим: `overview`, `query`, `fields`, `params`, `variant` | | Mode | нет | `overview` | Режим: `overview`, `query`, `fields`, `links`, `totals`, `params`, `variant` |
| Name | нет | — | Имя набора (query/fields) или варианта (variant) | | Name | нет | — | Имя набора (query/fields) или варианта (variant) |
| Batch | нет | `0` | Номер пакета запроса (0 = все). Только для query | | Batch | нет | `0` | Номер пакета запроса (0 = все). Только для query |
| Limit | нет | `150` | Макс. строк вывода (защита от переполнения) | | Limit | нет | `150` | Макс. строк вывода (защита от переполнения) |
@@ -43,6 +43,8 @@ powershell.exe -NoProfile -File .claude\skills\skd-info\scripts\skd-info.ps1 -Te
... -Mode query -Name ДанныеТ13 -Batch 3 ... -Mode query -Name ДанныеТ13 -Batch 3
... -Mode fields ... -Mode fields
... -Mode fields -Name НаборДанных1 ... -Mode fields -Name НаборДанных1
... -Mode links
... -Mode totals
... -Mode params ... -Mode params
... -Mode variant -Name Основной ... -Mode variant -Name Основной
... -Mode variant -Name 1 ... -Mode variant -Name 1
@@ -78,7 +80,8 @@ Variants:
Next: Next:
-Mode query query text -Mode query query text
-Mode fields field details + calculated + totals -Mode fields field tables by dataset
-Mode totals calculated fields + resources
-Mode variant -Name <N> variant structure (1..2) -Mode variant -Name <N> variant structure (1..2)
``` ```
@@ -115,17 +118,37 @@ Params: 18 (7 visible, 11 hidden): Период, Ответственный, ...
Фильтр по номеру батча: `-Batch 3` покажет только 3-й пакет. Фильтр по номеру батча: `-Batch 3` покажет только 3-й пакет.
### fields — таблица полей ### fields — таблица полей наборов данных
``` ```
=== Fields: НоменклатураСЦенами (7) === === Fields: НоменклатураСЦенами [Query] (7) ===
dataPath title role restrict format dataPath title role restrict format
Номенклатура - - - - Номенклатура - - - -
Номенклатура.Артикул "Артикул" - - - Номенклатура.Артикул "Артикул" - - -
Цена - - - ЧГ=0 Цена - - - ЧГ=0
--- calculated --- ```
Без `-Name` — поля всех наборов. С `-Name <набор>` — только указанного.
### links — связи наборов данных
```
=== Links (5) ===
РасчетНалогаНаИмущество -> СостояниеОС :
Организация -> Организация
ОсновноеСредство -> ОсновноеСредство
```
Группирует по парам наборов. Показывает поля связи и параметры.
### totals — вычисляемые поля и ресурсы
```
=== Calculated fields (3) ===
УИД = БухгалтерскиеОтчеты.ПолучитьУИДСсылкиСтрокой(Номенклатура) restrict:cond,grp,ord УИД = БухгалтерскиеОтчеты.ПолучитьУИДСсылкиСтрокой(Номенклатура) restrict:cond,grp,ord
--- totals ---
=== Resources (2) ===
Цена = Максимум(Цена) Цена = Максимум(Цена)
ПравоИнтерактивное = Максимум(ПравоИнтерактивное) [group:ОбъектМетаданных] ПравоИнтерактивное = Максимум(ПравоИнтерактивное) [group:ОбъектМетаданных]
``` ```
@@ -178,7 +201,9 @@ Output: style=ЧерноБелый groups=Separately totalsH=None totalsV=Non
- **Перед анализом отчёта**: overview для понимания структуры - **Перед анализом отчёта**: overview для понимания структуры
- **Отладка данных**: query для просмотра текста запроса - **Отладка данных**: query для просмотра текста запроса
- **Модификация полей**: fields для полного списка с ролями - **Модификация полей**: fields для списка с ролями по наборам
- **Связи между наборами**: links для полей связи и параметров
- **Формулы и ресурсы**: totals для вычисляемых полей и ресурсов
- **Программный вызов**: params для списка параметров - **Программный вызов**: params для списка параметров
- **Изменение вывода**: variant для структуры группировок и фильтров - **Изменение вывода**: variant для структуры группировок и фильтров
+80 -30
View File
@@ -1,7 +1,7 @@
param( param(
[Parameter(Mandatory=$true)] [Parameter(Mandatory=$true)]
[string]$TemplatePath, [string]$TemplatePath,
[ValidateSet("overview", "query", "fields", "params", "variant")] [ValidateSet("overview", "query", "fields", "links", "totals", "params", "variant")]
[string]$Mode = "overview", [string]$Mode = "overview",
[string]$Name, [string]$Name,
[int]$Batch = 0, [int]$Batch = 0,
@@ -498,7 +498,16 @@ if ($Mode -eq "overview") {
} elseif ($queryDsNames.Count -gt 1) { } elseif ($queryDsNames.Count -gt 1) {
$hints += "-Mode query -Name <ds> query text ($($queryDsNames -join ', '))" $hints += "-Mode query -Name <ds> query text ($($queryDsNames -join ', '))"
} }
$hints += "-Mode fields field details + calculated + totals" $hints += "-Mode fields field tables by dataset"
$linkCount = $root.SelectNodes("s:dataSetLink", $ns).Count
if ($linkCount -gt 0) {
$hints += "-Mode links dataset connections ($linkCount)"
}
$calcCount = $root.SelectNodes("s:calculatedField", $ns).Count
$totalCount = $root.SelectNodes("s:totalField", $ns).Count
if ($calcCount -gt 0 -or $totalCount -gt 0) {
$hints += "-Mode totals calculated fields + resources"
}
if ($params.Count -gt 0) { if ($params.Count -gt 0) {
$hints += "-Mode params parameter details" $hints += "-Mode params parameter details"
} }
@@ -646,22 +655,6 @@ elseif ($Mode -eq "query") {
# ============================================================ # ============================================================
elseif ($Mode -eq "fields") { elseif ($Mode -eq "fields") {
# Links (full detail)
$links = $root.SelectNodes("s:dataSetLink", $ns)
if ($links.Count -gt 0) {
$lines.Add("--- links ---")
foreach ($lnk in $links) {
$srcDs = $lnk.SelectSingleNode("s:sourceDataSet", $ns).InnerText
$dstDs = $lnk.SelectSingleNode("s:destinationDataSet", $ns).InnerText
$srcExpr = $lnk.SelectSingleNode("s:sourceExpression", $ns).InnerText
$dstExpr = $lnk.SelectSingleNode("s:destinationExpression", $ns).InnerText
$paramNode = $lnk.SelectSingleNode("s:parameter", $ns)
$paramStr = if ($paramNode) { " param=$($paramNode.InnerText)" } else { "" }
$lines.Add(" $srcDs.$srcExpr -> $dstDs.$dstExpr$paramStr")
}
$lines.Add("")
}
$dataSets = $root.SelectNodes("s:dataSet", $ns) $dataSets = $root.SelectNodes("s:dataSet", $ns)
function Show-DataSetFields($dsNode) { function Show-DataSetFields($dsNode) {
@@ -734,14 +727,9 @@ elseif ($Mode -eq "fields") {
} }
if ($Name) { if ($Name) {
# Search nested items first (Union child over Union parent)
$found = $false $found = $false
foreach ($ds in $dataSets) { foreach ($ds in $dataSets) {
$dsNameNode = $ds.SelectSingleNode("s:name", $ns)
if ($dsNameNode -and $dsNameNode.InnerText -eq $Name) {
Show-DataSetFields $ds
$found = $true
break
}
foreach ($subDs in $ds.SelectNodes("s:item", $ns)) { foreach ($subDs in $ds.SelectNodes("s:item", $ns)) {
$subNameNode = $subDs.SelectSingleNode("s:name", $ns) $subNameNode = $subDs.SelectSingleNode("s:name", $ns)
if ($subNameNode -and $subNameNode.InnerText -eq $Name) { if ($subNameNode -and $subNameNode.InnerText -eq $Name) {
@@ -752,6 +740,16 @@ elseif ($Mode -eq "fields") {
} }
if ($found) { break } if ($found) { break }
} }
if (-not $found) {
foreach ($ds in $dataSets) {
$dsNameNode = $ds.SelectSingleNode("s:name", $ns)
if ($dsNameNode -and $dsNameNode.InnerText -eq $Name) {
Show-DataSetFields $ds
$found = $true
break
}
}
}
if (-not $found) { if (-not $found) {
Write-Error "Dataset '$Name' not found" Write-Error "Dataset '$Name' not found"
exit 1 exit 1
@@ -773,15 +771,63 @@ elseif ($Mode -eq "fields") {
} }
} }
} }
}
# ============================================================
# MODE: links
# ============================================================
elseif ($Mode -eq "links") {
$links = $root.SelectNodes("s:dataSetLink", $ns)
if ($links.Count -eq 0) {
$lines.Add("(no links)")
} else {
$lines.Add("=== Links ($($links.Count)) ===")
$lines.Add("")
# Group by source->dest pair
$currentPair = ""
foreach ($lnk in $links) {
$srcDs = $lnk.SelectSingleNode("s:sourceDataSet", $ns).InnerText
$dstDs = $lnk.SelectSingleNode("s:destinationDataSet", $ns).InnerText
$srcExpr = $lnk.SelectSingleNode("s:sourceExpression", $ns).InnerText
$dstExpr = $lnk.SelectSingleNode("s:destinationExpression", $ns).InnerText
$paramNode = $lnk.SelectSingleNode("s:parameter", $ns)
$paramListNode = $lnk.SelectSingleNode("s:parameterListAllowed", $ns)
$pair = "$srcDs -> $dstDs"
if ($pair -ne $currentPair) {
if ($currentPair) { $lines.Add("") }
$lines.Add("$pair :")
$currentPair = $pair
}
$paramStr = ""
if ($paramNode) { $paramStr = " param=$($paramNode.InnerText)" }
$lines.Add(" $srcExpr -> $dstExpr$paramStr")
}
}
}
# ============================================================
# MODE: totals
# ============================================================
elseif ($Mode -eq "totals") {
# Calculated fields # Calculated fields
$calcFields = $root.SelectNodes("s:calculatedField", $ns) $calcFields = $root.SelectNodes("s:calculatedField", $ns)
if ($calcFields.Count -gt 0) { if ($calcFields.Count -gt 0) {
$lines.Add("") $lines.Add("=== Calculated fields ($($calcFields.Count)) ===")
$lines.Add("--- calculated ---")
foreach ($cf in $calcFields) { foreach ($cf in $calcFields) {
$cfPath = $cf.SelectSingleNode("s:dataPath", $ns).InnerText $cfPath = $cf.SelectSingleNode("s:dataPath", $ns).InnerText
$cfExpr = $cf.SelectSingleNode("s:expression", $ns).InnerText $cfExpr = $cf.SelectSingleNode("s:expression", $ns).InnerText
$cfTitle = $cf.SelectSingleNode("s:title", $ns)
$titleStr = ""
if ($cfTitle) {
$t = Get-MLText $cfTitle
if ($t) { $titleStr = " `"$t`"" }
}
$cfRestrict = $cf.SelectSingleNode("s:useRestriction", $ns) $cfRestrict = $cf.SelectSingleNode("s:useRestriction", $ns)
$restrictStr = "" $restrictStr = ""
if ($cfRestrict) { if ($cfRestrict) {
@@ -793,15 +839,15 @@ elseif ($Mode -eq "fields") {
} }
if ($parts.Count -gt 0) { $restrictStr = " restrict:" + ($parts -join ",") } if ($parts.Count -gt 0) { $restrictStr = " restrict:" + ($parts -join ",") }
} }
$lines.Add(" $cfPath = $cfExpr$restrictStr") $lines.Add(" $cfPath = $cfExpr$restrictStr$titleStr")
} }
$lines.Add("")
} }
# Total fields # Total fields (resources)
$totalFields = $root.SelectNodes("s:totalField", $ns) $totalFields = $root.SelectNodes("s:totalField", $ns)
if ($totalFields.Count -gt 0) { if ($totalFields.Count -gt 0) {
$lines.Add("") $lines.Add("=== Resources ($($totalFields.Count)) ===")
$lines.Add("--- totals ---")
foreach ($tf in $totalFields) { foreach ($tf in $totalFields) {
$tfPath = $tf.SelectSingleNode("s:dataPath", $ns).InnerText $tfPath = $tf.SelectSingleNode("s:dataPath", $ns).InnerText
$tfExpr = $tf.SelectSingleNode("s:expression", $ns).InnerText $tfExpr = $tf.SelectSingleNode("s:expression", $ns).InnerText
@@ -811,6 +857,10 @@ elseif ($Mode -eq "fields") {
$lines.Add(" $tfPath = $tfExpr$groupStr") $lines.Add(" $tfPath = $tfExpr$groupStr")
} }
} }
if ($calcFields.Count -eq 0 -and $totalFields.Count -eq 0) {
$lines.Add("(no calculated fields or resources)")
}
} }
# ============================================================ # ============================================================