mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-28 14:09:41 +03:00
feat(meta-compile,meta-decompile): короткая запись типа предопределённых ПВХ (v1.36/v0.25)
Предопределённые виды характеристик несут тип значения на элемент. Раньше это требовало объектной формы; теперь тип выражается короткой строкой после ':' — как в полях СКД/реквизитах: "(Код) Имя [Наименование]: Тип" (тип составной через '+') Правило: нет ':' → без блока Type (Catalog-стиль); непустой тип → короткая строка; пустой <Type/> / папки / с детьми → объектная форма (ключ type). Разбор зеркалит Parse-CalcShorthand: сначала вынуть [Наим] (может содержать ':'), затем отделить тип по ':'. Компилятор принимает обе формы, декомпилятор пишет короткую для плоских элементов. На ВидыСубконтоХозрасчетные все 63 предопределённых из объектов стали компактными строками. Роундтрип/вывод XML не меняется (52 TOTAL). Регресс 47/47 ps1+py, ps1↔py identical. spec §7.2b, кейс chart-of-characteristic-types. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
01ecd8a52d
commit
44bfcf2256
@@ -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() } # '' → пустой <Type/>
|
||||
$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 }
|
||||
|
||||
Reference in New Issue
Block a user