diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1
index aaff1e4d9..0a272c8e9 100644
--- a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1
+++ b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1
@@ -1,4 +1,4 @@
-# meta-decompile v0.68 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
+# meta-decompile v0.69 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
#
# Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document,
@@ -1744,6 +1744,12 @@ if ($objType -eq 'ExternalDataSource') {
if ((TP 'UseStandardCommands') -eq 'false') { $tbl['useStandardCommands'] = $false }
if ((TP 'QuickChoice') -eq 'true') { $tbl['quickChoice'] = $true }
$tet = TP 'EditType'; if ($tet -and $tet -cne 'InDialog') { $tbl['editType'] = $tet }
+ # Слоты форм — такая же часть свойств таблицы, как у прочих объектов (сами формы
+ # вне скоупа раундтрипа: это отдельные файлы, их делает навык form-add).
+ foreach ($fp in @(@('DefaultObjectForm','defaultObjectForm'), @('DefaultRecordForm','defaultRecordForm'),
+ @('DefaultListForm','defaultListForm'), @('DefaultChoiceForm','defaultChoiceForm'))) {
+ $fv = TP $fp[0]; if ($fv) { $tbl[$fp[1]] = $fv }
+ }
$basedOn = [System.Collections.ArrayList]@()
foreach ($it in @($tp.SelectNodes('md:BasedOn/xr:Item', $nsm))) { [void]$basedOn.Add($it.InnerText) }
if ($basedOn.Count -gt 0) { $tbl['basedOn'] = $basedOn }
diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.py b/.claude/skills/meta-decompile/scripts/meta-decompile.py
index ff6fc4f6f..bdae93c71 100644
--- a/.claude/skills/meta-decompile/scripts/meta-decompile.py
+++ b/.claude/skills/meta-decompile/scripts/meta-decompile.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# meta-decompile v0.68 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
+# meta-decompile v0.69 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
#
# Зеркало meta-decompile.ps1 (КАНОН). Структура 1:1 — те же имена функций, порядок, комментарии.
@@ -2272,6 +2272,15 @@ def main():
t_et = TP('EditType')
if t_et and t_et != 'InDialog':
tbl['editType'] = t_et
+ # Слоты форм — такая же часть свойств таблицы, как у прочих объектов (сами формы
+ # вне скоупа раундтрипа: это отдельные файлы, их делает навык form-add).
+ for xml_tag, dsl_key in (('DefaultObjectForm', 'defaultObjectForm'),
+ ('DefaultRecordForm', 'defaultRecordForm'),
+ ('DefaultListForm', 'defaultListForm'),
+ ('DefaultChoiceForm', 'defaultChoiceForm')):
+ fv = TP(xml_tag)
+ if fv:
+ tbl[dsl_key] = fv
based_on = [_text(it) for it in tp.findall('md:BasedOn/xr:Item', NS)]
if based_on:
tbl['basedOn'] = based_on
diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md
index 33bb79d38..153104c4d 100644
--- a/docs/meta-dsl-spec.md
+++ b/docs/meta-dsl-spec.md
@@ -2145,6 +2145,9 @@ ChildObjects и модулей.
Неверная пара не отвергается схемой формы — она валит загрузку всей конфигурации
«Исключением XDTO при чтении файла», не называя причины, поэтому `form-add` проверяет её сам.
+- Слоты `default*Form` таблицы декомпилятор снимает — как у прочих объектов. Собранная из такого
+ DSL конфигурация сама по себе не загрузится («Неизвестный объект метаданных — …Form.ФормаСписка»): файлы форм
+ создаёт навык `form-add`. Это та же договорённость, что для справочников и документов.
- **Таблица без ключевых полей** собирается: загрузку XML платформа принимает молча, хотя
Конфигуратор интерактивно ключ требует. `meta-validate` предупреждает, но не отвергает — рабочие
конфигурации без ключей существуют. Без ключа недоступны форма записи и набор записей.
diff --git a/tests/skills/cases/meta-decompile/external-data-source.json b/tests/skills/cases/meta-decompile/external-data-source.json
index 3f8270fd7..bbb05fcf6 100644
--- a/tests/skills/cases/meta-decompile/external-data-source.json
+++ b/tests/skills/cases/meta-decompile/external-data-source.json
@@ -31,7 +31,8 @@
"nameInDataSource": "cost_net",
"readOnly": true
}
- ]
+ ],
+ "defaultListForm": "ExternalDataSource.PG.Table.products.Form.ФормаСписка"
}
},
"functions": {
@@ -67,7 +68,8 @@
"photo: BinaryData | nullable",
"\"nameInDataSource\": \"cost_net\"",
"\"nextKey\": \"NEXT VALUE FOR public.seq_key\"",
- "sig: BinaryData(256,fixed) | nullable"
+ "sig: BinaryData(256,fixed) | nullable",
+ "\"defaultListForm\": \"ExternalDataSource.PG.Table.products.Form.ФормаСписка\""
]
}
],
diff --git a/tests/skills/cases/meta-decompile/snapshots/external-data-source/ExternalDataSources/PG/Tables/products.xml b/tests/skills/cases/meta-decompile/snapshots/external-data-source/ExternalDataSources/PG/Tables/products.xml
index a1716bda7..95f299015 100644
--- a/tests/skills/cases/meta-decompile/snapshots/external-data-source/ExternalDataSources/PG/Tables/products.xml
+++ b/tests/skills/cases/meta-decompile/snapshots/external-data-source/ExternalDataSources/PG/Tables/products.xml
@@ -66,7 +66,7 @@
Auto
-
+ ExternalDataSource.PG.Table.products.Form.ФормаСписка
diff --git a/tests/skills/cases/meta-decompile/snapshots/external-data-source/draft.json b/tests/skills/cases/meta-decompile/snapshots/external-data-source/draft.json
index dcf5e2d0a..7ba5a3cdc 100644
--- a/tests/skills/cases/meta-decompile/snapshots/external-data-source/draft.json
+++ b/tests/skills/cases/meta-decompile/snapshots/external-data-source/draft.json
@@ -10,6 +10,7 @@
"keyFields": ["id"],
"presentationField": "name",
"transactionsIsolationLevel": "ReadUncommitted",
+ "defaultListForm": "ExternalDataSource.PG.Table.products.Form.ФормаСписка",
"fields": [
"id: Number(10,0)",
"name: String(150)",