mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-16 10:43:18 +03:00
feat(form-decompile,form-compile): KeyType/KeyField набора динамического списка (запросный список)
Запросный динамический список (без MainTable) задаёт ключ набора: <KeyType> (FieldValue/RowKey/RowNumber) + <KeyField>* (0+ полей) — после Parameter*, до MainTable. Декомпилятор не ловил → терялось (21 форма, напр. ВыборПрисоединенногоФайла). DSL: settings.keyType (строка-enum) + settings.keyFields (массив). Взаимоисключающи с mainTable (запросный список vs таблично-ориентированный — 1С: KeyField+MainTable ломает пути данных списка). Декомпилятор: захват KeyType + всех KeyField; компилятор (ps1+py): эмит после Emit-DLParameters, до MainTable (позиция из корпус-сигнатур). Выборка 22 формы: match 17/22, KeyType/KeyField-потерь 0 (остаток — др. кластеры: CheckBox ItemWidth, order-use, SearchControlAddition, empty-right), регрессий 0. Регресс 43/43, ps1==py. Cert: corpus round-trip (запросные списки — 22 shipped-формы грузятся; синтетический кейс = полный query-based список с Table, непропорционально для verbatim 2-тег; MainTable+KeyField несовместимы → к dynamic-list-form не добавить). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# form-compile v1.146 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.147 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[string]$JsonPath,
|
||||
@@ -5685,6 +5685,10 @@ function Emit-Attributes {
|
||||
Emit-CalcFields -calcFields $st.calculatedFields -indent $si
|
||||
# Schema-параметры дин-списка (DataCompositionSchemaParameter) — после Field*, до MainTable.
|
||||
Emit-DLParameters -params $st.parameters -indent $si
|
||||
# Ключ набора (query-based список без MainTable): KeyType (RowNumber/FieldValue/RowKey)
|
||||
# + KeyField* — после Parameter*, до MainTable. Захват/эмит факт. значений.
|
||||
if ($st.keyType) { X "$si<KeyType>$(Esc-Xml "$($st.keyType)")</KeyType>" }
|
||||
if ($st.keyFields) { foreach ($kf in @($st.keyFields)) { X "$si<KeyField>$(Esc-Xml "$kf")</KeyField>" } }
|
||||
if ($st.mainTable) { X "$si<MainTable>$(Normalize-MetaTypeRef "$($st.mainTable)")</MainTable>" }
|
||||
# AutoSaveUserSettings — после MainTable (дефолт true; эмитим только при заданном ключе = отклонении).
|
||||
if ($null -ne $st.autoSaveUserSettings) { X "$si<AutoSaveUserSettings>$(if ($st.autoSaveUserSettings){'true'}else{'false'})</AutoSaveUserSettings>" }
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# form-compile v1.146 — Compile 1C managed form from JSON or object metadata
|
||||
# form-compile v1.147 — Compile 1C managed form from JSON or object metadata
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import copy
|
||||
@@ -5434,6 +5434,13 @@ def emit_attributes(lines, attrs, indent, conditional_appearance=None):
|
||||
emit_calc_fields(lines, s.get('calculatedFields'), si)
|
||||
# Schema-параметры дин-списка (DataCompositionSchemaParameter) — после Field*, до MainTable.
|
||||
emit_dl_parameters(lines, s.get('parameters'), si)
|
||||
# Ключ набора (query-based список без MainTable): KeyType (RowNumber/FieldValue/RowKey)
|
||||
# + KeyField* — после Parameter*, до MainTable. Захват/эмит факт. значений.
|
||||
if s.get('keyType'):
|
||||
lines.append(f'{si}<KeyType>{esc_xml(str(s["keyType"]))}</KeyType>')
|
||||
if s.get('keyFields'):
|
||||
for kf in s['keyFields']:
|
||||
lines.append(f'{si}<KeyField>{esc_xml(str(kf))}</KeyField>')
|
||||
if s.get('mainTable'):
|
||||
lines.append(f'{si}<MainTable>{normalize_meta_type_ref(str(s["mainTable"]))}</MainTable>')
|
||||
# AutoSaveUserSettings — после MainTable (дефолт true; эмитим только при заданном ключе = отклонении).
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# form-decompile v0.119 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# form-decompile v0.120 — Decompile 1C managed Form.xml to JSON DSL (draft)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# ВНИМАНИЕ: раундтрип не гарантируется. Навык исключён из авто-использования моделью.
|
||||
param(
|
||||
@@ -2665,6 +2665,10 @@ if ($attrsNode) {
|
||||
# AutoFillAvailableFields — дефолт true, платформа эмитит только отклонение (false). Захват «как есть».
|
||||
$afaf = Get-Child $setNode 'AutoFillAvailableFields'; if ($null -ne $afaf) { $so['autoFillAvailableFields'] = ($afaf -eq 'true') }
|
||||
$mt = Get-Child $setNode 'MainTable'; if ($mt) { $so['mainTable'] = $mt }
|
||||
# Ключ набора (query-based список): KeyType (RowNumber/FieldValue/RowKey) + KeyField* (0+).
|
||||
$kt = Get-Child $setNode 'KeyType'; if ($kt) { $so['keyType'] = $kt }
|
||||
$kfNodes = @($setNode.SelectNodes("lf:KeyField", $ns) | ForEach-Object { $_.InnerText })
|
||||
if ($kfNodes.Count -gt 0) { $so['keyFields'] = @($kfNodes) }
|
||||
# AutoSaveUserSettings — авто-сохранение польз. настроек дин-списка (в корпусе только false;
|
||||
# дефолт true → платформа эмитит отклонение). Захват факт. значения.
|
||||
$asus = Get-Child $setNode 'AutoSaveUserSettings'; if ($null -ne $asus) { $so['autoSaveUserSettings'] = ($asus -eq 'true') }
|
||||
|
||||
@@ -936,7 +936,9 @@ Forgiving-синонимы типа: XML-имя (`SpreadSheetDocumentField`) и
|
||||
|
||||
| Ключ | Тип | Описание |
|
||||
|------|-----|----------|
|
||||
| `mainTable` | string | Основная таблица. Принимает рус-имена метаданных (`Справочник.X` → `Catalog.X`) |
|
||||
| `mainTable` | string | Основная таблица. Принимает рус-имена метаданных (`Справочник.X` → `Catalog.X`). Взаимоисключающа с `keyType`/`keyFields` (таблично-ориентированный список vs запросный) |
|
||||
| `keyType` | string | Тип ключа набора запросного списка (без `mainTable`): `FieldValue` / `RowKey` / `RowNumber` |
|
||||
| `keyFields` | array | Поля ключа набора (`<KeyField>`, 0+) — для запросного списка без `mainTable`. Эмитятся после параметров |
|
||||
| `autoSaveUserSettings` | bool | Авто-сохранение пользовательских настроек дин-списка (`<AutoSaveUserSettings>`, после `MainTable`). **Умолчание `true`** — указывать только для отключения (`false`) |
|
||||
| `query` | string | Текст запроса (`ManualQuery=true`). Поддерживает `@file.sql` (путь относительно JSON) |
|
||||
| `dynamicDataRead` | bool | Динамическое считывание. **Умолчание `true`** — указывать только для отключения (`false`) |
|
||||
|
||||
Reference in New Issue
Block a user