From 5141cf546dcf70e6b18a663eac58b47113b06010 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 4 Aug 2026 12:54:43 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-info):=20=D0=B8=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=80=D1=85=D0=B8=D1=8F=20=D0=BD=D0=B5=20=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=BE=20=D1=83=20=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Строка «Иерархический: …» печаталась в ветке 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 --- .../skills/meta-info/scripts/meta-info.ps1 | 40 +-- .claude/skills/meta-info/scripts/meta-info.py | 38 +-- .../cases/meta-info/cct-hierarchical.json | 26 ++ .../ВидыСубконто.xml | 97 +++++++ .../ВидыСубконто/Ext/ObjectModule.bsl | 0 .../cct-hierarchical/Configuration.xml | 252 ++++++++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../cct-hierarchical/Languages/Русский.xml | 16 ++ 8 files changed, 450 insertions(+), 37 deletions(-) create mode 100644 tests/skills/cases/meta-info/cct-hierarchical.json create mode 100644 tests/skills/cases/meta-info/snapshots/cct-hierarchical/ChartsOfCharacteristicTypes/ВидыСубконто.xml create mode 100644 tests/skills/cases/meta-info/snapshots/cct-hierarchical/ChartsOfCharacteristicTypes/ВидыСубконто/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-info/snapshots/cct-hierarchical/Configuration.xml create mode 100644 tests/skills/cases/meta-info/snapshots/cct-hierarchical/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-info/snapshots/cct-hierarchical/Languages/Русский.xml diff --git a/.claude/skills/meta-info/scripts/meta-info.ps1 b/.claude/skills/meta-info/scripts/meta-info.ps1 index a154ae03..e7bc30ad 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.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$") { diff --git a/.claude/skills/meta-info/scripts/meta-info.py b/.claude/skills/meta-info/scripts/meta-info.py index f84a5404..02ef735c 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.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"): diff --git a/tests/skills/cases/meta-info/cct-hierarchical.json b/tests/skills/cases/meta-info/cct-hierarchical.json new file mode 100644 index 00000000..6b3e193f --- /dev/null +++ b/tests/skills/cases/meta-info/cct-hierarchical.json @@ -0,0 +1,26 @@ +{ + "name": "Иерархия выводится не только у справочника, но и у ПВХ", + "setup": "empty-config", + "preRun": [ + { + "script": "meta-compile/scripts/meta-compile", + "input": { + "type": "ChartOfCharacteristicTypes", + "name": "ВидыСубконто", + "hierarchical": true, + "valueType": "String(100)" + }, + "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" } + } + ], + "params": { "objectPath": "ChartsOfCharacteristicTypes/ВидыСубконто" }, + "args_extra": ["-Mode", "full"], + "expect": { + "stdoutContains": [ + "Иерархический:", + "Стандартные реквизиты:", + "Родитель", + "ПВХСсылка.ВидыСубконто" + ] + } +} diff --git a/tests/skills/cases/meta-info/snapshots/cct-hierarchical/ChartsOfCharacteristicTypes/ВидыСубконто.xml b/tests/skills/cases/meta-info/snapshots/cct-hierarchical/ChartsOfCharacteristicTypes/ВидыСубконто.xml new file mode 100644 index 00000000..56002c59 --- /dev/null +++ b/tests/skills/cases/meta-info/snapshots/cct-hierarchical/ChartsOfCharacteristicTypes/ВидыСубконто.xml @@ -0,0 +1,97 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + + ВидыСубконто + + + ru + Виды субконто + + + + true + false + + + xs:string + + 100 + Variable + + + true + true + 9 + Variable + 100 + WholeCharacteristicKind + true + true + AsDescription + + Auto + InDialog + false + BothWays + + ChartOfCharacteristicTypes.ВидыСубконто.StandardAttribute.Description + ChartOfCharacteristicTypes.ВидыСубконто.StandardAttribute.Code + + DontUse + Begin + Directly + DontUse + Auto + + + + + + + + + + + + + Managed + Use + + + + + + DontUse + false + false + + + + diff --git a/tests/skills/cases/meta-info/snapshots/cct-hierarchical/ChartsOfCharacteristicTypes/ВидыСубконто/Ext/ObjectModule.bsl b/tests/skills/cases/meta-info/snapshots/cct-hierarchical/ChartsOfCharacteristicTypes/ВидыСубконто/Ext/ObjectModule.bsl new file mode 100644 index 00000000..e69de29b diff --git a/tests/skills/cases/meta-info/snapshots/cct-hierarchical/Configuration.xml b/tests/skills/cases/meta-info/snapshots/cct-hierarchical/Configuration.xml new file mode 100644 index 00000000..f7387717 --- /dev/null +++ b/tests/skills/cases/meta-info/snapshots/cct-hierarchical/Configuration.xml @@ -0,0 +1,252 @@ + + + + + + UUID-002 + UUID-003 + + + UUID-004 + UUID-005 + + + UUID-006 + UUID-007 + + + UUID-008 + UUID-009 + + + UUID-010 + UUID-011 + + + UUID-012 + UUID-013 + + + UUID-014 + UUID-015 + + + + TestConfig + + + ru + TestConfig + + + + + Version8_3_24 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_24 + + + + Русский + ВидыСубконто + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-info/snapshots/cct-hierarchical/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-info/snapshots/cct-hierarchical/Ext/ClientApplicationInterface.xml new file mode 100644 index 00000000..3c1161b2 --- /dev/null +++ b/tests/skills/cases/meta-info/snapshots/cct-hierarchical/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + UUID-002 + + + + + UUID-004 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-info/snapshots/cct-hierarchical/Languages/Русский.xml b/tests/skills/cases/meta-info/snapshots/cct-hierarchical/Languages/Русский.xml new file mode 100644 index 00000000..37c60d78 --- /dev/null +++ b/tests/skills/cases/meta-info/snapshots/cct-hierarchical/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file