mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-14 18:04:58 +03:00
feat(form-decompile,form-compile): ролевой доступ колонки реквизита (View/Edit xr-флаг)
Раундтрип терял <View>/<Edit> на колонках реквизита (колонка ValueTable/ValueTree с <Type>):
ролевой доступ вида <Edit><xr:Common>false</xr:Common><xr:Value name="Role.X">true</xr:Value></Edit>
(напр. НастройкиУчетаЗарплаты/ФормаДополнительныхДанных — колонки РайонныйКоэффициент/Ссылка).
Механизм xr-флага уже был у самого реквизита (View/Edit) и userVisible — у колонок не подключён.
decompile (Decompile-AttrColumn): захват view/edit через Decompile-XrFlag (bool | {common,roles}).
compile (Emit-AttrColumn, ps1+py): эмиссия <View>/<Edit> через Emit-XrFlag после FunctionalOptions.
(Колонки идут своим путём Decompile-AttrColumn, не через GENERIC_SCALARS — коллизии ключа edit нет.)
Корпус (acc+erp 8.3.24): из 282591 колонок — 14 с <View>, 21 с <Edit> (редко, но реально).
Верификация: таргет-раундтрип 72 форм с колоночными View/Edit → категория закрыта (0 LOST;
остаток — другие категории content/right). Регресс form-compile 43/43 (ps1+py); 1С-cert кейса
table (колоночные View common-only и Edit с ролью грузятся в платформу). spec обновлён.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# form-compile v1.130 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.131 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[string]$JsonPath,
|
||||
@@ -4849,6 +4849,9 @@ function Emit-AttrColumn {
|
||||
if ($col.title) { Emit-MLText -tag "Title" -text $col.title -indent "$indent`t" }
|
||||
Emit-Type -typeStr "$($col.type)" -indent "$indent`t"
|
||||
Emit-FunctionalOptions -fo $col.functionalOptions -indent "$indent`t"
|
||||
# Ролевой доступ колонки (View/Edit) — xr-флаг, как у самого реквизита
|
||||
if ($null -ne $col.view) { Emit-XrFlag -tag 'View' -val $col.view -indent "$indent`t" }
|
||||
if ($null -ne $col.edit) { Emit-XrFlag -tag 'Edit' -val $col.edit -indent "$indent`t" }
|
||||
X "$indent</Column>"
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# form-compile v1.130 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.131 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import copy
|
||||
@@ -4563,6 +4563,11 @@ def emit_attr_column(lines, col, indent):
|
||||
emit_mltext(lines, f'{indent}\t', 'Title', col['title'])
|
||||
emit_type(lines, str(col.get('type', '')), f'{indent}\t')
|
||||
emit_functional_options(lines, col.get('functionalOptions'), f'{indent}\t')
|
||||
# Ролевой доступ колонки (View/Edit) — xr-флаг, как у самого реквизита
|
||||
if col.get('view') is not None:
|
||||
emit_xr_flag(lines, 'View', col['view'], f'{indent}\t')
|
||||
if col.get('edit') is not None:
|
||||
emit_xr_flag(lines, 'Edit', col['edit'], f'{indent}\t')
|
||||
lines.append(f'{indent}</Column>')
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# form-decompile v0.104 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# form-decompile v0.105 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||
param(
|
||||
@@ -985,6 +985,9 @@ function Decompile-AttrColumn {
|
||||
$cty = Decompile-Type ($c.SelectSingleNode("lf:Type", $ns)); if ($cty) { $co['type'] = $cty }
|
||||
$ctNode = $c.SelectSingleNode("lf:Title", $ns); if ($ctNode) { $t = Get-LangText $ctNode; if ($null -ne $t) { $co['title'] = $t } }
|
||||
$cfo = Decompile-FunctionalOptions $c; if ($cfo) { $co['functionalOptions'] = $cfo }
|
||||
# Ролевой доступ колонки (View/Edit) — xr-флаг, как у самого реквизита (bool | {common,roles})
|
||||
$cv = Decompile-XrFlag $c 'View'; if ($null -ne $cv) { $co['view'] = $cv }
|
||||
$ce = Decompile-XrFlag $c 'Edit'; if ($null -ne $ce) { $co['edit'] = $ce }
|
||||
return $co
|
||||
}
|
||||
|
||||
|
||||
@@ -847,7 +847,7 @@ Forgiving-синонимы типа: XML-имя (`SpreadSheetDocumentField`) и
|
||||
| `savedData` | bool | Сохраняемые данные (`<SavedData>`). **`false`** → суппресс авто-вывода компилятора (main-реквизит объектного типа Catalog/Document/ChartOf*/ExchangePlan/BusinessProcess/Task Object + RecordManager → `SavedData=true`). Нет ключа → авто-вывод |
|
||||
| `save` | bool/string/array | Сохранение значения в пользовательских настройках (`<Save><Field>…`). `true` → `<Field>имя</Field>`; строка/массив строк → под-поля с авто-префиксом `имя.` (путь с точкой / UUID `1/0:…` / совпадающее с именем — берётся как есть). Нет ключа или `false` → не эмитится. Пример периода: `["Период","EndDate","StartDate","Variant"]` |
|
||||
| `fillCheck` | bool/string | Проверка заполнения реквизита (`<FillCheck>`). `true` → `ShowError` (единственное значение в схеме); строка → verbatim. Синоним `fillChecking`. (`<FillChecking>` в схеме нет — был багом) |
|
||||
| `columns` | array | Колонки для ValueTable/ValueTree (`{ name, type, title?, functionalOptions?, useAlways? }`) |
|
||||
| `columns` | array | Колонки для ValueTable/ValueTree (`{ name, type, title?, functionalOptions?, view?, edit?, useAlways? }`). `view`/`edit` — ролевой доступ колонки (`<View>`/`<Edit>` xr-флаг, тот же формат `bool \| {common, roles}`, что у реквизита, §4.1c; редкое) |
|
||||
| `additionalColumns` | array | Доп. колонки табличных частей объекта: `[{ table: "Объект.ТабЧасть", columns: [<col>] }]`. У главного реквизита-объекта; `<col>` — та же грамматика, что у `columns`. Эмитятся в `<Columns>` после прямых колонок |
|
||||
| `settings` | object | Настройки динамического списка (только `type: "DynamicList"`) |
|
||||
| `planner` | object | Design-time конфигурация планировщика (только `type: "pl:Planner"`, `<Settings xsi:type="pl:Planner">`). См. ниже |
|
||||
|
||||
+7
@@ -133,6 +133,9 @@
|
||||
<v8:DateFractions>Date</v8:DateFractions>
|
||||
</v8:DateQualifiers>
|
||||
</Type>
|
||||
<View>
|
||||
<xr:Common>false</xr:Common>
|
||||
</View>
|
||||
</Column>
|
||||
<Column name="Сумма" id="32">
|
||||
<Type>
|
||||
@@ -143,6 +146,10 @@
|
||||
<v8:AllowedSign>Any</v8:AllowedSign>
|
||||
</v8:NumberQualifiers>
|
||||
</Type>
|
||||
<Edit>
|
||||
<xr:Common>false</xr:Common>
|
||||
<xr:Value name="UUID-001">true</xr:Value>
|
||||
</Edit>
|
||||
</Column>
|
||||
<Column name="Комментарий" id="33">
|
||||
<Type>
|
||||
|
||||
@@ -36,8 +36,8 @@
|
||||
"attributes": [
|
||||
{ "name": "Объект", "type": "DataProcessorObject.Таблица", "main": true },
|
||||
{ "name": "Данные", "type": "ValueTable", "useAlways": ["Сумма"], "columns": [
|
||||
{ "name": "Дата", "type": "date", "useAlways": true },
|
||||
{ "name": "Сумма", "type": "decimal(15,2)" },
|
||||
{ "name": "Дата", "type": "date", "useAlways": true, "view": false },
|
||||
{ "name": "Сумма", "type": "decimal(15,2)", "edit": { "common": false, "roles": { "a1b2c3d4-1111-2222-3333-444455556666": true } } },
|
||||
{ "name": "Комментарий", "type": "string(200)" },
|
||||
{ "name": "Объект", "type": "AnyRef" },
|
||||
{ "name": "Источник", "type": "CatalogRef" }
|
||||
|
||||
Reference in New Issue
Block a user