diff --git a/.claude/skills/meta-compile/reference/external-data-source.md b/.claude/skills/meta-compile/reference/external-data-source.md index c900aa942..04413fd99 100644 --- a/.claude/skills/meta-compile/reference/external-data-source.md +++ b/.claude/skills/meta-compile/reference/external-data-source.md @@ -1,11 +1,10 @@ # ExternalDataSource (внешний источник данных) Источник описывается **одним JSON целиком**: сам источник, его таблицы с полями и функции. -Компилятор пишет несколько файлов — `ExternalDataSources/<Имя>.xml` и по файлу на таблицу -в `ExternalDataSources/<Имя>/Tables/`. +Результат — `ExternalDataSources/<Имя>.xml` плюс по файлу на таблицу в `<Имя>/Tables/`. -Параметров соединения в конфигурации нет: строка соединения, пользователь, пароль и тип СУБД -задаются в режиме «Предприятие» и хранятся в базе. В DSL их указывать негде и не нужно. +Строку соединения, пользователя, пароль и тип СУБД задавать не нужно: в конфигурации их нет, +они настраиваются в режиме «Предприятие» и хранятся в базе. ```json { @@ -50,18 +49,17 @@ | Ключ | Умолчание | Значения | |------|-----------|----------| -| `nameInDataSource` | = имя таблицы | имя физической таблицы; у платформы это `<база>.<схема>.<таблица>` | +| `nameInDataSource` | = имя таблицы | имя физической таблицы; для реляционной СУБД обычно `<база>.<схема>.<таблица>` | | `tableType` | `Table` | `Table` — таблица или представление; `Expression` — табличная функция | +| `readOnly` | `false` | запрет записи; ставь `true` для представлений и таблиц вида `Expression` — писать в них нельзя | | `expressionInDataSource` | пусто | выражение для `Expression`, напр. `public.f_by_parent(&1)`; имя базы не указывается | | `tableDataType` | `NonobjectData` | `ObjectData` (запись определяется одним полем) / `NonobjectData` | -| `keyFields` | `[]` | имена ключевых полей | +| `keyFields` | `[]` | имена ключевых полей; без них таблица собирается, но недоступны форма записи и набор записей | | `presentationField` | пусто | имя поля представления (только `ObjectData`) | | `parentField` | пусто | имя поля родителя; его тип должен быть ссылкой на эту же таблицу | -| `unfilledParentValue` | `null` | значение «нет родителя»; `null` → NULL, число/строка → «Заданное значение» | -| `inputByString` | `[]` | имена полей ввода по строке | +| `inputByString` | `[]` | имена полей ввода по строке; ключа нет → берётся `presentationField` | | `dataVersionField` | пусто | имя поля версии данных | | `dataLockFields` | `[]` | имена полей блокировки | -| `readOnly` | `false` | запрет записи | | `transactionsIsolationLevel` | `Auto` | `Auto` / `ReadUncommitted` / `ReadCommitted` / `RepeatableRead` / `Serializable` | | `dataLockControlMode` | `Automatic` | `Automatic` / `Managed` / `AutomaticAndManaged` | | `basedOn` | `[]` | ввод на основании, ссылки вида `Catalog.Контрагенты` | @@ -71,13 +69,15 @@ | `fields` | `[]` | поля (см. ниже); синоним — `columns` | Ссылки на поля (`keyFields`, `presentationField`, `parentField`, `dataVersionField`, -`inputByString`, `dataLockFields`) задаются **короткими именами** — компилятор разворачивает их -в полный путь `ExternalDataSource.<Источник>.Table.<Таблица>.Field.<Поле>`. +`inputByString`, `dataLockFields`) задаются **короткими именами полей** этой же таблицы. Прочие свойства — представления (`objectPresentation`, `listPresentation`, …), формы по умолчанию (`defaultObjectForm`, `defaultListForm`, …), `characteristics`, `explanation`, `includeHelpInContents` — как у справочника. +**Значение незаполненного родителя через DSL не задать**: платформа сбрасывает его при загрузке +XML. Если оно нужно, его ставят в Конфигураторе вручную. + ## Поля Строковая и объектная форма — те же, что у реквизитов (см. `attributes.md`). Своих ключа три: @@ -100,8 +100,7 @@ Допустимые типы: `Number`, `String`, `Date`, `Boolean`, `UUID`, `BinaryData` и ссылка на таблицу внешнего источника — `ExternalDataSourceTableRef.<Источник>.<Таблица>`. -**Составной тип запрещён платформой** — она отвергает загрузку с ошибкой «Поле не может иметь -составной тип», поэтому компилятор отказывает сразу. +**Составной тип у поля недопустим** — платформа такую конфигурацию не загружает. ## Функции @@ -113,9 +112,8 @@ | `returns` | `String` | тип возвращаемого значения | | `returnValue` | `true` | `false` — процедура, тип не пишется | -Параметры функции **не являются объектами метаданных**: они записываются прямо в выражении как -`&1`, `&2`. Необязательные — в фигурных скобках `f(&1{, &2})`, переменное число — `&n[]` -(только последним). +Параметры описываются прямо в выражении как `&1`, `&2` — отдельного ключа для них нет. +Необязательные — в фигурных скобках `f(&1{, &2})`, переменное число — `&n[]` (только последним). ```json "functions": { @@ -124,14 +122,7 @@ } ``` -## Чего компилятор не делает +## Не поддерживается -- **Кубы OLAP** (`Cube`, `DimensionTable`, `Dimension`, `Resource`) не поддерживаются. -- **Формы и модули** таблиц не создаются — как и у прочих объектов, для форм есть `form-add` - и `form-compile`. - -## Пустой ключ таблицы — предупреждение, не ошибка - -Конфигуратор интерактивно требует `keyFields`, а загрузка XML принимает таблицу без ключа молча. -Рабочие конфигурации без ключей существуют, поэтому компилятор такую таблицу собирает, а -`meta-validate` предупреждает. Без ключа недоступны форма записи и набор записей. +- **Кубы OLAP** (`Cube`, `DimensionTable`, `Dimension`, `Resource`). +- **Формы и модули** таблиц — формы добавляют `form-add` и `form-compile`.