From 53ed8c44896f88f76f0054c01e6587bfa4c0e645 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Fri, 3 Jul 2026 13:08:38 +0300 Subject: [PATCH] =?UTF-8?q?fix(meta-compile):=20=D1=82=D0=B8=D0=BF=D1=8B?= =?UTF-8?q?=20ValueStorage/UUID=20=E2=86=92=20v8:ValueStorage/v8:UUID=20+?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D1=89=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D0=B8=D0=BD=D0=BE=D0=BD=D0=B8=D0=BC=D1=8B=20(v1.20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раундтрип-находка (класс-2): meta-compile эмитил ValueStorage как xs:base64Binary, а канон 1С — v8:ValueStorage (2954 реквизита корпуса; xs:base64Binary как тип реквизита НЕ встречается — только в Template.xml). UUID эмитился raw. Оба типа теперь эмитятся канонически. Прощающий ввод (по идее: модель может ошибиться формой): base64Binary / ХранилищеЗначений / ХранилищеЗначения → ValueStorage; УникальныйИдентификатор → UUID. spec v2.5 (§3.1 типы + §3.3 синонимы); тест-кейс catalog-mixed-types расширен ValueStorage/UUID. Валидация: v8:Type-категория 0 на таргет-выборке; регресс 36/36 (ps+py); 1С-cert зелёный. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../meta-compile/scripts/meta-compile.ps1 | 16 +++- .../meta-compile/scripts/meta-compile.py | 15 +++- docs/meta-dsl-spec.md | 6 +- .../meta-compile/catalog-mixed-types.json | 4 +- .../Catalogs/Контрагенты.xml | 80 +++++++++++++++++++ 5 files changed, 115 insertions(+), 6 deletions(-) diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index 64b33d89..f16536fd 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -400,6 +400,13 @@ $script:typeSynonyms["boolean"] = "Boolean" $script:typeSynonyms["date"] = "Date" $script:typeSynonyms["datetime"] = "DateTime" $script:typeSynonyms["bool"] = "Boolean" +# ValueStorage / UUID — прощающий ввод (модель может написать base64Binary / рус. форму → канон). +$script:typeSynonyms["valuestorage"] = "ValueStorage" +$script:typeSynonyms["base64binary"] = "ValueStorage" +$script:typeSynonyms["хранилищезначений"] = "ValueStorage" +$script:typeSynonyms["хранилищезначения"] = "ValueStorage" +$script:typeSynonyms["uuid"] = "UUID" +$script:typeSynonyms["уникальныйидентификатор"] = "UUID" # Reference synonyms (Russian, lowercase) $script:typeSynonyms["справочникссылка"] = "CatalogRef" $script:typeSynonyms["документссылка"] = "DocumentRef" @@ -528,9 +535,14 @@ function Emit-TypeContent { return } - # ValueStorage + # ValueStorage (ХранилищеЗначения) — канон v8:ValueStorage (не xs:base64Binary, хоть 1С и принимает оба). if ($typeStr -eq "ValueStorage") { - X "$indentxs:base64Binary" + X "$indentv8:ValueStorage" + return + } + # UUID (УникальныйИдентификатор) + if ($typeStr -eq "UUID") { + X "$indentv8:UUID" return } diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index 644e7721..486ca3ab 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -445,6 +445,13 @@ type_synonyms = { 'date': 'Date', 'datetime': 'DateTime', 'bool': 'Boolean', + # ValueStorage / UUID — прощающий ввод (base64Binary / рус. форма → канон). + 'valuestorage': 'ValueStorage', + 'base64binary': 'ValueStorage', + 'хранилищезначений': 'ValueStorage', + 'хранилищезначения': 'ValueStorage', + 'uuid': 'UUID', + 'уникальныйидентификатор': 'UUID', # Reference synonyms (Russian, lowercase) 'справочникссылка': 'CatalogRef', 'документссылка': 'DocumentRef', @@ -557,9 +564,13 @@ def emit_type_content(indent, type_str): dt_name = m.group(1) X(f'{indent}cfg:DefinedType.{dt_name}') return - # ValueStorage + # ValueStorage (ХранилищеЗначения) — канон v8:ValueStorage (не xs:base64Binary). if type_str == 'ValueStorage': - X(f'{indent}xs:base64Binary') + X(f'{indent}v8:ValueStorage') + return + # UUID (УникальныйИдентификатор) + if type_str == 'UUID': + X(f'{indent}v8:UUID') return # Reference types — use local xmlns declaration for 1C compatibility diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index 18759bc1..40f04b0f 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -1,6 +1,6 @@ # Meta DSL — спецификация JSON-формата для объектов метаданных 1С -Версия: 2.4 +Версия: 2.5 ## Обзор @@ -67,6 +67,8 @@ JSON DSL для описания объектов метаданных конф | `Boolean` | `xs:boolean` | | `Date` | `xs:dateTime` + DateFractions=Date | | `DateTime` | `xs:dateTime` + DateFractions=DateTime | +| `ValueStorage` | `v8:ValueStorage` (ХранилищеЗначения) | +| `UUID` | `v8:UUID` (УникальныйИдентификатор) | ### 3.2 Ссылочные типы @@ -102,6 +104,8 @@ JSON DSL для описания объектов метаданных конф | `БизнесПроцессСсылка.Xxx` | `BusinessProcessRef.Xxx` | | `ЗадачаСсылка.Xxx` | `TaskRef.Xxx` | | `ОпределяемыйТип.Xxx` | `DefinedType.Xxx` | +| `ХранилищеЗначений` / `ХранилищеЗначения` / `base64Binary` | `ValueStorage` | +| `УникальныйИдентификатор` | `UUID` | Регистронезависимые. diff --git a/tests/skills/cases/meta-compile/catalog-mixed-types.json b/tests/skills/cases/meta-compile/catalog-mixed-types.json index b7568f21..fa8b3d79 100644 --- a/tests/skills/cases/meta-compile/catalog-mixed-types.json +++ b/tests/skills/cases/meta-compile/catalog-mixed-types.json @@ -10,7 +10,9 @@ "Активен: Boolean", "СуммаДоговора: Number(15,2)", "Ответственный: CatalogRef.ФизическиеЛица", - "Статус: EnumRef.СтатусыКонтрагентов" + "Статус: EnumRef.СтатусыКонтрагентов", + "Вложение: ValueStorage", + "Идентификатор: UUID" ] }, "validatePath": "Catalogs/Контрагенты", diff --git a/tests/skills/cases/meta-compile/snapshots/catalog-mixed-types/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-compile/snapshots/catalog-mixed-types/Catalogs/Контрагенты.xml index 4c6e0215..10ef8346 100644 --- a/tests/skills/cases/meta-compile/snapshots/catalog-mixed-types/Catalogs/Контрагенты.xml +++ b/tests/skills/cases/meta-compile/snapshots/catalog-mixed-types/Catalogs/Контрагенты.xml @@ -339,6 +339,86 @@ Use + + + Вложение + + + ru + Вложение + + + + + v8:ValueStorage + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + + + + + Идентификатор + + + ru + Идентификатор + + + + + v8:UUID + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + +