From cdba298e86b6f030afa6e383b775d73b8bffcaee Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Mon, 6 Jul 2026 19:04:20 +0300 Subject: [PATCH] =?UTF-8?q?test(meta-compile,verify-snapshots):=20=D0=9F?= =?UTF-8?q?=D0=92=D0=A5=20chart-of-characteristic-types=20=E2=80=94=20?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=BD=D1=8B=D0=B9=20=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BF.=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20(cert?= =?UTF-8?q?-=D1=84=D0=B8=D0=BA=D1=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Кейс был семантически невалиден и не грузился в 1С (падал db-load-xml на чистом HEAD): предопределённый «Цвет» имел тип CatalogRef.ЗначенияСвойств, которого НЕТ в типе значения ПВХ, а стаб-справочник был плоский (не подчинён ПВХ, не указан в CharacteristicExtValues). Фикс (по образцу реального ВидыСубконтоХозрасчетные→Catalog.Субконто): - getStructuralDeps: ветка ChartOfCharacteristicTypes — справочник CharacteristicExtValues стабится ПОДЧИНЁННЫМ ПВХ (owners=[ChartOfCharacteristicTypes.X]), а не плоским. - Кейс: +CatalogRef.ЗначенияСвойств в valueTypes (тип предопределённого входит в тип значения ПВХ), +characteristicExtValues: "Catalog.ЗначенияСвойств". Cert ✓ (db-load-xml + db-update). Регресс 49/49 ps1+py. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../chart-of-characteristic-types.json | 3 ++- .../ДополнительныеРеквизитыИСведения.xml | 3 ++- tests/skills/verify-snapshots.mjs | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/skills/cases/meta-compile/chart-of-characteristic-types.json b/tests/skills/cases/meta-compile/chart-of-characteristic-types.json index 46952bb8..417060b8 100644 --- a/tests/skills/cases/meta-compile/chart-of-characteristic-types.json +++ b/tests/skills/cases/meta-compile/chart-of-characteristic-types.json @@ -5,7 +5,8 @@ "name": "ДополнительныеРеквизитыИСведения", "descriptionLength": 100, "hierarchical": true, - "valueTypes": ["String(200)", "Number(15,2)", "Boolean", "Date"], + "valueTypes": ["String(200)", "Number(15,2)", "Boolean", "Date", "CatalogRef.ЗначенияСвойств"], + "characteristicExtValues": "Catalog.ЗначенияСвойств", "standardAttributes": { "Description": { "synonym": "Свойство" } }, "attributes": ["НаборСвойств: String(100)"], "predefined": [ diff --git a/tests/skills/cases/meta-compile/snapshots/chart-of-characteristic-types/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения.xml b/tests/skills/cases/meta-compile/snapshots/chart-of-characteristic-types/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения.xml index 322dd164..97633403 100644 --- a/tests/skills/cases/meta-compile/snapshots/chart-of-characteristic-types/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения.xml +++ b/tests/skills/cases/meta-compile/snapshots/chart-of-characteristic-types/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения.xml @@ -38,7 +38,7 @@ true false - + Catalog.ЗначенияСвойств xs:string @@ -56,6 +56,7 @@ Date + d5p1:CatalogRef.ЗначенияСвойств true true diff --git a/tests/skills/verify-snapshots.mjs b/tests/skills/verify-snapshots.mjs index fa58d777..42f17036 100644 --- a/tests/skills/verify-snapshots.mjs +++ b/tests/skills/verify-snapshots.mjs @@ -184,6 +184,20 @@ function getStructuralDeps(input) { } } break; + case 'ChartOfCharacteristicTypes': + // Доп. значения характеристик (CharacteristicExtValues) — ссылка на справочник, ПОДЧИНЁННЫЙ этому ПВХ + // (Owner = ChartOfCharacteristicTypes.X). 1С требует такой справочник для целостности; плоский стаб не годится + // (тип предопределённых должен входить в тип значения ПВХ, а справочник — быть подчинён). Стабим с Owner. + if (inp.characteristicExtValues) { + const ref = String(inp.characteristicExtValues); + const dot = ref.indexOf('.'); + const cn = dot >= 0 ? ref.substring(dot + 1) : ref; + deps.push({ + type: 'Catalog', name: cn, + dsl: { type: 'Catalog', name: cn, owners: [`ChartOfCharacteristicTypes.${inp.name}`] }, + }); + } + break; case 'DocumentJournal': if (inp.registeredDocuments) { for (const docRef of inp.registeredDocuments) {