diff --git a/.claude/skills/form-compile/scripts/form-compile.ps1 b/.claude/skills/form-compile/scripts/form-compile.ps1
index 24f26345..57b6f6e7 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.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$(Esc-Xml "$($st.keyType)")" }
+ if ($st.keyFields) { foreach ($kf in @($st.keyFields)) { X "$si$(Esc-Xml "$kf")" } }
if ($st.mainTable) { X "$si$(Normalize-MetaTypeRef "$($st.mainTable)")" }
# AutoSaveUserSettings — после MainTable (дефолт true; эмитим только при заданном ключе = отклонении).
if ($null -ne $st.autoSaveUserSettings) { X "$si$(if ($st.autoSaveUserSettings){'true'}else{'false'})" }
diff --git a/.claude/skills/form-compile/scripts/form-compile.py b/.claude/skills/form-compile/scripts/form-compile.py
index 22be177f..5f438f71 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.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}{esc_xml(str(s["keyType"]))}')
+ if s.get('keyFields'):
+ for kf in s['keyFields']:
+ lines.append(f'{si}{esc_xml(str(kf))}')
if s.get('mainTable'):
lines.append(f'{si}{normalize_meta_type_ref(str(s["mainTable"]))}')
# AutoSaveUserSettings — после MainTable (дефолт true; эмитим только при заданном ключе = отклонении).
diff --git a/.claude/skills/form-decompile/scripts/form-decompile.ps1 b/.claude/skills/form-decompile/scripts/form-decompile.ps1
index 952bb304..51d3707f 100644
--- a/.claude/skills/form-decompile/scripts/form-decompile.ps1
+++ b/.claude/skills/form-decompile/scripts/form-decompile.ps1
@@ -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') }
diff --git a/docs/form-dsl-spec.md b/docs/form-dsl-spec.md
index 6f61f05f..c2fbad4b 100644
--- a/docs/form-dsl-spec.md
+++ b/docs/form-dsl-spec.md
@@ -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 | Поля ключа набора (``, 0+) — для запросного списка без `mainTable`. Эмитятся после параметров |
| `autoSaveUserSettings` | bool | Авто-сохранение пользовательских настроек дин-списка (``, после `MainTable`). **Умолчание `true`** — указывать только для отключения (`false`) |
| `query` | string | Текст запроса (`ManualQuery=true`). Поддерживает `@file.sql` (путь относительно JSON) |
| `dynamicDataRead` | bool | Динамическое считывание. **Умолчание `true`** — указывать только для отключения (`false`) |