refactor(xdto-info): легенда обозначений в выводе, а не в инструкции

Инструкция несла 14-строчный пример вывода — то самое, что модель увидит,
запустив навык, но читаемое при каждой загрузке инструкции. Та же логика,
по которой из xdto-validate убран каталог проверок.

Легенда при этом нужна: ← Имя, [значение элемента], · Пакет из вывода сами
не читаются. Поэтому она переехала в вывод и печатается только для тех
обозначений, которые в нём реально встретились — на плоском типе легенды
нет вовсе. В самом навыке уже был такой прецедент: режим списка пакетов
поясняет свои колонки прямо в выводе.

Инструкция сократилась с 99 до 77 строк.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-26 13:05:15 +03:00
co-authored by Claude Opus 5
parent 105ba67cb5
commit 1a1bbbac6f
6 changed files with 66 additions and 30 deletions
+7 -30
View File
@@ -57,38 +57,15 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/xdto-info.ps1" -Pac
Если известно только имя типа — укажи `-Name` и корень исходников: тип найдётся
по всем пакетам. При нескольких совпадениях навык покажет, где именно, чтобы уточнить.
## Как читать вывод
## Что в выводе
```
=== Тип XDTO: ПлатежныйДокумент ===
Пакет: ClientBankExchange · urn:1C.ru:ClientBankExchange
Свойства показаны так, как их предстоит заполнять в коде: тип значения — в нотации
1С и с учётом ограничений (`Строка(6)`, `Число(18,2)`), обязательность и коллекции —
флагами, для перечислимых типов перечислены допустимые значения. Непомеченное
свойство необязательно.
Свойства (11):
ИдДокумента Строка шаблон [a-fA-F0-9]{8}-…
Номер Строка(6) [обязательный]
Сумма Число(18,2) [обязательный] ← СуммаТип
Квитанция объект Квитанция
РеквизитыПлательщика объект РеквизитыПлательщика [обязательный]
Создание:
Тип = ФабрикаXDTO.Тип("urn:1C.ru:ClientBankExchange", "ПлатежныйДокумент");
Объект = ФабрикаXDTO.Создать(Тип);
```
- **Тип значения** — уже в нотации 1С, с учётом ограничений: `Строка(6)`, `Число(18,2)`.
- **`объект X`** — свойству нужно присвоить вложенный объект XDTO, а не значение.
Раскрыть его состав — `-Depth 2` и больше.
- **`[обязательный]`** — без заполнения запись XML не пройдёт. Непомеченное свойство
необязательно. `[список]` — коллекция, заполняется через `.Добавить()`;
`[до N]` — коллекция с ограничением сверху.
- **`← СуммаТип`** — исходное имя типа из схемы; слева от стрелки уже развёрнутое значение.
- **`[значение элемента]`** — свойство хранит собственное значение элемента,
остальные свойства такого типа лежат в атрибутах XML.
- Для перечислимых типов выводится список допустимых значений.
При разузловании вложенные объекты раскрываются отступом; тип из другого пакета
подписывается его именем (`· FSS_Common_01`), повторное вхождение обрывается
пометкой `(раскрыт выше)`.
Обозначения, которые сами по себе неочевидны, навык поясняет прямо в выводе —
и только те, что в нём встретились.
## Типичный workflow
@@ -491,6 +491,23 @@ function Show-PackageOverview($pkg) {
O "Следующий шаг: -Name <Тип> — структура типа для заполнения"
}
# Легенда едет вместе с выводом, а не живёт в инструкции: показываем только те
# обозначения, которые реально встретились, иначе она сама становится шумом.
function Write-Legend($rows) {
$text = ($rows | ForEach-Object { $_.Type + " " + ($_.Flags -join ",") + " " + ($_.Notes -join ",") }) -join " "
$items = @()
if ($text -match "объект ") { $items += "объект X — присвоить вложенный объект XDTO, состав раскрывает -Depth" }
if ($text -match "") { $items += "← Имя — исходный тип из схемы, слева от стрелки развёрнутое значение" }
if ($text -match "список") { $items += "список — коллекция, заполняется через .Добавить()" }
if ($text -match "до \d") { $items += "до N — коллекция с ограничением сверху" }
if ($text -match "значение элемента") { $items += "значение элемента — собственное значение узла XML" }
if ($text -match "·") { $items += "· Пакет — тип объявлен в другом пакете" }
if ($items.Count -eq 0) { return }
O ""
O "Обозначения:"
foreach ($i in $items) { O " $i" }
}
function Show-Type($pkg, [string]$typeName) {
$el = $pkg.Types[$typeName]
$kind = $el.get_LocalName()
@@ -525,6 +542,7 @@ function Show-Type($pkg, [string]$typeName) {
$own = @($rows | Where-Object { $_.Indent -eq 0 })
O "Свойства ($($own.Count)):"
Write-Rows $rows
Write-Legend $rows
O ""
O "Создание:"
O " Тип = ФабрикаXDTO.Тип(`"$($pkg.Namespace)`", `"$typeName`");"
@@ -2,6 +2,7 @@
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import os
import re
import sys
from lxml import etree
@@ -486,6 +487,31 @@ def show_package_overview(pkg):
O("Следующий шаг: -Name <Тип> — структура типа для заполнения")
# Легенда едет вместе с выводом, а не живёт в инструкции: показываем только те
# обозначения, которые реально встретились, иначе она сама становится шумом.
def write_legend(rows):
text = " ".join(r["Type"] + " " + ",".join(r["Flags"]) + " " + ",".join(r["Notes"]) for r in rows)
items = []
if "объект " in text:
items.append("объект X — присвоить вложенный объект XDTO, состав раскрывает -Depth")
if "" in text:
items.append("← Имя — исходный тип из схемы, слева от стрелки развёрнутое значение")
if "список" in text:
items.append("список — коллекция, заполняется через .Добавить()")
if re.search(r"до \d", text):
items.append("до N — коллекция с ограничением сверху")
if "значение элемента" in text:
items.append("значение элемента — собственное значение узла XML")
if "·" in text:
items.append("· Пакет — тип объявлен в другом пакете")
if not items:
return
O("")
O("Обозначения:")
for i in items:
O(" " + i)
def show_type(pkg, type_name):
el = pkg.Types[type_name]
if local(el) == "valueType":
@@ -522,6 +548,7 @@ def show_type(pkg, type_name):
own = [r for r in rows if r["Indent"] == 0]
O(f"Свойства ({len(own)}):")
write_rows(rows)
write_legend(rows)
O("")
O("Создание:")
O(f' Тип = ФабрикаXDTO.Тип("{pkg.Namespace}", "{type_name}");')
@@ -7,6 +7,10 @@
Наименование Строка [обязательный]
Потерянный объект НетТакого (пакет не найден: urn:test:отсутствует)
Обозначения:
объект X — присвоить вложенный объект XDTO, состав раскрывает -Depth
· Пакет — тип объявлен в другом пакете
Создание:
Тип = ФабрикаXDTO.Тип("urn:test:uses", "Заявка");
Объект = ФабрикаXDTO.Создать(Тип);
@@ -10,6 +10,11 @@
Ид Строка [обязательный]
__content Дата [обязательный, значение элемента]
Обозначения:
объект X — присвоить вложенный объект XDTO, состав раскрывает -Depth
список — коллекция, заполняется через .Добавить()
значение элемента — собственное значение узла XML
Создание:
Тип = ФабрикаXDTO.Тип("urn:test:nested", "Документ");
Объект = ФабрикаXDTO.Создать(Тип);
@@ -17,6 +17,11 @@
Коллекция Строка [список]
ДоТрёх Строка [обязательный, до 3]
Обозначения:
← Имя — исходный тип из схемы, слева от стрелки развёрнутое значение
список — коллекция, заполняется через .Добавить()
до N — коллекция с ограничением сверху
Создание:
Тип = ФабрикаXDTO.Тип("urn:test:types", "Платёж");
Объект = ФабрикаXDTO.Создать(Тип);