From bdd38691aa7f378e26d92f284b28d9f910df42a3 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Thu, 11 Jun 2026 21:10:14 +0300 Subject: [PATCH] =?UTF-8?q?feat(form-compile):=20=D1=80=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=20=D0=BF=D0=BE=20GUID=20=D0=B2=20xr-=D1=84=D0=BB=D0=B0=D0=B3?= =?UTF-8?q?=D0=B5=20=E2=80=94=20=D0=B1=D0=B5=D0=B7=20=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D0=B0=20Role.=20(=D0=B7=D0=B0=D0=B8?= =?UTF-8?q?=D0=BC=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5/=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Роль в xr-флаге (userVisible/view/edit/use, объектная форма {common,roles}) может ссылаться по GUID ( без префикса Role. — заимствованная роль или расширение), а не по имени. Emit-XrFlag всегда добавлял Role. → Role. (форма Сотрудники/ВыплатыУчётЗатрат: 4 ADDED Role.GUID + 4 LOST). Фикс: ключ-роль, совпадающий с GUID-паттерном, эмитится как есть (без Role.). Декомпилятор GUID и так сохранял верно (нет префикса для снятия). Зеркало py. Форма Сотрудники → match. Кейс attributes-types (+edit с ролью по GUID) сертифицирован в 1С (платформа принимает неизвестную GUID-роль). Регресс 43/43 (ps1+py). Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude/skills/form-compile/scripts/form-compile.ps1 | 7 ++++--- .claude/skills/form-compile/scripts/form-compile.py | 9 ++++++--- docs/form-dsl-spec.md | 2 +- tests/skills/cases/form-compile/attributes-types.json | 2 +- .../DataProcessors/Типы/Forms/Форма/Ext/Form.xml | 1 + 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1 index d4a95cbd..1bc5b172 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.122 — Compile 1C managed form from JSON or object metadata +# form-compile v1.123 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$JsonPath, @@ -2824,9 +2824,10 @@ function Emit-XrFlag { X "$indent`t$(if ($common){'true'}else{'false'})" if ($val.roles) { foreach ($r in $val.roles.PSObject.Properties) { - # Forgiving: принимаем имя без префикса, с "Role." или кириллическим "Роль." → нормализуем в "Role." + # Forgiving: принимаем имя без префикса, с "Role." или кириллическим "Роль." → нормализуем в "Role.". + # Роль по GUID (заимствованная/расширение — name="" без префикса) эмитим как есть. $rname = "$($r.Name)" -replace '^(Role|Роль)\.', '' - $rname = "Role.$rname" + if ($rname -notmatch '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$') { $rname = "Role.$rname" } $rval = if ([bool]$r.Value) { 'true' } else { 'false' } X "$indent`t$rval" } diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py index 82489d99..585391aa 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.122 — Compile 1C managed form from JSON or object metadata +# form-compile v1.123 — Compile 1C managed form from JSON or object metadata # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import copy @@ -2572,8 +2572,11 @@ def emit_xr_flag(lines, tag, val, indent): roles = val.get('roles') if roles: for rname, rval in roles.items(): - # Forgiving: имя без префикса, с "Role." или кириллическим "Роль." → нормализуем в "Role." - rn = "Role." + re.sub(r'^(Role|Роль)\.', '', rname) + # Forgiving: имя без префикса, с "Role." или кириллическим "Роль." → нормализуем в "Role.". + # Роль по GUID (заимствованная/расширение — name="" без префикса) эмитим как есть. + rn = re.sub(r'^(Role|Роль)\.', '', rname) + if not re.match(r'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$', rn): + rn = "Role." + rn lines.append(f"{indent}\t{'true' if rval else 'false'}") lines.append(f"{indent}") diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md index afbbbbc2..100c37fe 100644 --- a/docs/form-dsl-spec.md +++ b/docs/form-dsl-spec.md @@ -167,7 +167,7 @@ Семантика как в конфигураторе (три состояния флага роли): роль, **не указанная** в `roles`, наследует `common`; указанная — задаёт явный `true`/`false` (может совпадать с `common`). -**Имя роли** — forgiving: принимается без префикса (`ПолныеПрава`), с `Role.` или кириллическим `Роль.`; нормализуется в `Role.ИмяРоли`. +**Имя роли** — forgiving: принимается без префикса (`ПолныеПрава`), с `Role.` или кириллическим `Роль.`; нормализуется в `Role.ИмяРоли`. **Ссылка по GUID** (заимствованная роль / расширение — `name=""` без префикса): ключ роли — сам GUID, эмитится как есть (без `Role.`). **Отсутствие ключа** = полный доступ (платформа тег не пишет) — дефолт не эмитим. diff --git a/tests/skills/cases/form-compile/attributes-types.json b/tests/skills/cases/form-compile/attributes-types.json index d45ed593..80680c8b 100644 --- a/tests/skills/cases/form-compile/attributes-types.json +++ b/tests/skills/cases/form-compile/attributes-types.json @@ -24,7 +24,7 @@ "attributes": [ { "name": "Объект", "type": "DataProcessorObject.Типы", "main": true }, { "name": "Строка", "type": "string(200)", "view": false, "save": true, "fillCheck": true }, - { "name": "Число", "type": "decimal(10,0,nonneg)", "edit": false }, + { "name": "Число", "type": "decimal(10,0,nonneg)", "edit": { "common": false, "roles": { "a1b2c3d4-1111-2222-3333-444455556666": true } } }, { "name": "Дата", "type": "dateTime", "title": "" }, { "name": "Булево", "type": "boolean" }, { "name": "Период", "type": "СтандартныйПериод", "save": ["Период", "EndDate", "StartDate", "Variant"] }, diff --git a/tests/skills/cases/form-compile/snapshots/attributes-types/DataProcessors/Типы/Forms/Форма/Ext/Form.xml b/tests/skills/cases/form-compile/snapshots/attributes-types/DataProcessors/Типы/Forms/Форма/Ext/Form.xml index 64da1196..a2a374ae 100644 --- a/tests/skills/cases/form-compile/snapshots/attributes-types/DataProcessors/Типы/Forms/Форма/Ext/Form.xml +++ b/tests/skills/cases/form-compile/snapshots/attributes-types/DataProcessors/Типы/Forms/Форма/Ext/Form.xml @@ -79,6 +79,7 @@ false + true