From 4b6c3faa1d79f72330658ed339b0200d815f0575 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 1 Aug 2026 20:30:51 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-compile):=20=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=D0=B8=D0=B4=D0=B0=20"=D0=94=D0=BE=D0=BA?= =?UTF-8?q?=D1=83=D0=BC=D0=B5=D0=BD=D1=82.=D0=98=D0=BC=D1=8F"=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D1=81=D1=82=D0=B0=D0=BB=D0=B0=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=BB=D1=87=D0=B0=20=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=D1=81=D1=8F=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=BE?= =?UTF-8?q?=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Значением параметра выбора и значения заполнения бывает ЗНАЧЕНИЕ — пустая ссылка, предопределённый элемент или значение перечисления. Объект метаданных значением быть не может, поэтому двухчастное "Тип.Имя" — это строка. Правило уже существовало, но только для перечислений ("Enum.X" не значение); для остальных корней его не было, и строка "Документ.РеализацияТоваровУслуг" превращалась в xr:DesignTimeRef с переводом имени на английский — молчаливая подмена смысла: вместо текста получалась ссылка на реальный документ. Проверка по корпусу (acc+erp+ut): 5520 значений в ChoiceParameters и 8623 в FillValue — двухчастных с типом метаданных НЕТ ни одного. Прощающий ввод не пострадал: "Справочник.Номенклатура.ПустаяСсылка" -> Catalog.Номенклатура.EmptyRef, "Перечисление.X.Y" -> Enum.X.EnumValue.Y работают как раньше (закреплено кейсом). Проверка: УТ tier-1 1283 -> 1282 совпадения, справочники 519/519, сюита 76/76 на обоих портах, 1С-сертификация кейса пройдена. Остаётся 1 расхождение — план обмена без Ext/Content.xml (хвостовая аномалия конфигурации: на одной БП все четыре платформы файл пишут). Co-Authored-By: Claude Opus 5 (1M context) --- .../meta-compile/scripts/meta-compile.ps1 | 6 +- .../meta-compile/scripts/meta-compile.py | 8 +- .../catalog-attr-choice-params.json | 7 +- .../Catalogs/ТестВыбора.xml | 92 +++++++++++++++++++ 4 files changed, 109 insertions(+), 4 deletions(-) diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index d640aaf8..bf0d8c54 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -853,8 +853,12 @@ function Normalize-FillRef { $root = $script:fillRefRoots[$parts[0].ToLower()] if (-not $root) { return $null } $typeName = $parts[1] + # Двухчастное "Тип.Имя" — это объект метаданных, а не ЗНАЧЕНИЕ. Значением бывают пустая ссылка, + # предопределённый элемент или значение перечисления — все они длиннее. Правило было выведено + # только для Enum; без него строка вида "Документ.РеализацияТоваров" молча становилась ссылкой + # (на корпусе: 5520 значений в ChoiceParameters и 8623 в FillValue — двухчастных НЕТ ни одного). + if ($parts.Count -lt 3) { return $null } if ($root -eq 'Enum') { - if ($parts.Count -eq 2) { return $null } # "Enum.X" — не значение if ($parts.Count -eq 3) { if ($script:fillEmptyRefWords -contains $parts[2].ToLower()) { return "Enum.$typeName.EmptyRef" } return "Enum.$typeName.EnumValue.$($parts[2])" diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index a13d90cc..c420854f 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -873,9 +873,13 @@ def normalize_fill_ref(s): if not root: return None type_name = parts[1] + # Двухчастное "Тип.Имя" — это объект метаданных, а не ЗНАЧЕНИЕ. Значением бывают пустая ссылка, + # предопределённый элемент или значение перечисления — все они длиннее. Правило было выведено + # только для Enum; без него строка вида "Документ.РеализацияТоваров" молча становилась ссылкой + # (на корпусе: 5520 значений в ChoiceParameters и 8623 в FillValue — двухчастных НЕТ ни одного). + if len(parts) < 3: + return None if root == 'Enum': - if len(parts) == 2: - return None if len(parts) == 3: if parts[2].lower() in fill_empty_ref_words: return f'Enum.{type_name}.EmptyRef' diff --git a/tests/skills/cases/meta-compile/catalog-attr-choice-params.json b/tests/skills/cases/meta-compile/catalog-attr-choice-params.json index d8b95794..ed1896b8 100644 --- a/tests/skills/cases/meta-compile/catalog-attr-choice-params.json +++ b/tests/skills/cases/meta-compile/catalog-attr-choice-params.json @@ -15,7 +15,12 @@ { "name": "ПустаяСсылка", "type": "String(10)", "choiceParameters": [ { "name": "Отбор.ТипПоказателя", "value": { "emptyRef": true } } ] }, { "name": "ПустаяСсылкаВМассиве", "type": "String(10)", - "choiceParameters": [ { "name": "Отбор.Набор", "value": [ { "emptyRef": true }, "ТТН" ] } ] } + "choiceParameters": [ { "name": "Отбор.Набор", "value": [ { "emptyRef": true }, "ТТН" ] } ] }, + { "name": "СтрокаПохожаяНаСсылку", "type": "String(60)", + "choiceParameters": [ { "name": "Отбор.ТипДокумента", "value": "Документ.РеализацияТоваровУслуг" } ] }, + { "name": "НастоящаяСсылка", "type": "CatalogRef.Номенклатура", + "fillValue": "Справочник.Номенклатура.ПустаяСсылка", + "choiceParameters": [ { "name": "Отбор.Вид", "value": "Перечисление.ТипыВЕТИС.ТТН" } ] } ] }, "validatePath": "Catalogs/ТестВыбора", diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-attr-choice-params/Catalogs/ТестВыбора.xml b/tests/skills/cases/meta-compile/snapshots/catalog-attr-choice-params/Catalogs/ТестВыбора.xml index 2b64485c..4a3f8091 100644 --- a/tests/skills/cases/meta-compile/snapshots/catalog-attr-choice-params/Catalogs/ТестВыбора.xml +++ b/tests/skills/cases/meta-compile/snapshots/catalog-attr-choice-params/Catalogs/ТестВыбора.xml @@ -369,6 +369,98 @@ Use + + + СтрокаПохожаяНаСсылку + + + ru + Строка похожая на ссылку + + + + + xs:string + + 60 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + + Документ.РеализацияТоваровУслуг + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + + + + + НастоящаяСсылка + + + ru + Настоящая ссылка + + + + + d5p1:CatalogRef.Номенклатура + + false + + + + false + + false + false + + + false + Catalog.Номенклатура.EmptyRef + DontCheck + Items + + + + Enum.ТипыВЕТИС.EnumValue.ТТН + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + +