fix(meta-decompile): слоты форм таблицы внешнего источника терялись при разборе

Раундтрип B на стенде вскрыл пробел: у таблицы внешнего источника декомпилятор не снимал
DefaultObjectForm/DefaultRecordForm/DefaultListForm/DefaultChoiceForm, хотя DSL их поддерживает,
компилятор эмитит, а у прочих объектов они снимаются. Пересборка стенда молча теряла назначенную
форму списка.

Сами формы вне скоупа раундтрипа (это отдельные файлы, их делает навык form-add), поэтому
собранная из такого DSL конфигурация не загрузится — ровно как и у справочника с формой.
Договорённость одна и та же, записана в docs/meta-dsl-spec.md.

Раундтрип B после правки: из выгрузки стенда → DSL → meta-compile → загрузка в базу →
выгрузка платформой = побайтово то же, что собрал компилятор. Против исходной выгрузки стенда
остаются два известных расхождения: UnfilledParentValue (загрузкой XML не задаётся, замерено
тремя опытами) и регистрация <Form> (вне скоупа).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi
This commit is contained in:
Nick Shirokov
2026-09-06 20:34:23 +03:00
co-authored by Claude Opus 5
parent 5c79b494cd
commit 41e2eca638
6 changed files with 26 additions and 5 deletions
@@ -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 }
@@ -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