Files
cc-1c-skills/tests/skills/cases/meta-compile/external-data-source.json
T
Nick ShirokovandClaude Opus 5 6dde36a690 feat(meta-compile): создание внешних источников данных
Вид ExternalDataSource навыки meta-* не поддерживали вовсе: в корпусе выгрузок его нет
ни одного, формат был неизвестен. Разведан на стенде (PostgreSQL в Docker + база 8.3.24)
и по реальной выгрузке рабочего проекта.

meta-compile собирает источник целиком одним JSON: сам источник, его таблицы с полями
и функции. Единственный вид, у которого объект складывается более чем из одного XML —
файл источника плюс по файлу на таблицу в <Источник>/Tables/.

DSL без новых конвенций: tables — dict имя → массив полей ЛИБО объект (как tabularSections),
поле — обычный реквизит плюс три своих ключа (nameInDataSource/readOnly/allowNull),
ссылки на поля короткими именами (как inputByString у справочника), functions — dict
имя → строка ИЛИ объект (как urlTemplates). Параметры функций не объекты метаданных:
они живут в самом выражении как &1, &2.

Инструкция под каскадом: в SKILL.md строка индекса, вся специфика — в
reference/external-data-source.md.

meta-validate принимает ExternalDataSource и Table, знает их наборы GeneratedType,
состав ChildObjects и шестичастную ссылку на форму таблицы. Проверено на выгрузке
платформы и на чужой рабочей выгрузке из другого проекта — обе проходят чисто.

Раундтрип на платформе 8.3.24.1691: наш эмит → загрузка → выгрузка даёт файлы,
идентичные поданным (с точностью до uuid). Два поведения платформы пришлось воспроизвести
явно, оба измерены: ввод по строке выводится из поля представления, а заданное значение
незаполненного родителя платформа при загрузке XML сбрасывает в пустую строку — задать
его можно только интерактивно.

Спека: раздел «Внешние источники данных» в 1c-config-objects-spec.md, формат ссылок,
наборы GeneratedType, строка в индексе спек.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi
2026-09-05 20:53:37 +03:00

72 lines
2.6 KiB
JSON

{
"name": "Внешний источник данных: таблицы, поля, функция",
"input": {
"type": "ExternalDataSource",
"name": "PG",
"dataLockControlMode": "AutomaticAndManaged",
"tables": {
"prices": ["product_id: Number(10,0)", "period: Date", "price: Number(15,2)"],
"products": {
"nameInDataSource": "eds.public.products",
"tableDataType": "ObjectData",
"keyFields": ["id"],
"presentationField": "name",
"parentField": "parent_id",
"dataVersionField": "row_ver",
"transactionsIsolationLevel": "ReadUncommitted",
"dataLockFields": ["id"],
"fields": [
"id: Number(10,0)",
"name: String(150)",
"article: String(50) | nullable",
"parent_id: ExternalDataSourceTableRef.PG.products | nullable",
"row_ver: Number(19,0) | readonly"
]
},
"byParent": {
"tableType": "Expression",
"expressionInDataSource": "public.f_products_by_parent(&1)",
"fields": ["id: Number(10,0)", "name: String(150)"]
}
},
"functions": {
"total": { "expression": "public.f_total(&1, &2)", "returns": "Number(15,2)" },
"nextKey": "NEXT VALUE FOR public.seq_key"
}
},
"validatePath": "ExternalDataSources/PG",
"expect": {
"files": [
"ExternalDataSources/PG.xml",
"ExternalDataSources/PG/Tables/products.xml",
"ExternalDataSources/PG/Tables/prices.xml",
"ExternalDataSources/PG/Tables/byParent.xml"
],
"fileContains": [
{
"file": "ExternalDataSources/PG/Tables/products.xml",
"text": [
"<v8:Type>cfg:ExternalDataSourceTableRef.PG.products</v8:Type>",
"<xr:Field>ExternalDataSource.PG.Table.products.Field.id</xr:Field>",
"<PresentationField>ExternalDataSource.PG.Table.products.Field.name</PresentationField>",
"<UnfilledParentValue xsi:type=\"xs:string\"/>",
"<TransactionsIsolationLevel>ReadUncommitted</TransactionsIsolationLevel>",
"<NameInDataSource>eds.public.products</NameInDataSource>"
]
},
{
"file": "ExternalDataSources/PG/Tables/byParent.xml",
"text": ["<TableType>Expression</TableType>", "<NameInDataSource/>", "public.f_products_by_parent(&amp;1)"]
},
{
"file": "ExternalDataSources/PG.xml",
"text": [
"<DataLockControlMode>AutomaticAndManaged</DataLockControlMode>",
"<Table>products</Table>",
"<ExpressionInDataSource>public.f_total(&amp;1, &amp;2)</ExpressionInDataSource>"
]
}
]
}
}