feat(meta-validate): проверка ссылок на поля таблицы внешнего источника

Свойства таблицы ссылаются на её же поля шестичастным путём
(ExternalDataSource.И.Table.Т.Field.П). Опечатка в имени поля даёт «Неизвестный объект
метаданных» при загрузке, а глазами в таком пути её не видно. Проверка 21 разбирает форму
пути, требует, чтобы таблица в ссылке была той же самой, и чтобы поле существовало —
в сообщении перечисляются имеющиеся поля.

Отдельно: таблица без ключевых полей даёт предупреждение, а не ошибку. Загрузку XML такой
таблицы платформа принимает молча (измерено на 8.3.24.1691), Конфигуратор интерактивно
требует ключ, а рабочие конфигурации без ключей существуют — значит это повод предупредить,
а не отвергнуть.

Закрыты последние пункты плана: раздел про внешние источники в docs/meta-dsl-spec.md
(формой и связями с общими конвенциями, без дублирования таблицы свойств — она живёт
в reference навыка) и кейсы meta-validate, включая негативный.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi
This commit is contained in:
Nick Shirokov
2026-09-06 15:35:56 +03:00
co-authored by Claude Opus 5
parent 24cfe6a0a6
commit 89ce1af9fa
18 changed files with 1576 additions and 2 deletions
+30
View File
@@ -1958,3 +1958,33 @@ ChildObjects и модулей.
| `direction` | `In` | Направление: `In` / `Out` / `InOut` |
Если значение — строка, интерпретируется как `type`.
---
## 18. Внешние источники данных (tables / functions)
Только для `ExternalDataSource`. Полное описание — `.claude/skills/meta-compile/reference/external-data-source.md`:
таблицы, поля и функции, их свойства и умолчания. Здесь — только форма и связи с общими конвенциями,
чтобы таблица свойств не жила в двух местах и не разъезжалась.
```json
{ "type": "ExternalDataSource", "name": "PG",
"tables": {
"prices": ["product_id: Number(10,0)", "price: Number(15,2)"],
"products": { "keyFields": ["id"], "presentationField": "name",
"fields": ["id: Number(10,0)", "name: String(150)"] }
},
"functions": { "total": { "expression": "public.f_total(&1, &2)", "returns": "Number(15,2)" } } }
```
- **`tables`** — dict имя → массив полей ЛИБО объект со свойствами и ключом `fields`: та же двойственность,
что у `tabularSections` (§5).
- **Поле** — обычный реквизит (§4) плюс три своих ключа: `nameInDataSource`, `readOnly`, `allowNull`
(флаги строковой формы — `readonly`, `nullable`). Составной тип у поля платформа запрещает.
- **Ссылки на поля** (`keyFields`, `presentationField`, `parentField`, `dataVersionField`, `inputByString`,
`dataLockFields`) — короткими именами полей этой же таблицы, как `inputByString` у справочника (§7.1.5).
- **`functions`** — dict имя → строка (выражение) ЛИБО объект, как `urlTemplates` (§16) и `operations` (§17).
Параметры не объекты: они записаны в самом выражении как `&1`, `&2`.
Кубы OLAP не поддерживаются. Таблица — отдельный файл, поэтому `meta-compile` описывает источник целиком,
а дописать таблицу или функцию в существующий умеет `meta-edit` (`add.tables` / `add.functions`).