mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-07 10:40:52 +03:00
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:
co-authored by
Claude Opus 5
parent
5c79b494cd
commit
41e2eca638
@@ -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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
#
|
#
|
||||||
# Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document,
|
# Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document,
|
||||||
@@ -1744,6 +1744,12 @@ if ($objType -eq 'ExternalDataSource') {
|
|||||||
if ((TP 'UseStandardCommands') -eq 'false') { $tbl['useStandardCommands'] = $false }
|
if ((TP 'UseStandardCommands') -eq 'false') { $tbl['useStandardCommands'] = $false }
|
||||||
if ((TP 'QuickChoice') -eq 'true') { $tbl['quickChoice'] = $true }
|
if ((TP 'QuickChoice') -eq 'true') { $tbl['quickChoice'] = $true }
|
||||||
$tet = TP 'EditType'; if ($tet -and $tet -cne 'InDialog') { $tbl['editType'] = $tet }
|
$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]@()
|
$basedOn = [System.Collections.ArrayList]@()
|
||||||
foreach ($it in @($tp.SelectNodes('md:BasedOn/xr:Item', $nsm))) { [void]$basedOn.Add($it.InnerText) }
|
foreach ($it in @($tp.SelectNodes('md:BasedOn/xr:Item', $nsm))) { [void]$basedOn.Add($it.InnerText) }
|
||||||
if ($basedOn.Count -gt 0) { $tbl['basedOn'] = $basedOn }
|
if ($basedOn.Count -gt 0) { $tbl['basedOn'] = $basedOn }
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
#
|
#
|
||||||
# Зеркало meta-decompile.ps1 (КАНОН). Структура 1:1 — те же имена функций, порядок, комментарии.
|
# Зеркало meta-decompile.ps1 (КАНОН). Структура 1:1 — те же имена функций, порядок, комментарии.
|
||||||
@@ -2272,6 +2272,15 @@ def main():
|
|||||||
t_et = TP('EditType')
|
t_et = TP('EditType')
|
||||||
if t_et and t_et != 'InDialog':
|
if t_et and t_et != 'InDialog':
|
||||||
tbl['editType'] = t_et
|
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)]
|
based_on = [_text(it) for it in tp.findall('md:BasedOn/xr:Item', NS)]
|
||||||
if based_on:
|
if based_on:
|
||||||
tbl['basedOn'] = based_on
|
tbl['basedOn'] = based_on
|
||||||
|
|||||||
@@ -2145,6 +2145,9 @@ ChildObjects и модулей.
|
|||||||
|
|
||||||
Неверная пара не отвергается схемой формы — она валит загрузку всей конфигурации
|
Неверная пара не отвергается схемой формы — она валит загрузку всей конфигурации
|
||||||
«Исключением XDTO при чтении файла», не называя причины, поэтому `form-add` проверяет её сам.
|
«Исключением XDTO при чтении файла», не называя причины, поэтому `form-add` проверяет её сам.
|
||||||
|
- Слоты `default*Form` таблицы декомпилятор снимает — как у прочих объектов. Собранная из такого
|
||||||
|
DSL конфигурация сама по себе не загрузится («Неизвестный объект метаданных — …Form.ФормаСписка»): файлы форм
|
||||||
|
создаёт навык `form-add`. Это та же договорённость, что для справочников и документов.
|
||||||
- **Таблица без ключевых полей** собирается: загрузку XML платформа принимает молча, хотя
|
- **Таблица без ключевых полей** собирается: загрузку XML платформа принимает молча, хотя
|
||||||
Конфигуратор интерактивно ключ требует. `meta-validate` предупреждает, но не отвергает — рабочие
|
Конфигуратор интерактивно ключ требует. `meta-validate` предупреждает, но не отвергает — рабочие
|
||||||
конфигурации без ключей существуют. Без ключа недоступны форма записи и набор записей.
|
конфигурации без ключей существуют. Без ключа недоступны форма записи и набор записей.
|
||||||
|
|||||||
@@ -31,7 +31,8 @@
|
|||||||
"nameInDataSource": "cost_net",
|
"nameInDataSource": "cost_net",
|
||||||
"readOnly": true
|
"readOnly": true
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"defaultListForm": "ExternalDataSource.PG.Table.products.Form.ФормаСписка"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"functions": {
|
"functions": {
|
||||||
@@ -67,7 +68,8 @@
|
|||||||
"photo: BinaryData | nullable",
|
"photo: BinaryData | nullable",
|
||||||
"\"nameInDataSource\": \"cost_net\"",
|
"\"nameInDataSource\": \"cost_net\"",
|
||||||
"\"nextKey\": \"NEXT VALUE FOR public.seq_key\"",
|
"\"nextKey\": \"NEXT VALUE FOR public.seq_key\"",
|
||||||
"sig: BinaryData(256,fixed) | nullable"
|
"sig: BinaryData(256,fixed) | nullable",
|
||||||
|
"\"defaultListForm\": \"ExternalDataSource.PG.Table.products.Form.ФормаСписка\""
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
+1
-1
@@ -66,7 +66,7 @@
|
|||||||
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||||
<DefaultObjectForm/>
|
<DefaultObjectForm/>
|
||||||
<DefaultRecordForm/>
|
<DefaultRecordForm/>
|
||||||
<DefaultListForm/>
|
<DefaultListForm>ExternalDataSource.PG.Table.products.Form.ФормаСписка</DefaultListForm>
|
||||||
<DefaultChoiceForm/>
|
<DefaultChoiceForm/>
|
||||||
<ObjectPresentation/>
|
<ObjectPresentation/>
|
||||||
<ExtendedObjectPresentation/>
|
<ExtendedObjectPresentation/>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
"keyFields": ["id"],
|
"keyFields": ["id"],
|
||||||
"presentationField": "name",
|
"presentationField": "name",
|
||||||
"transactionsIsolationLevel": "ReadUncommitted",
|
"transactionsIsolationLevel": "ReadUncommitted",
|
||||||
|
"defaultListForm": "ExternalDataSource.PG.Table.products.Form.ФормаСписка",
|
||||||
"fields": [
|
"fields": [
|
||||||
"id: Number(10,0)",
|
"id: Number(10,0)",
|
||||||
"name: String(150)",
|
"name: String(150)",
|
||||||
|
|||||||
Reference in New Issue
Block a user