fix(meta-info): обобщённые ссылочные типы вместо сырого cfg:

Ветка 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 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-04 10:52:39 +03:00
co-authored by Claude Opus 5
parent cdf0944b2f
commit c687860535
2 changed files with 44 additions and 20 deletions
+18 -9
View File
@@ -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] }
+26 -11
View File
@@ -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: