diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index 2c169db7..2359557e 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -1,4 +1,4 @@ -# meta-compile v1.35 — Compile 1C metadata object from JSON +# meta-compile v1.36 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -3761,11 +3761,16 @@ $objSubDir = Join-Path $typeDir $objName function Resolve-PredefItem { param($val) if ($val -is [string]) { - $m = [regex]::Match($val, '^\s*(?:\(([^)]*)\)\s*)?(\S+)(?:\s*\[(.*)\])?\s*$') + # Грамматика "(Код) Имя [Наименование]: Тип" (тип — как в полях СКД/реквизитах). Порядок разбора зеркалит + # Parse-CalcShorthand: сначала вынуть [Наим] (может содержать ':'), затем отделить тип по ':'. + $s = "$val"; $type = $null; $descRaw = $null; $hasDesc = $false + if ($s -match '\[(.*)\]') { $descRaw = $Matches[1]; $hasDesc = $true; $s = $s -replace '\s*\[.*\]', '' } + if ($s.Contains(':')) { $p = $s -split ':', 2; $s = $p[0]; $type = $p[1].Trim() } # '' → пустой + $m = [regex]::Match($s.Trim(), '^\s*(?:\(([^)]*)\)\s*)?(\S+)\s*$') $name = $m.Groups[2].Value $code = if ($m.Groups[1].Success) { $m.Groups[1].Value } else { '' } - $desc = if ($m.Groups[3].Success) { $m.Groups[3].Value } else { Split-CamelCase $name } - return @{ name = $name; code = $code; desc = $desc; isFolder = $false; children = @(); type = $null } + $desc = if ($hasDesc) { $descRaw } else { Split-CamelCase $name } + return @{ name = $name; code = $code; desc = $desc; isFolder = $false; children = @(); type = $type } } # Объектная форма + русские синонимы (прощающий ввод). $gv = { param($o, [string[]]$keys) foreach ($k in $keys) { if ($o.PSObject.Properties[$k]) { return $o.$k } } return $null } diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py index 446f3b67..296dd1b3 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.py +++ b/.claude/skills/meta-compile/scripts/meta-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# meta-compile v1.35 — Compile 1C metadata object from JSON +# meta-compile v1.36 — Compile 1C metadata object from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -3583,11 +3583,25 @@ if obj_type in types_with_module: # Наименование: нет [..]/ключа → авто(Split-CamelCase); [] / "" → пусто; [текст]/текст → как есть. def resolve_predef_item(val): if isinstance(val, str): - m = re.match(r'^\s*(?:\(([^)]*)\)\s*)?(\S+)(?:\s*\[(.*)\])?\s*$', val) + # Грамматика "(Код) Имя [Наименование]: Тип": сначала вынуть [Наим] (может содержать ':'), затем тип по ':'. + s = val + ptype = None + desc_raw = None + has_desc = False + md = re.search(r'\[(.*)\]', s) + if md: + desc_raw = md.group(1) + has_desc = True + s = re.sub(r'\s*\[.*\]', '', s) + if ':' in s: + left, right = s.split(':', 1) + s = left + ptype = right.strip() # '' → пустой + m = re.match(r'^\s*(?:\(([^)]*)\)\s*)?(\S+)\s*$', s.strip()) name = m.group(2) code = m.group(1) if m.group(1) is not None else '' - desc = m.group(3) if m.group(3) is not None else split_camel_case(name) - return {'name': name, 'code': code, 'desc': desc, 'isFolder': False, 'children': [], 'type': None} + desc = desc_raw if has_desc else split_camel_case(name) + return {'name': name, 'code': code, 'desc': desc, 'isFolder': False, 'children': [], 'type': ptype} def gv(keys): for k in keys: if k in val: diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 index 11bbc587..a7b245e4 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.24 — XML объекта метаданных 1С → JSON-черновик формата meta-compile +# meta-decompile v0.25 — XML объекта метаданных 1С → JSON-черновик формата meta-compile # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills # # Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes. Инверс meta-compile (omit-on-default: ключ эмитим только @@ -732,11 +732,13 @@ if (Test-Path -LiteralPath $predefPath) { $typeStr = if ($typeEl) { Get-TypeShorthand $typeEl } else { $null } $auto = Split-CamelWords $name - if (-not $isFolder -and $kids.Count -eq 0 -and $null -eq $typeEl) { - # Плоский без типа → компактная строка. + # Компактная строка для плоских: без узла Type (Catalog) ИЛИ с непустым типом → "(Код) Имя [Наим]: Тип". + # Пустой в короткую не влезает (нужен явный маркер) → object-форма с type:''. + if (-not $isFolder -and $kids.Count -eq 0 -and ($null -eq $typeStr -or $typeStr -ne '')) { $s = if ($code) { "($code) $name" } else { $name } if ($desc -eq '') { $s = "$s []" } elseif ($desc -ne $auto) { $s = "$s [$desc]" } + if ($typeStr) { $s = "${s}: $typeStr" } return $s } # Группа/иерархия/с типом → объект. diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index 37d35566..a5aab975 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -641,9 +641,17 @@ omit-on-empty. Поля пишутся частичной формой (`Standar Стандартные реквизиты ПВХ: PredefinedDataName, Predefined, Ref, DeletionMark, Description, Code, Parent, ValueType (профиль: Наименование → FillChecking=ShowError, Родитель → FillFromFillingValue=true). Блок **условный** (`standardAttributes`). -**Предопределённые виды** несут **тип значения на элемент** — ключ `type` в объектной форме `predefined`-элемента -(строка `"A + B"` или массив; `""` → пустой ``; отсутствие ключа → без блока). Пример: -`{"name": "Цвет", "code": "000001", "type": "CatalogRef.Цвета"}`. +**Предопределённые виды** несут **тип значения на элемент**. Короткая запись — как в полях СКД/реквизитах, тип после `:`: +`"(Код) Имя [Наименование]: Тип"` (тип составной через `+`). Объектная форма — ключ `type` (строка/массив; `""` → пустой +``). Правило: нет `:`/ключа → без блока Type; непустой тип → короткая строка; пустой `` / папки / с детьми → +объектная форма. Примеры: +```json +"predefined": [ + "(000001) Цвет: CatalogRef.Цвета", + "(000002) Размер [Размер одежды]: String(50) + Number(3,0)", + { "name": "Группа", "isFolder": true, "type": "" } +] +``` ### 7.3 Enum 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 30fec671..46952bb8 100644 --- a/tests/skills/cases/meta-compile/chart-of-characteristic-types.json +++ b/tests/skills/cases/meta-compile/chart-of-characteristic-types.json @@ -9,8 +9,8 @@ "standardAttributes": { "Description": { "synonym": "Свойство" } }, "attributes": ["НаборСвойств: String(100)"], "predefined": [ - { "name": "Цвет", "code": "000001", "type": "CatalogRef.ЗначенияСвойств" }, - { "name": "Размер", "code": "000002", "type": "String(50) + Number(3,0)" }, + "(000001) Цвет: CatalogRef.ЗначенияСвойств", + "(000002) Размер [Размер одежды]: String(50) + Number(3,0)", { "name": "Группа", "code": "000003", "isFolder": true, "type": "" } ] }, diff --git a/tests/skills/cases/meta-compile/snapshots/chart-of-characteristic-types/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Ext/Predefined.xml b/tests/skills/cases/meta-compile/snapshots/chart-of-characteristic-types/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Ext/Predefined.xml index 897a99bb..815f7bc5 100644 --- a/tests/skills/cases/meta-compile/snapshots/chart-of-characteristic-types/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Ext/Predefined.xml +++ b/tests/skills/cases/meta-compile/snapshots/chart-of-characteristic-types/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Ext/Predefined.xml @@ -12,7 +12,7 @@ Размер 000002 - Размер + Размер одежды xs:string