From 2ff99d1b778ed979eb23953ed7c723136191bcd4 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 9 Jun 2026 21:42:51 +0300 Subject: [PATCH] =?UTF-8?q?fix(form-compile):=20=D1=81=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=B2=D0=BD=D0=BE=D0=B9=20=D1=82=D0=B8=D0=BF=20=D0=B2=20?= =?UTF-8?q?shorthand=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=B8=D0=BD-=D1=81=D0=BF=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20(dcssch:valueType)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Parse-DLParamShorthand брал тип regex'ом (\S+) — один токен без пробелов. Составной тип (CatalogRef.X | CatalogRef.Y, с пробелами вокруг |) не матчился → вся строка уходила в name → компилятор эмитил Имя: TYPE | TYPE и ТЕРЯЛ . Фикс: тип = ([^=]+?) (допускает пробелы/|, исключает '='-разделитель значения); составной резолвится по частям (per-part Resolve-TypeStr, rejoin ' | '). Emit-DLValueType уже split'ил по |, эмиссия корректна. Зеркало py. Выборка 2.17: TOTAL 38→12 (составной тип у дин-списков Task/прочих восстановлен). Кейс dynamic-list-parameters (+составной параметр DocumentRef | CatalogRef → два TypeSet) сертифицирован загрузкой в 1С. Регресс 40/40 (ps1+py). Co-Authored-By: Claude Opus 4.8 --- .../skills/form-compile/scripts/form-compile.ps1 | 12 +++++++++--- .../skills/form-compile/scripts/form-compile.py | 11 ++++++++--- .../form-compile/dynamic-list-parameters.json | 1 + .../Товары/Forms/ФормаСписка/Ext/Form.xml | 15 +++++++++++++++ 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index de2bb0f1..2f6141ff 100644 --- a/.claude/skills/form-compile/scripts/form-compile.ps1 +++ b/.claude/skills/form-compile/scripts/form-compile.ps1 @@ -1,4 +1,4 @@ -# form-compile v1.99 — Compile 1C managed form from JSON or object metadata +# form-compile v1.100 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -4471,9 +4471,15 @@ function Parse-DLParamShorthand { if ($s -match '@valueList') { $result.valueListAllowed = $true; $s = $s -replace '\s*@valueList', '' } if ($s -match '@hidden') { $result.hidden = $true; $s = $s -replace '\s*@hidden', '' } if ($s -match '\[([^\]]*)\]') { $result.title = $Matches[1].Trim(); $s = ($s -replace '\s*\[[^\]]*\]\s*', ' ').Trim() } - if ($s -match '^([^:]+):\s*(\S+)(\s*=\s*(.*))?$') { + # Тип может быть СОСТАВНЫМ (A | B | C — с пробелами); значение — после '=' (тип '=' не содержит). + if ($s -match '^([^:]+):\s*([^=]+?)(\s*=\s*(.*))?$') { $result.name = $Matches[1].Trim() - $result.type = Resolve-TypeStr ($Matches[2].Trim()) + $typeRaw = $Matches[2].Trim() + if ($typeRaw -match '[|+]') { + $result.type = (($typeRaw -split '\s*[|+]\s*') | ForEach-Object { Resolve-TypeStr ($_.Trim()) }) -join ' | ' + } else { + $result.type = Resolve-TypeStr $typeRaw + } if ($Matches[4]) { $rhs = $Matches[4].Trim() $items = Split-DLValueListCsv $rhs diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 14bb19df..f9ba8b66 100644 --- a/.claude/skills/form-compile/scripts/form-compile.py +++ b/.claude/skills/form-compile/scripts/form-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# form-compile v1.99 — Compile 1C managed form from JSON or object metadata +# form-compile v1.100 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -4160,10 +4160,15 @@ def parse_dl_param_shorthand(s): if m: result['title'] = m.group(1).strip() s = re.sub(r'\s*\[[^\]]*\]\s*', ' ', s).strip() - m = re.match(r'^([^:]+):\s*(\S+)(\s*=\s*(.*))?$', s) + # Тип может быть СОСТАВНЫМ (A | B | C — с пробелами); значение — после '=' (тип '=' не содержит). + m = re.match(r'^([^:]+):\s*([^=]+?)(\s*=\s*(.*))?$', s) if m: result['name'] = m.group(1).strip() - result['type'] = resolve_type_str(m.group(2).strip()) + type_raw = m.group(2).strip() + if re.search(r'[|+]', type_raw): + result['type'] = ' | '.join(resolve_type_str(p.strip()) for p in re.split(r'\s*[|+]\s*', type_raw)) + else: + result['type'] = resolve_type_str(type_raw) if m.group(4): rhs = m.group(4).strip() items = split_dl_valuelist_csv(rhs) diff --git a/tests/skills/cases/form-compile/dynamic-list-parameters.json b/tests/skills/cases/form-compile/dynamic-list-parameters.json index 538f5b5e..f8415a66 100644 --- a/tests/skills/cases/form-compile/dynamic-list-parameters.json +++ b/tests/skills/cases/form-compile/dynamic-list-parameters.json @@ -22,6 +22,7 @@ "parameters": [ "Артикул", "Маска: string = %", + "Получатель: DocumentRef | CatalogRef", { "name": "ВидЦен", "valueListAllowed": true }, { "name": "Период", "type": "dateTime", "useRestriction": false }, { diff --git a/tests/skills/cases/form-compile/snapshots/dynamic-list-parameters/Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml b/tests/skills/cases/form-compile/snapshots/dynamic-list-parameters/Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml index dc375f64..778fdda3 100644 --- a/tests/skills/cases/form-compile/snapshots/dynamic-list-parameters/Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml +++ b/tests/skills/cases/form-compile/snapshots/dynamic-list-parameters/Catalogs/Товары/Forms/ФормаСписка/Ext/Form.xml @@ -124,6 +124,21 @@ % true + + Получатель + + + ru + Получатель + + + + cfg:DocumentRef + cfg:CatalogRef + + + true + ВидЦен