Files
cc-1c-skills/.claude/skills/meta-compile/reference/external-data-source.md
T
Nick ShirokovandClaude Opus 5 24cfe6a0a6 feat(meta-decompile): разбор внешних источников данных и раундтрип
Декомпилятор собирает DSL источника целиком: читает файл источника, подтягивает файлы таблиц
из <Источник>/Tables/ и складывает поля, ключи, ссылки и функции обратно в тот же синтаксис,
который принимает meta-compile. Ссылки на поля возвращаются короткими именами, таблица без
собственных свойств — коротким массивом полей, функция с типом по умолчанию — одной строкой.

Это замыкает дешёвый контур проверки: XML → декомпиляция → компиляция → сравнение с исходником,
без 1С и без Docker. На нём и проверено: наша выгрузка, выгрузка платформы и четыре таблицы
внешних источников из чужого рабочего проекта возвращаются байт в байт. У выгрузки платформы
остаются два известных расхождения: значение незаполненного родителя (платформа сама сбрасывает
его при любой загрузке) и формы (декомпилятор их не захватывает — так задумано).

Побочно закрыт дефект, к внешним источникам не относящийся: xs:base64Binary разбирался как
ХранилищеЗначения, хотя это ДвоичныеДанные. Различать их можно по квалификаторам —
у ХранилищеЗначения платформа пишет v8:ValueStorage, а у двоичных данных есть
BinaryDataQualifiers. Компилятор научен типу BinaryData (и BinaryData(N)) — до этого он
принимал такое имя, но эмитил его как есть, то есть невалидный XML.

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

8.3 KiB

ExternalDataSource (внешний источник данных)

Источник описывается одним JSON целиком: сам источник, его таблицы с полями и функции. Результат — ExternalDataSources/<Имя>.xml плюс по файлу на таблицу в <Имя>/Tables/.

Строку соединения, пользователя, пароль и тип СУБД задавать не нужно: в конфигурации их нет, они настраиваются в режиме «Предприятие» и хранятся в базе.

{
  "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 — табличная функция
readOnly false запрет записи; ставь true для представлений и таблиц вида Expression — писать в них нельзя
expressionInDataSource пусто выражение для Expression, напр. public.f_by_parent(&1); имя базы не указывается
tableDataType NonobjectData ObjectData (запись определяется одним полем) / NonobjectData
keyFields [] имена ключевых полей; без них таблица собирается, но недоступны форма записи и набор записей
presentationField пусто имя поля представления (только ObjectData)
parentField пусто имя поля родителя; его тип должен быть ссылкой на эту же таблицу
inputByString [] имена полей ввода по строке; ключа нет → берётся presentationField
dataVersionField пусто имя поля версии данных
dataLockFields [] имена полей блокировки
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) задаются короткими именами полей этой же таблицы.

Прочие свойства — представления (objectPresentation, listPresentation, …), формы по умолчанию (defaultObjectForm, defaultListForm, …), characteristics, explanation, includeHelpInContents — как у справочника.

Значение незаполненного родителя загрузкой XML не задаётся — платформа сбрасывает его в пустое при любой загрузке, включая загрузку собственной выгрузки. Ставится только в Конфигураторе вручную.

Поля

Строковая и объектная форма — те же, что у реквизитов (см. 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 (двоичные данные; BinaryData(N) — с ограничением длины) и ссылка на таблицу внешнего источника — 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)" }
}

Добавить в существующий источник

meta-compile описывает источник целиком: повторный запуск заменяет его файл и выдаёт новый uuid, а таблицы, которых нет в описании, останутся на диске сиротами. Чтобы дописать таблицу или функцию в уже существующий источник, есть meta-edit:

{ "add": {
  "tables": { "sales": { "keyFields": ["id"], "fields": ["id: Number(10,0)", "summa: Number(15,2)"] } },
  "functions": { "nextKey": "NEXT VALUE FOR public.seq_key" }
} }

Удалить таблицу — meta-remove ExternalDataSource.<Источник>.Table.<Таблица>.

Не поддерживается

  • Кубы OLAP (Cube, DimensionTable, Dimension, Resource).
  • Формы и модули таблиц — формы добавляют form-add и form-compile.