diff --git a/.claude/skills/xdto-info/SKILL.md b/.claude/skills/xdto-info/SKILL.md index 758c2857..d6e3c30e 100644 --- a/.claude/skills/xdto-info/SKILL.md +++ b/.claude/skills/xdto-info/SKILL.md @@ -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 diff --git a/.claude/skills/xdto-info/scripts/xdto-info.ps1 b/.claude/skills/xdto-info/scripts/xdto-info.ps1 index 12965c20..60c17243 100644 --- a/.claude/skills/xdto-info/scripts/xdto-info.ps1 +++ b/.claude/skills/xdto-info/scripts/xdto-info.ps1 @@ -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`");" diff --git a/.claude/skills/xdto-info/scripts/xdto-info.py b/.claude/skills/xdto-info/scripts/xdto-info.py index d62588a3..38b350d2 100644 --- a/.claude/skills/xdto-info/scripts/xdto-info.py +++ b/.claude/skills/xdto-info/scripts/xdto-info.py @@ -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}");') diff --git a/tests/skills/cases/xdto-info/snapshots/cross-package/cross-package.txt b/tests/skills/cases/xdto-info/snapshots/cross-package/cross-package.txt index aa7883c5..d0dec5ee 100644 --- a/tests/skills/cases/xdto-info/snapshots/cross-package/cross-package.txt +++ b/tests/skills/cases/xdto-info/snapshots/cross-package/cross-package.txt @@ -7,6 +7,10 @@ Наименование Строка [обязательный] Потерянный объект НетТакого (пакет не найден: urn:test:отсутствует) +Обозначения: + объект X — присвоить вложенный объект XDTO, состав раскрывает -Depth + · Пакет — тип объявлен в другом пакете + Создание: Тип = ФабрикаXDTO.Тип("urn:test:uses", "Заявка"); Объект = ФабрикаXDTO.Создать(Тип); diff --git a/tests/skills/cases/xdto-info/snapshots/depth-anon-text/depth-anon-text.txt b/tests/skills/cases/xdto-info/snapshots/depth-anon-text/depth-anon-text.txt index 8119d784..a0361ec1 100644 --- a/tests/skills/cases/xdto-info/snapshots/depth-anon-text/depth-anon-text.txt +++ b/tests/skills/cases/xdto-info/snapshots/depth-anon-text/depth-anon-text.txt @@ -10,6 +10,11 @@ Ид Строка [обязательный] __content Дата [обязательный, значение элемента] +Обозначения: + объект X — присвоить вложенный объект XDTO, состав раскрывает -Depth + список — коллекция, заполняется через .Добавить() + значение элемента — собственное значение узла XML + Создание: Тип = ФабрикаXDTO.Тип("urn:test:nested", "Документ"); Объект = ФабрикаXDTO.Создать(Тип); diff --git a/tests/skills/cases/xdto-info/snapshots/type-notation/type-notation.txt b/tests/skills/cases/xdto-info/snapshots/type-notation/type-notation.txt index 5d256190..9b4f7c66 100644 --- a/tests/skills/cases/xdto-info/snapshots/type-notation/type-notation.txt +++ b/tests/skills/cases/xdto-info/snapshots/type-notation/type-notation.txt @@ -17,6 +17,11 @@ Коллекция Строка [список] ДоТрёх Строка [обязательный, до 3] +Обозначения: + ← Имя — исходный тип из схемы, слева от стрелки развёрнутое значение + список — коллекция, заполняется через .Добавить() + до N — коллекция с ограничением сверху + Создание: Тип = ФабрикаXDTO.Тип("urn:test:types", "Платёж"); Объект = ФабрикаXDTO.Создать(Тип);