fix(meta-info): иерархия не только у справочника

Строка «Иерархический: …» печаталась в ветке Catalog, хотя свойство
Hierarchical есть и у планов видов характеристик — в корпусе acc/erp/ut/unf
таких 13. У них иерархия не выводилась ни в overview, ни в full.

Хуже того, вывод противоречил сам себе: блок стандартных реквизитов в full
показывал Родитель (он определяется по тому же Hierarchical), а строки про
иерархию рядом не было — родитель появлялся ниоткуда.

Иерархия вынесена из ветки Catalog и печатается по наличию свойства;
подчинение осталось специфичным для справочника. Отсутствие иерархии
по-прежнему не печатается: сообщаем о наличии, молчим об отсутствии —
тихую ошибку в коде даёт только необнаруженное наличие.

Свойство Hierarchical проверено по корпусу: оно есть только у Catalog и
ChartOfCharacteristicTypes (у плана счетов иерархия по природе, свойства нет).
Прогон по корпусу: ровно 13 изменённых строк, побочных эффектов нет.

Находка из отклонённого PR #59 — там иерархия тоже была вынесена из ветки
Catalog. Реализация не заимствована: PR печатал «Иерархический: нет» для
неиерархических объектов, то есть строку-шум примерно у 4000 объектов.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-04 12:54:43 +03:00
co-authored by Claude Opus 5
parent 66807e02c7
commit 5141cf546d
8 changed files with 450 additions and 37 deletions
+21 -19
View File
@@ -1,4 +1,4 @@
# meta-info v1.7 — Compact summary of 1C metadata object
# meta-info v1.8 — Compact summary of 1C metadata object
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory=$true)][Alias('Path')][string]$ObjectPath,
@@ -1097,24 +1097,26 @@ if (-not $drillDone) {
if ($parts.Count -gt 0) { Out ($parts -join " | ") }
}
# Catalog-specific header properties
if ($mdType -eq "Catalog") {
$parts = @()
$hier = $props.SelectSingleNode("md:Hierarchical", $ns)
if ($hier -and $hier.InnerText -eq "true") {
$ht = $props.SelectSingleNode("md:HierarchyType", $ns)
$htText = if ($ht -and $ht.InnerText -eq "HierarchyFoldersAndItems") { "группы и элементы" } else { "элементы" }
$limitNode = $props.SelectSingleNode("md:LimitLevelCount", $ns)
$levelNode = $props.SelectSingleNode("md:LevelCount", $ns)
if ($limitNode -and $limitNode.InnerText -eq "true" -and $levelNode) {
$htText += ", уровней: $($levelNode.InnerText)"
} else {
$htText += ", без ограничения уровней"
}
$parts += "Иерархический: $htText"
# Свойства иерархии и подчинения. Иерархия — не только у справочников: свойство
# Hierarchical есть и у ПВХ (в корпусе acc/erp/ut/unf их 13), а без этой строки
# в full появлялся Родитель, происхождение которого было ниоткуда не видно.
$parts = @()
$hier = $props.SelectSingleNode("md:Hierarchical", $ns)
if ($hier -and $hier.InnerText -eq "true") {
$ht = $props.SelectSingleNode("md:HierarchyType", $ns)
$htText = if ($ht -and $ht.InnerText -eq "HierarchyFoldersAndItems") { "группы и элементы" } else { "элементы" }
$limitNode = $props.SelectSingleNode("md:LimitLevelCount", $ns)
$levelNode = $props.SelectSingleNode("md:LevelCount", $ns)
if ($limitNode -and $limitNode.InnerText -eq "true" -and $levelNode) {
$htText += ", уровней: $($levelNode.InnerText)"
} else {
$htText += ", без ограничения уровней"
}
# Код и Наименование уехали в блок стандартных реквизитов — здесь только свойства объекта.
# Подчинение печатаем лишь когда оно отличается от дефолта ToItems.
$parts += "Иерархический: $htText"
}
# Код и Наименование уехали в блок стандартных реквизитов — здесь только свойства объекта.
# Подчинение печатаем лишь когда оно отличается от дефолта ToItems.
if ($mdType -eq "Catalog") {
$sub = $props.SelectSingleNode("md:SubordinationUse", $ns)
if ($sub -and $sub.InnerText -ne "ToItems") {
$subRu = switch ($sub.InnerText) {
@@ -1124,8 +1126,8 @@ if (-not $drillDone) {
}
$parts += "Подчинение: $subRu"
}
if ($parts.Count -gt 0) { Out ($parts -join " | ") }
}
if ($parts.Count -gt 0) { Out ($parts -join " | ") }
# Register-specific header properties
if ($mdType -match "Register$") {
+20 -18
View File
@@ -1,4 +1,4 @@
# meta-info v1.7 — Compact summary of 1C metadata object (Python port)
# meta-info v1.8 — Compact summary of 1C metadata object (Python port)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
import os
@@ -1125,29 +1125,31 @@ if not drill_done:
if parts:
out(" | ".join(parts))
# Catalog-specific header
# Свойства иерархии и подчинения. Иерархия — не только у справочников: свойство
# Hierarchical есть и у ПВХ (в корпусе acc/erp/ut/unf их 13), а без этой строки
# в full появлялся Родитель, происхождение которого было ниоткуда не видно.
parts = []
hier = find(props, "md:Hierarchical")
if hier is not None and inner_text(hier) == "true":
ht = find(props, "md:HierarchyType")
ht_text = "группы и элементы" if ht is not None and inner_text(ht) == "HierarchyFoldersAndItems" else "элементы"
limit_node = find(props, "md:LimitLevelCount")
level_node = find(props, "md:LevelCount")
if limit_node is not None and inner_text(limit_node) == "true" and level_node is not None:
ht_text += f", уровней: {inner_text(level_node)}"
else:
ht_text += ", без ограничения уровней"
parts.append(f"Иерархический: {ht_text}")
# Код и Наименование уехали в блок стандартных реквизитов — здесь только свойства объекта.
# Подчинение печатаем лишь когда оно отличается от дефолта ToItems.
if md_type == "Catalog":
parts = []
hier = find(props, "md:Hierarchical")
if hier is not None and inner_text(hier) == "true":
ht = find(props, "md:HierarchyType")
ht_text = "группы и элементы" if ht is not None and inner_text(ht) == "HierarchyFoldersAndItems" else "элементы"
limit_node = find(props, "md:LimitLevelCount")
level_node = find(props, "md:LevelCount")
if limit_node is not None and inner_text(limit_node) == "true" and level_node is not None:
ht_text += f", уровней: {inner_text(level_node)}"
else:
ht_text += ", без ограничения уровней"
parts.append(f"Иерархический: {ht_text}")
# Код и Наименование уехали в блок стандартных реквизитов — здесь только свойства объекта.
# Подчинение печатаем лишь когда оно отличается от дефолта ToItems.
sub = find(props, "md:SubordinationUse")
if sub is not None and inner_text(sub) != "ToItems":
sub_ru = {"ToFolders": "группам", "ToFoldersAndItems": "группам и элементам"}.get(
inner_text(sub), inner_text(sub))
parts.append(f"Подчинение: {sub_ru}")
if parts:
out(" | ".join(parts))
if parts:
out(" | ".join(parts))
# Register-specific header
if md_type.endswith("Register"):