From 510c9163e39085aec071960dff3028f58c58c06a Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 20 Sep 2026 17:53:46 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-info):=20=D0=BA=D0=B5=D0=B9=D1=81=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BC=D0=BD=D0=BE=D0=B6=D0=B5=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=BE=20=D0=B2=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=D0=BE=D0=BC=20=D1=82=D0=B8=D0=BF=D0=B5=20?= =?UTF-8?q?=E2=80=94=20=D1=84=D0=B8=D0=BA=D1=81=D1=82=D1=83=D1=80=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D0=BD=D0=B5=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=D0=B4=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit verify-snapshots отверг кейс: «ОпределяемыйТип.Любой - Недопустимый тип». Спросил платформу — v8:TypeSet внутри определяемого типа запрещён вообще, и не только AnyRef: отвергнуты также голый CatalogRef, Characteristic.X и вложенный DefinedType.X, при том что контрольный вариант с обычным CatalogRef.X принят. Замерено на 8.3.24.1691 загрузкой в базу. Отсюда и ноль таких узлов в корпусе — это не совпадение, а запрет. Комментарий в обоих портах утверждал обратное («платформа допускает») — правда записана, факт добавлен в docs/meta-dsl-spec.md. Сам разбор v8:TypeSet в выводе определяемого типа оставлен: meta-info читалка, и рукотворный файл с таким узлом она обязана показать честно, а не потерять его молча вместе с правдивым счётчиком. Кейс переведён на рукотворную фикстуру с объявленной причиной пропуска платформенной проверки. Co-Authored-By: Claude Opus 5 (1M context) --- .../skills/meta-info/scripts/meta-info.ps1 | 16 +- .claude/skills/meta-info/scripts/meta-info.py | 16 +- docs/meta-dsl-spec.md | 5 + .../meta-info/defined-type-with-typeset.json | 33 +-- .../Catalogs/Товары.xml | 91 +++++++ .../Catalogs/Товары/Ext/ObjectModule.bsl | 1 + .../Configuration.xml | 253 ++++++++++++++++++ .../DefinedTypes/Любой.xml | 25 ++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../Languages/Русский.xml | 16 ++ .../Configuration.xml | 4 +- 11 files changed, 434 insertions(+), 44 deletions(-) create mode 100644 tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Catalogs/Товары.xml create mode 100644 tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Catalogs/Товары/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Configuration.xml create mode 100644 tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/DefinedTypes/Любой.xml create mode 100644 tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Languages/Русский.xml diff --git a/.claude/skills/meta-info/scripts/meta-info.ps1 b/.claude/skills/meta-info/scripts/meta-info.ps1 index 7628e8b2a..874372c47 100644 --- a/.claude/skills/meta-info/scripts/meta-info.ps1 +++ b/.claude/skills/meta-info/scripts/meta-info.ps1 @@ -1158,9 +1158,11 @@ if (-not $drillDone) { if ($mdType -eq "DefinedType") { $typeNode2 = $props.SelectSingleNode("md:Type", $ns) if ($typeNode2) { - # Оба узла, одним XPath и в порядке документа: v8:TypeSet внутри определяемого - # типа платформа допускает, а чтение только v8:Type МОЛЧА теряло его — счётчик - # «Типы (N)» врал. + # Оба узла, одним XPath и в порядке документа. v8:TypeSet внутри определяемого + # типа платформа НЕ принимает («Недопустимый тип», замерено на 8.3.24.1691 для + # AnyRef, голого CatalogRef, Characteristic.X и вложенного DefinedType.X), + # поэтому в выгрузке его не бывает — но в рукотворном файле бывает, и тогда + # чтение только v8:Type МОЛЧА теряло узел, а счётчик «Типы (N)» врал. $types = @() foreach ($t in $typeNode2.SelectNodes("v8:Type|v8:TypeSet", $ns)) { if ($t.get_LocalName() -eq 'TypeSet') { $types += Format-SingleTypeSet $t.InnerText } @@ -1360,9 +1362,11 @@ if (-not $drillDone) { if ($mdType -eq "DefinedType") { $typeNode2 = $props.SelectSingleNode("md:Type", $ns) if ($typeNode2) { - # Оба узла, одним XPath и в порядке документа: v8:TypeSet внутри определяемого - # типа платформа допускает, а чтение только v8:Type МОЛЧА теряло его — счётчик - # «Типы (N)» врал. + # Оба узла, одним XPath и в порядке документа. v8:TypeSet внутри определяемого + # типа платформа НЕ принимает («Недопустимый тип», замерено на 8.3.24.1691 для + # AnyRef, голого CatalogRef, Characteristic.X и вложенного DefinedType.X), + # поэтому в выгрузке его не бывает — но в рукотворном файле бывает, и тогда + # чтение только v8:Type МОЛЧА теряло узел, а счётчик «Типы (N)» врал. $types = @() foreach ($t in $typeNode2.SelectNodes("v8:Type|v8:TypeSet", $ns)) { if ($t.get_LocalName() -eq 'TypeSet') { $types += Format-SingleTypeSet $t.InnerText } diff --git a/.claude/skills/meta-info/scripts/meta-info.py b/.claude/skills/meta-info/scripts/meta-info.py index 7d0dfb9de..00ea08aa9 100644 --- a/.claude/skills/meta-info/scripts/meta-info.py +++ b/.claude/skills/meta-info/scripts/meta-info.py @@ -1216,9 +1216,11 @@ if not drill_done: if md_type == "DefinedType": type_node2 = find(props, "md:Type") if type_node2 is not None: - # Оба узла, одним XPath и в порядке документа: v8:TypeSet внутри определяемого - # типа платформа допускает, а чтение только v8:Type МОЛЧА теряло его — счётчик - # «Типы (N)» врал. + # Оба узла, одним XPath и в порядке документа. v8:TypeSet внутри определяемого + # типа платформа НЕ принимает («Недопустимый тип», замерено на 8.3.24.1691 для + # AnyRef, голого CatalogRef, Characteristic.X и вложенного DefinedType.X), + # поэтому в выгрузке его не бывает — но в рукотворном файле бывает, и тогда + # чтение только v8:Type МОЛЧА теряло узел, а счётчик «Типы (N)» врал. types = [] for t in find_all(type_node2, "v8:Type|v8:TypeSet"): if local_name(t) == "TypeSet": @@ -1396,9 +1398,11 @@ if not drill_done: if md_type == "DefinedType": type_node2 = find(props, "md:Type") if type_node2 is not None: - # Оба узла, одним XPath и в порядке документа: v8:TypeSet внутри определяемого - # типа платформа допускает, а чтение только v8:Type МОЛЧА теряло его — счётчик - # «Типы (N)» врал. + # Оба узла, одним XPath и в порядке документа. v8:TypeSet внутри определяемого + # типа платформа НЕ принимает («Недопустимый тип», замерено на 8.3.24.1691 для + # AnyRef, голого CatalogRef, Characteristic.X и вложенного DefinedType.X), + # поэтому в выгрузке его не бывает — но в рукотворном файле бывает, и тогда + # чтение только v8:Type МОЛЧА теряло узел, а счётчик «Типы (N)» врал. types = [] for t in find_all(type_node2, "v8:Type|v8:TypeSet"): if local_name(t) == "TypeSet": diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index 7fc4bc892..53d11d38a 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -144,6 +144,11 @@ JSON DSL для описания объектов метаданных конф Прочие менеджеры (`CatalogManager`, `DocumentManager`, …) множеством НЕ являются: голый менеджер пишется обычным `v8:Type`. +Внутри `DefinedType` тип-множество **запрещено**: платформа отвечает «Недопустимый тип» и на +`AnyRef`, и на голый `CatalogRef`, и на `Characteristic.Xxx`, и на вложенный `DefinedType.Xxx` +(замерено на 8.3.24.1691 загрузкой в базу; контрольный вариант с обычным `CatalogRef.Xxx` принят). +Состав определяемого типа — только конкретные типы. + Вывод `meta-info` печатает голое множество с суффиксом «(все)» (`ДокументОбъект (все)`) — отличать «все» от «один» по наличию точки посреди длинного имени ненадёжно. Суффикс принимается и на входе `meta-compile`, так что строку из вывода можно подать обратно. diff --git a/tests/skills/cases/meta-info/defined-type-with-typeset.json b/tests/skills/cases/meta-info/defined-type-with-typeset.json index 9afbb7d27..f42a268fc 100644 --- a/tests/skills/cases/meta-info/defined-type-with-typeset.json +++ b/tests/skills/cases/meta-info/defined-type-with-typeset.json @@ -1,34 +1,6 @@ { - "name": "Определяемый тип содержит множество: счётчик «Типы (N)» его не теряет", - "setup": "empty-config", - "preRun": [ - { - "script": "meta-compile/scripts/meta-compile", - "input": { - "type": "Catalog", - "name": "Товары" - }, - "args": { - "-JsonPath": "{inputFile}", - "-OutputDir": "{workDir}" - } - }, - { - "script": "meta-compile/scripts/meta-compile", - "input": { - "type": "DefinedType", - "name": "Любой", - "valueTypes": [ - "CatalogRef.Товары", - "AnyRef" - ] - }, - "args": { - "-JsonPath": "{inputFile}", - "-OutputDir": "{workDir}" - } - } - ], + "name": "Множество внутри определяемого типа: счётчик «Типы (N)» его не теряет", + "setup": "fixture:defined-type-with-typeset", "params": { "objectPath": "DefinedTypes/Любой.xml" }, @@ -36,6 +8,7 @@ "-Mode", "full" ], + "skipPlatformVerify": "v8:TypeSet внутри определяемого типа платформа не принимает — «ОпределяемыйТип.Любой - Недопустимый тип», замерено на 8.3.24.1691 для AnyRef, голого CatalogRef, Characteristic.X и вложенного DefinedType.X. Фикстура собрана вручную именно поэтому: проверяем, что читалка не теряет узел молча, а такой файл бывает только рукотворным", "expect": { "stdoutContains": [ "Типы (2):", diff --git a/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Catalogs/Товары.xml b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Catalogs/Товары.xml new file mode 100644 index 000000000..f91b89a4c --- /dev/null +++ b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Catalogs/Товары.xml @@ -0,0 +1,91 @@ + + + + + + 677f6f96-b0d6-40b5-814d-a1ef5723abf5 + e02f40d7-47e9-472d-b15a-fe29ee5e95ad + + + 5ea2b1a1-b009-486c-876b-fe29bca59391 + 077bb116-6bba-4e15-85c7-a2b2b4a6cc66 + + + 9f33c2b0-aaad-4ed9-bb92-ca0824bc207d + e33c9910-db82-4beb-a145-c29555c3ea1e + + + 06b2befe-8966-4ab1-a544-d84b7be92bb2 + 24304c64-5db9-4199-b66a-65df1d850986 + + + 65fd9c64-5d98-47c3-b978-43055bde20a7 + ac4f96ba-01a8-4c31-bd1e-46b7be3257a7 + + + + Товары + + + ru + Товары + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + Auto + InDialog + false + BothWays + + Catalog.Товары.StandardAttribute.Description + Catalog.Товары.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Catalogs/Товары/Ext/ObjectModule.bsl new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Catalogs/Товары/Ext/ObjectModule.bsl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Configuration.xml b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Configuration.xml new file mode 100644 index 000000000..aca84382f --- /dev/null +++ b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Configuration.xml @@ -0,0 +1,253 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + df5deb8c-c936-4ab2-aea5-52290178a868 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + b942f0b8-d8dd-41a8-b339-d3a8a211196a + + + e3687481-0a87-462c-a166-9f34594f9bba + caa34d25-45b8-41d5-8216-abd12c24cddd + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + 3e2b4d5d-793b-4fba-9e51-673a0a110d33 + + + 51f2d5d8-ea4d-4064-8892-82951750031e + 50b65b4a-308a-4405-9482-4e271eb466bf + + + e68182ea-4237-4383-967f-90c1e3370bc7 + 806f69f6-4814-4ccb-a124-e0fe3c270ff2 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + 9defdf9f-be5f-45da-8981-11ff35a03e93 + + + + Проба + + + ru + Проба + + + + + 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/fixtures/defined-type-with-typeset/DefinedTypes/Любой.xml b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/DefinedTypes/Любой.xml new file mode 100644 index 000000000..65ab3724e --- /dev/null +++ b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/DefinedTypes/Любой.xml @@ -0,0 +1,25 @@ + + + + + + a3bcdf82-b899-42d6-92d8-cf63de3a1814 + 80aef29e-e24c-405c-9ba4-cbdb4f5dae1e + + + + Любой + + + ru + Любой + + + + + cfg:CatalogRef.Товары + cfg:AnyRef + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..41fcbc740 --- /dev/null +++ b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + cbab57f2-a0f3-4f0a-89ea-4cb19570ab75 + + + + + b553047f-c9aa-4157-978d-448ecad24248 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Languages/Русский.xml b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Languages/Русский.xml new file mode 100644 index 000000000..c6c4274a2 --- /dev/null +++ b/tests/skills/cases/meta-info/fixtures/defined-type-with-typeset/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/meta-info/snapshots/defined-type-with-typeset/Configuration.xml b/tests/skills/cases/meta-info/snapshots/defined-type-with-typeset/Configuration.xml index 0cf184f47..226b8d2fb 100644 --- a/tests/skills/cases/meta-info/snapshots/defined-type-with-typeset/Configuration.xml +++ b/tests/skills/cases/meta-info/snapshots/defined-type-with-typeset/Configuration.xml @@ -32,11 +32,11 @@ - TestConfig + Проба ru - TestConfig + Проба