From 1701bdac9682df6a52b1eb85a73a748b3af6ef7e Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 3 Jul 2026 16:37:39 +0300 Subject: [PATCH] =?UTF-8?q?feat(meta-compile,meta-decompile):=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=20(Object/List/Exten?= =?UTF-8?q?ded*/Explanation,=20ML)=20(v1.25/v0.10)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раундтрип-находка: презентации мультиязычны и непусты у многих справочников (корпус: ObjectPresentation 1316/803-multi, ListPresentation 208, Explanation 101, Extended* 69/75), компилятор писал пусто. DSL-ключи (ML, omit-on-default): objectPresentation, extendedObjectPresentation, listPresentation, extendedListPresentation, explanation. Эмиссия через Emit-MLText во всех 8 местах (типы, где эти свойства есть — безопасно: без ключа → self-close = прежнее поведение). Декомпилятор захватывает через Get-MLValue. spec §7.1; тест-кейс catalog-attr-ml расширен. Валидация: PS==PY; ObjectPresentation/ListPresentation impact 0; −17135 (70571→53436, вкл. добитый пробельный ToolTip-остаток нормализацией); регресс 37/37; 1С-cert зелёный. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../meta-compile/scripts/meta-compile.ps1 | 80 +++++++++---------- .../meta-compile/scripts/meta-compile.py | 80 +++++++++---------- .../meta-decompile/scripts/meta-decompile.ps1 | 11 ++- docs/meta-dsl-spec.md | 5 ++ .../cases/meta-compile/catalog-attr-ml.json | 2 + .../catalog-attr-ml/Catalogs/Контрагенты.xml | 18 ++++- 6 files changed, 113 insertions(+), 83 deletions(-) diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index 60d4eb95..c219e76a 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -1380,11 +1380,11 @@ function Emit-CatalogProperties { $fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use" X "$i$fullTextSearch" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" + Emit-MLText $i "ObjectPresentation" $def.objectPresentation + Emit-MLText $i "ExtendedObjectPresentation" $def.extendedObjectPresentation + Emit-MLText $i "ListPresentation" $def.listPresentation + Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation + Emit-MLText $i "Explanation" $def.explanation X "$iDontUse" X "$iAuto" X "$iDontUse" @@ -1489,11 +1489,11 @@ function Emit-DocumentProperties { $fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use" X "$i$fullTextSearch" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" + Emit-MLText $i "ObjectPresentation" $def.objectPresentation + Emit-MLText $i "ExtendedObjectPresentation" $def.extendedObjectPresentation + Emit-MLText $i "ListPresentation" $def.listPresentation + Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation + Emit-MLText $i "Explanation" $def.explanation X "$iAuto" X "$iDontUse" X "$ifalse" @@ -1910,11 +1910,11 @@ function Emit-ExchangePlanProperties { $fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use" X "$i$fullTextSearch" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" + Emit-MLText $i "ObjectPresentation" $def.objectPresentation + Emit-MLText $i "ExtendedObjectPresentation" $def.extendedObjectPresentation + Emit-MLText $i "ListPresentation" $def.listPresentation + Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation + Emit-MLText $i "Explanation" $def.explanation X "$iDontUse" X "$iAuto" X "$iDontUse" @@ -2017,11 +2017,11 @@ function Emit-ChartOfCharacteristicTypesProperties { $fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use" X "$i$fullTextSearch" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" + Emit-MLText $i "ObjectPresentation" $def.objectPresentation + Emit-MLText $i "ExtendedObjectPresentation" $def.extendedObjectPresentation + Emit-MLText $i "ListPresentation" $def.listPresentation + Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation + Emit-MLText $i "Explanation" $def.explanation X "$iDontUse" X "$iAuto" X "$iDontUse" @@ -2155,11 +2155,11 @@ function Emit-ChartOfAccountsProperties { $fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use" X "$i$fullTextSearch" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" + Emit-MLText $i "ObjectPresentation" $def.objectPresentation + Emit-MLText $i "ExtendedObjectPresentation" $def.extendedObjectPresentation + Emit-MLText $i "ListPresentation" $def.listPresentation + Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation + Emit-MLText $i "Explanation" $def.explanation X "$iDontUse" X "$iAuto" X "$iDontUse" @@ -2272,11 +2272,11 @@ function Emit-ChartOfCalculationTypesProperties { $fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use" X "$i$fullTextSearch" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" + Emit-MLText $i "ObjectPresentation" $def.objectPresentation + Emit-MLText $i "ExtendedObjectPresentation" $def.extendedObjectPresentation + Emit-MLText $i "ListPresentation" $def.listPresentation + Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation + Emit-MLText $i "Explanation" $def.explanation X "$iDontUse" X "$iAuto" } @@ -2388,11 +2388,11 @@ function Emit-BusinessProcessProperties { $fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use" X "$i$fullTextSearch" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" + Emit-MLText $i "ObjectPresentation" $def.objectPresentation + Emit-MLText $i "ExtendedObjectPresentation" $def.extendedObjectPresentation + Emit-MLText $i "ListPresentation" $def.listPresentation + Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation + Emit-MLText $i "Explanation" $def.explanation X "$iAuto" X "$iDontUse" X "$ifalse" @@ -2461,11 +2461,11 @@ function Emit-TaskProperties { $fullTextSearch = Get-EnumProp "FullTextSearch" "fullTextSearch" "Use" X "$i$fullTextSearch" - X "$i" - X "$i" - X "$i" - X "$i" - X "$i" + Emit-MLText $i "ObjectPresentation" $def.objectPresentation + Emit-MLText $i "ExtendedObjectPresentation" $def.extendedObjectPresentation + Emit-MLText $i "ListPresentation" $def.listPresentation + Emit-MLText $i "ExtendedListPresentation" $def.extendedListPresentation + Emit-MLText $i "Explanation" $def.explanation X "$iAuto" X "$iDontUse" X "$ifalse" diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index 31e14afa..1f87367e 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -1319,11 +1319,11 @@ def emit_catalog_properties(indent): X(f'{i}{data_lock_control_mode}') full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use') X(f'{i}{full_text_search}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') + emit_mltext(i, 'ObjectPresentation', defn.get('objectPresentation')) + emit_mltext(i, 'ExtendedObjectPresentation', defn.get('extendedObjectPresentation')) + emit_mltext(i, 'ListPresentation', defn.get('listPresentation')) + emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) X(f'{i}DontUse') X(f'{i}Auto') X(f'{i}DontUse') @@ -1406,11 +1406,11 @@ def emit_document_properties(indent): X(f'{i}{data_lock_control_mode}') full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use') X(f'{i}{full_text_search}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') + emit_mltext(i, 'ObjectPresentation', defn.get('objectPresentation')) + emit_mltext(i, 'ExtendedObjectPresentation', defn.get('extendedObjectPresentation')) + emit_mltext(i, 'ListPresentation', defn.get('listPresentation')) + emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) X(f'{i}Auto') X(f'{i}DontUse') X(f'{i}false') @@ -1762,11 +1762,11 @@ def emit_exchange_plan_properties(indent): X(f'{i}{data_lock_control_mode}') full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use') X(f'{i}{full_text_search}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') + emit_mltext(i, 'ObjectPresentation', defn.get('objectPresentation')) + emit_mltext(i, 'ExtendedObjectPresentation', defn.get('extendedObjectPresentation')) + emit_mltext(i, 'ListPresentation', defn.get('listPresentation')) + emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) X(f'{i}DontUse') X(f'{i}Auto') X(f'{i}DontUse') @@ -1854,11 +1854,11 @@ def emit_chart_of_characteristic_types_properties(indent): X(f'{i}{data_lock_control_mode}') full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use') X(f'{i}{full_text_search}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') + emit_mltext(i, 'ObjectPresentation', defn.get('objectPresentation')) + emit_mltext(i, 'ExtendedObjectPresentation', defn.get('extendedObjectPresentation')) + emit_mltext(i, 'ListPresentation', defn.get('listPresentation')) + emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) X(f'{i}DontUse') X(f'{i}Auto') X(f'{i}DontUse') @@ -1967,11 +1967,11 @@ def emit_chart_of_accounts_properties(indent): X(f'{i}{data_lock_control_mode}') full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use') X(f'{i}{full_text_search}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') + emit_mltext(i, 'ObjectPresentation', defn.get('objectPresentation')) + emit_mltext(i, 'ExtendedObjectPresentation', defn.get('extendedObjectPresentation')) + emit_mltext(i, 'ListPresentation', defn.get('listPresentation')) + emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) X(f'{i}DontUse') X(f'{i}Auto') X(f'{i}DontUse') @@ -2059,11 +2059,11 @@ def emit_chart_of_calculation_types_properties(indent): X(f'{i}{data_lock_control_mode}') full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use') X(f'{i}{full_text_search}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') + emit_mltext(i, 'ObjectPresentation', defn.get('objectPresentation')) + emit_mltext(i, 'ExtendedObjectPresentation', defn.get('extendedObjectPresentation')) + emit_mltext(i, 'ListPresentation', defn.get('listPresentation')) + emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) X(f'{i}DontUse') X(f'{i}Auto') @@ -2156,11 +2156,11 @@ def emit_business_process_properties(indent): X(f'{i}{data_lock_control_mode}') full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use') X(f'{i}{full_text_search}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') + emit_mltext(i, 'ObjectPresentation', defn.get('objectPresentation')) + emit_mltext(i, 'ExtendedObjectPresentation', defn.get('extendedObjectPresentation')) + emit_mltext(i, 'ListPresentation', defn.get('listPresentation')) + emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) X(f'{i}Auto') X(f'{i}DontUse') X(f'{i}false') @@ -2223,11 +2223,11 @@ def emit_task_properties(indent): X(f'{i}{data_lock_control_mode}') full_text_search = get_enum_prop('FullTextSearch', 'fullTextSearch', 'Use') X(f'{i}{full_text_search}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') - X(f'{i}') + emit_mltext(i, 'ObjectPresentation', defn.get('objectPresentation')) + emit_mltext(i, 'ExtendedObjectPresentation', defn.get('extendedObjectPresentation')) + emit_mltext(i, 'ListPresentation', defn.get('listPresentation')) + emit_mltext(i, 'ExtendedListPresentation', defn.get('extendedListPresentation')) + emit_mltext(i, 'Explanation', defn.get('explanation')) X(f'{i}Auto') X(f'{i}DontUse') X(f'{i}false') diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 index eb739842..33423711 100644 --- a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 +++ b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 @@ -1,4 +1,4 @@ -# meta-decompile v0.9 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.10 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Пилот: только Catalog. Инверс meta-compile (omit-on-default: ключ эмитим только @@ -274,6 +274,15 @@ Add-EnumProp 'choiceMode' 'ChoiceMode' 'BothWays' Add-EnumProp 'dataLockControlMode' 'DataLockControlMode' 'Automatic' Add-EnumProp 'fullTextSearch' 'FullTextSearch' 'Use' +# Презентации (ML, компилятор пишет пусто → omit-on-empty). +foreach ($pp in @( + @('ObjectPresentation','objectPresentation'), @('ExtendedObjectPresentation','extendedObjectPresentation'), + @('ListPresentation','listPresentation'), @('ExtendedListPresentation','extendedListPresentation'), + @('Explanation','explanation'))) { + $pv = Get-MLValue ($props.SelectSingleNode("md:$($pp[0])", $nsm)) + if ($null -ne $pv) { $dsl[$pp[1]] = $pv } +} + # --- StandardAttributes: блок есть ⟺ кастомизация ≥1 стандартного реквизита. # Захватываем ОТКЛОНЕНИЯ от профиля материализованного блока (профиль компилятор восстановит сам). # Профиль Catalog: Owner{FC=ShowError,FFV=true}, Parent{FFV=true}, Description{FC=ShowError}. --- diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index ce48b43a..0bcd84f3 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -272,6 +272,11 @@ JSON DSL для описания объектов метаданных конф | `dataLockControlMode` | `Automatic` | DataLockControlMode | | `fullTextSearch` | `Use` | FullTextSearch | | `owners` | `[]` | Owners | +| `objectPresentation` | пусто | ObjectPresentation (ML) | +| `extendedObjectPresentation` | пусто | ExtendedObjectPresentation (ML) | +| `listPresentation` | пусто | ListPresentation (ML) | +| `extendedListPresentation` | пусто | ExtendedListPresentation (ML) | +| `explanation` | пусто | Explanation (ML) | | `standardAttributes` | *(ключа нет → блок опущен)* | StandardAttributes | | `attributes` | `[]` | → Attribute в ChildObjects | | `tabularSections` | `{}` | → TabularSection в ChildObjects | diff --git a/tests/skills/cases/meta-compile/catalog-attr-ml.json b/tests/skills/cases/meta-compile/catalog-attr-ml.json index 10f1a04d..c05f5da5 100644 --- a/tests/skills/cases/meta-compile/catalog-attr-ml.json +++ b/tests/skills/cases/meta-compile/catalog-attr-ml.json @@ -3,6 +3,8 @@ "input": { "type": "Catalog", "name": "Контрагенты", "synonym": { "ru": "Контрагенты", "en": "Counterparties" }, + "objectPresentation": { "ru": "Контрагент", "en": "Counterparty" }, + "explanation": "Список контрагентов организации", "attributes": [ { "name": "ИНН", "type": "String(12)", "synonym": { "ru": "ИНН", "en": "TIN" }, "tooltip": "Идентификационный номер налогоплательщика" }, { "name": "Комментарий", "type": "String(200)", "tooltip": { "ru": "Произвольный комментарий", "en": "Free-form comment" } } diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-attr-ml/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-compile/snapshots/catalog-attr-ml/Catalogs/Контрагенты.xml index aabf9db8..9519affc 100644 --- a/tests/skills/cases/meta-compile/snapshots/catalog-attr-ml/Catalogs/Контрагенты.xml +++ b/tests/skills/cases/meta-compile/snapshots/catalog-attr-ml/Catalogs/Контрагенты.xml @@ -79,11 +79,25 @@ Automatic Use - + + + ru + Контрагент + + + en + Counterparty + + - + + + ru + Список контрагентов организации + + DontUse Auto DontUse