Вид 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
7.9 KiB
ExternalDataSource (внешний источник данных)
Источник описывается одним JSON целиком: сам источник, его таблицы с полями и функции.
Компилятор пишет несколько файлов — ExternalDataSources/<Имя>.xml и по файлу на таблицу
в ExternalDataSources/<Имя>/Tables/.
Параметров соединения в конфигурации нет: строка соединения, пользователь, пароль и тип СУБД задаются в режиме «Предприятие» и хранятся в базе. В DSL их указывать негде и не нужно.
{
"type": "ExternalDataSource",
"name": "PG",
"tables": {
"prices": ["product_id: Number(10,0)", "period: Date", "price: Number(15,2)"],
"products": {
"nameInDataSource": "eds.public.products",
"tableDataType": "ObjectData",
"keyFields": ["id"],
"presentationField": "name",
"fields": [
"id: Number(10,0)",
"name: String(150)",
"article: String(50) | nullable",
"parent_id: ExternalDataSourceTableRef.PG.products | nullable"
]
}
},
"functions": {
"total": { "expression": "public.f_total(&1, &2)", "returns": "Number(15,2)" }
}
}
Свойства источника
| Ключ | Умолчание | Значения |
|---|---|---|
dataLockControlMode |
Automatic |
Automatic / Managed / AutomaticAndManaged |
tables |
{} |
таблицы (см. ниже) |
functions |
{} |
функции (см. ниже) |
При AutomaticAndManaged режим блокировок решает каждая таблица сама; при конкретном значении
одноимённое свойство таблицы игнорируется платформой.
Таблицы
Ключ — имя таблицы в конфигурации. Значение — массив полей либо объект со свойствами
и ключом fields (та же двойственность, что у tabularSections справочника).
| Ключ | Умолчание | Значения |
|---|---|---|
nameInDataSource |
= имя таблицы | имя физической таблицы; у платформы это <база>.<схема>.<таблица> |
tableType |
Table |
Table — таблица или представление; Expression — табличная функция |
expressionInDataSource |
пусто | выражение для Expression, напр. public.f_by_parent(&1); имя базы не указывается |
tableDataType |
NonobjectData |
ObjectData (запись определяется одним полем) / NonobjectData |
keyFields |
[] |
имена ключевых полей |
presentationField |
пусто | имя поля представления (только ObjectData) |
parentField |
пусто | имя поля родителя; его тип должен быть ссылкой на эту же таблицу |
unfilledParentValue |
null |
значение «нет родителя»; null → NULL, число/строка → «Заданное значение» |
inputByString |
[] |
имена полей ввода по строке |
dataVersionField |
пусто | имя поля версии данных |
dataLockFields |
[] |
имена полей блокировки |
readOnly |
false |
запрет записи |
transactionsIsolationLevel |
Auto |
Auto / ReadUncommitted / ReadCommitted / RepeatableRead / Serializable |
dataLockControlMode |
Automatic |
Automatic / Managed / AutomaticAndManaged |
basedOn |
[] |
ввод на основании, ссылки вида Catalog.Контрагенты |
useStandardCommands |
true |
bool |
quickChoice |
false |
bool |
editType |
InDialog |
InDialog / InList |
fields |
[] |
поля (см. ниже); синоним — columns |
Ссылки на поля (keyFields, presentationField, parentField, dataVersionField,
inputByString, dataLockFields) задаются короткими именами — компилятор разворачивает их
в полный путь ExternalDataSource.<Источник>.Table.<Таблица>.Field.<Поле>.
Прочие свойства — представления (objectPresentation, listPresentation, …), формы по умолчанию
(defaultObjectForm, defaultListForm, …), characteristics, explanation,
includeHelpInContents — как у справочника.
Поля
Строковая и объектная форма — те же, что у реквизитов (см. attributes.md). Своих ключа три:
| Ключ | Умолчание | Значения |
|---|---|---|
nameInDataSource |
= имя поля | имя колонки; в одинарных кавычках уходит в SQL как есть |
readOnly |
false |
поле не записывается (вычисляемые, автоинкрементные) |
allowNull |
false |
допускает NULL |
Флаги строковой формы: readonly, nullable.
"fields": [
"id: Number(10,0) | readonly",
{ "name": "article", "type": "String(50)", "nameInDataSource": "art_code", "allowNull": true }
]
Допустимые типы: Number, String, Date, Boolean, UUID, BinaryData и ссылка на таблицу
внешнего источника — ExternalDataSourceTableRef.<Источник>.<Таблица>.
Составной тип запрещён платформой — она отвергает загрузку с ошибкой «Поле не может иметь составной тип», поэтому компилятор отказывает сразу.
Функции
Ключ — имя функции. Значение — строка (интерпретируется как expression) либо объект.
| Ключ | Умолчание | Значения |
|---|---|---|
expression |
— | выражение в источнике, обязательный |
returns |
String |
тип возвращаемого значения |
returnValue |
true |
false — процедура, тип не пишется |
Параметры функции не являются объектами метаданных: они записываются прямо в выражении как
&1, &2. Необязательные — в фигурных скобках f(&1{, &2}), переменное число — &n[]
(только последним).
"functions": {
"nextKey": "NEXT VALUE FOR dbo.SimpleSequence",
"total": { "expression": "public.f_total(&1, &2)", "returns": "Number(15,2)" }
}
Чего компилятор не делает
- Кубы OLAP (
Cube,DimensionTable,Dimension,Resource) не поддерживаются. - Формы и модули таблиц не создаются — как и у прочих объектов, для форм есть
form-addиform-compile.
Пустой ключ таблицы — предупреждение, не ошибка
Конфигуратор интерактивно требует keyFields, а загрузка XML принимает таблицу без ключа молча.
Рабочие конфигурации без ключей существуют, поэтому компилятор такую таблицу собирает, а
meta-validate предупреждает. Без ключа недоступны форма записи и набор записей.