From c687860535e930ee5e5254a80cb3444939468eab Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 4 Aug 2026 10:52:39 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-info):=20=D0=BE=D0=B1=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D1=91=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=81=D1=81=D1=8B=D0=BB?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D1=8B=D0=B5=20=D1=82=D0=B8=D0=BF=D1=8B=20?= =?UTF-8?q?=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D1=81=D1=8B=D1=80=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20cfg:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ветка TypeSet в Format-Type распознавала только DefinedType и Characteristic, а остальные наборы отдавала в вывод как есть. Голое имя метатипа без «.Имя» означает все ссылки этого класса (docs/meta-dsl-spec.md), и такие типы печатались сырыми — 254 вхождения в 82 строках на корпусе acc/erp/ut/unf: ЗначениеПустойСсылки cfg:ExchangePlanRef | cfg:BusinessProcessRef | … Свойство1 Булево | Строка(128) | ДатаВремя | cfg:AnyIBRef Разбор вынесен в Format-SingleTypeSet: AnyRef → ЛюбаяСсылка, AnyIBRef → ЛюбаяСсылкаИБ, голые XxxRef — через существующий refTypeMap. Конкретный тип всегда пишется с точкой, поэтому «СправочникСсылка» без точки однозначно читается как обобщённый. Co-Authored-By: Claude Opus 5 --- .../skills/meta-info/scripts/meta-info.ps1 | 27 +++++++++----- .claude/skills/meta-info/scripts/meta-info.py | 37 +++++++++++++------ 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/.claude/skills/meta-info/scripts/meta-info.ps1 b/.claude/skills/meta-info/scripts/meta-info.ps1 index c61a8cae..5944acae 100644 --- a/.claude/skills/meta-info/scripts/meta-info.ps1 +++ b/.claude/skills/meta-info/scripts/meta-info.ps1 @@ -1,4 +1,4 @@ -# meta-info v1.5 — Compact summary of 1C metadata object +# meta-info v1.6 — Compact summary of 1C metadata object # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory=$true)][Alias('Path')][string]$ObjectPath, @@ -170,6 +170,22 @@ function Get-MLText($node) { return "" } +# Тип-множество: голое имя метатипа без `.Имя` означает ВСЕ ссылки этого класса +# (см. docs/meta-dsl-spec.md §«Тип-множество»). Конкретный тип всегда пишется с точкой, +# поэтому «СправочникСсылка» без точки читается однозначно как обобщённый. +function Format-SingleTypeSet([string]$raw) { + $raw = $raw -replace '^d\d+p\d+:', 'cfg:' + if ($raw -match '^cfg:DefinedType\.(.+)$') { return "ОпределяемыйТип.$($Matches[1])" } + if ($raw -match '^cfg:Characteristic\.(.+)$') { return "Характеристика.$($Matches[1])" } + if ($raw -eq 'cfg:AnyRef') { return "ЛюбаяСсылка" } + if ($raw -eq 'cfg:AnyIBRef') { return "ЛюбаяСсылкаИБ" } + if ($raw -match '^cfg:(\w+Ref)$' -and $refTypeMap.ContainsKey($Matches[1])) { + return $refTypeMap[$Matches[1]] + } + if ($raw -match '^cfg:(.+)$') { return $Matches[1] } + return $raw +} + function Format-Type($typeNode) { if (-not $typeNode) { return "" } $types = @() @@ -178,14 +194,7 @@ function Format-Type($typeNode) { $types += Format-SingleType $raw $typeNode } foreach ($t in $typeNode.SelectNodes("v8:TypeSet", $ns)) { - $raw = $t.InnerText - if ($raw -match '^cfg:DefinedType\.(.+)$') { - $types += "ОпределяемыйТип.$($Matches[1])" - } elseif ($raw -match '^cfg:Characteristic\.(.+)$') { - $types += "Характеристика.$($Matches[1])" - } else { - $types += $raw - } + $types += Format-SingleTypeSet $t.InnerText } if ($types.Count -eq 0) { return "" } if ($types.Count -eq 1) { return $types[0] } diff --git a/.claude/skills/meta-info/scripts/meta-info.py b/.claude/skills/meta-info/scripts/meta-info.py index 3122f905..47391aa5 100644 --- a/.claude/skills/meta-info/scripts/meta-info.py +++ b/.claude/skills/meta-info/scripts/meta-info.py @@ -1,4 +1,4 @@ -# meta-info v1.5 — Compact summary of 1C metadata object (Python port) +# meta-info v1.6 — Compact summary of 1C metadata object (Python port) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import os @@ -227,6 +227,30 @@ def get_ml_text(node): return "" +# Тип-множество: голое имя метатипа без `.Имя` означает ВСЕ ссылки этого класса +# (см. docs/meta-dsl-spec.md §«Тип-множество»). Конкретный тип всегда пишется с точкой, +# поэтому «СправочникСсылка» без точки читается однозначно как обобщённый. +def format_single_type_set(raw): + raw = re.sub(r'^d\d+p\d+:', 'cfg:', raw) + m = re.match(r'^cfg:DefinedType\.(.+)$', raw) + if m: + return f"ОпределяемыйТип.{m.group(1)}" + m = re.match(r'^cfg:Characteristic\.(.+)$', raw) + if m: + return f"Характеристика.{m.group(1)}" + if raw == "cfg:AnyRef": + return "ЛюбаяСсылка" + if raw == "cfg:AnyIBRef": + return "ЛюбаяСсылкаИБ" + m = re.match(r'^cfg:(\w+Ref)$', raw) + if m and m.group(1) in ref_type_map: + return ref_type_map[m.group(1)] + m = re.match(r'^cfg:(.+)$', raw) + if m: + return m.group(1) + return raw + + def format_type(type_node_el): if type_node_el is None: return "" @@ -234,16 +258,7 @@ def format_type(type_node_el): for t in find_all(type_node_el, "v8:Type"): types.append(format_single_type(inner_text(t), type_node_el)) for t in find_all(type_node_el, "v8:TypeSet"): - raw = inner_text(t) - m = re.match(r'^cfg:DefinedType\.(.+)$', raw) - if m: - types.append(f"ОпределяемыйТип.{m.group(1)}") - continue - m = re.match(r'^cfg:Characteristic\.(.+)$', raw) - if m: - types.append(f"Характеристика.{m.group(1)}") - continue - types.append(raw) + types.append(format_single_type_set(inner_text(t))) if len(types) == 0: return "" if len(types) == 1: