mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-14 18:04:58 +03:00
feat(form-compile): роль по GUID в xr-флаге — без префикса Role. (заимствованные/расширение)
Роль в xr-флаге (userVisible/view/edit/use, объектная форма {common,roles}) может
ссылаться по GUID (<xr:Value name="<guid>"> без префикса Role. — заимствованная роль
или расширение), а не по имени. Emit-XrFlag всегда добавлял Role. → Role.<guid>
(форма Сотрудники/ВыплатыУчётЗатрат: 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) <noreply@anthropic.com>
This commit is contained in:
@@ -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<xr:Common>$(if ($common){'true'}else{'false'})</xr:Common>"
|
||||
if ($val.roles) {
|
||||
foreach ($r in $val.roles.PSObject.Properties) {
|
||||
# Forgiving: принимаем имя без префикса, с "Role." или кириллическим "Роль." → нормализуем в "Role."
|
||||
# Forgiving: принимаем имя без префикса, с "Role." или кириллическим "Роль." → нормализуем в "Role.".
|
||||
# Роль по GUID (заимствованная/расширение — name="<guid>" без префикса) эмитим как есть.
|
||||
$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<xr:Value name=`"$rname`">$rval</xr:Value>"
|
||||
}
|
||||
|
||||
@@ -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="<guid>" без префикса) эмитим как есть.
|
||||
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<xr:Value name=\"{rn}\">{'true' if rval else 'false'}</xr:Value>")
|
||||
lines.append(f"{indent}</{tag}>")
|
||||
|
||||
|
||||
@@ -167,7 +167,7 @@
|
||||
|
||||
Семантика как в конфигураторе (три состояния флага роли): роль, **не указанная** в `roles`, наследует `common`; указанная — задаёт явный `true`/`false` (может совпадать с `common`).
|
||||
|
||||
**Имя роли** — forgiving: принимается без префикса (`ПолныеПрава`), с `Role.` или кириллическим `Роль.`; нормализуется в `Role.ИмяРоли`.
|
||||
**Имя роли** — forgiving: принимается без префикса (`ПолныеПрава`), с `Role.` или кириллическим `Роль.`; нормализуется в `Role.ИмяРоли`. **Ссылка по GUID** (заимствованная роль / расширение — `name="<guid>"` без префикса): ключ роли — сам GUID, эмитится как есть (без `Role.`).
|
||||
|
||||
**Отсутствие ключа** = полный доступ (платформа тег не пишет) — дефолт не эмитим.
|
||||
|
||||
|
||||
@@ -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"] },
|
||||
|
||||
+1
@@ -79,6 +79,7 @@
|
||||
</Type>
|
||||
<Edit>
|
||||
<xr:Common>false</xr:Common>
|
||||
<xr:Value name="UUID-001">true</xr:Value>
|
||||
</Edit>
|
||||
</Attribute>
|
||||
<Attribute name="Дата" id="16">
|
||||
|
||||
Reference in New Issue
Block a user