feat(meta-validate,meta-compile): гард на нераспознанное имя типа, два уровня

Неизвестное имя типа проходило насквозь молча: meta-compile писал его в XML дословно
(<v8:Type>varchar(150)</v8:Type>), meta-validate не смотрел на скалярные типы вовсе — проверка 16
разбирает только ссылочные с известным префиксом. Отказ приходил лишь от платформы при загрузке
всей конфигурации, без указания объекта и реквизита. Так вело себя и имя типа СУБД, и опечатка.

meta-validate, проверка 22 — два уровня, потому что «невалидно» и «нам незнакомо» разные вещи:

  Уровень 1, грамматика (ERROR). Содержимое <v8:Type> всегда несёт префикс пространства имён;
  голое имя платформа не примет никогда, независимо от её версии и состава конфигурации.
  Сюда же неверная форма ссылочного типа.

  Уровень 2, словарь по контексту владельца (WARN). У хранимого объекта набор типов у́же, чем
  у обработки или отчёта, где доступны ТаблицаЗначений, ОписаниеТипов, Картинка. Замер по корпусу
  подтверждает разделение: v8:ValueTable/ValueTree/StandardPeriod в объектных файлах acc и erp
  встречаются только у обработок и отчётов, у хранимых — ноль.

Оставлено предупреждением намеренно: словарь — та часть, которая расширяется с версиями платформы,
и цена ложной ошибки выше пользы. Жёстко только там, где решает грамматика.

meta-compile отвергает голое неизвестное имя с перечнем допустимых форм. Имя с готовым префиксом
(v8:ValueTable, ent:AccountType, v8ui:Color) по-прежнему проходит как есть — это законный ввод,
и правильность имени судит валидатор, которому виден весь файл.

check-type-synonyms.mjs — новый гард: по общему ключу meta-edit обязан понимать то же, что
meta-compile (авторитет). Отсутствие ключа допустимо, разное значение — нет.

Проверено:
- корпус, 23430 объектов четырёх выгрузок: ноль ошибок и ноль предупреждений проверки 22;
  на реальном справочнике разбирается 88 имён типов, то есть проверка работает, а не молчит;
- раундтрип A, 13788 объектов: побайтово как эталон, compile-fail 0 — отказ компилятора
  не задел ни одного законного типа;
- meta-compile 94/94 и meta-validate 48/48 в обоих рантаймах, 11 гардов;
- снэпшот type-with-prefix-passthrough принят платформой 8.3.24.1691.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi
This commit is contained in:
Nick Shirokov
2026-09-07 13:50:23 +03:00
co-authored by Claude Opus 5
parent eccb11b0ed
commit ed160c65b5
22 changed files with 1219 additions and 11 deletions
+24
View File
@@ -79,6 +79,23 @@ JSON DSL для описания объектов метаданных конф
| `Time` | `xs:dateTime` + DateFractions=Time (только время) |
| `ValueStorage` | `v8:ValueStorage` (ХранилищеЗначения) |
| `UUID` | `v8:UUID` (УникальныйИдентификатор) |
| `BinaryData` или `BinaryData(N[,fixed\|variable])` | `xs:base64Binary` + BinaryDataQualifiers (ДвоичныеДанные) |
Типы СУБД на входе компилятор переводит сам — соответствие замерено на стенде PostgreSQL и совпадает
с тем, что делает Конфигуратор при импорте структуры таблицы:
| Тип СУБД | Тип 1С | | Тип СУБД | Тип 1С |
|---|---|---|---|---|
| `integer`, `int`, `int4` | `Number(10,0)` | | `timestamp` | `DateTime` |
| `bigint`, `int8` | `Number(19,0)` | | `date` | `Date` |
| `smallint`, `int2` | `Number(5,0)` | | `uuid` | `UUID` |
| `varchar(n)`, `character varying(n)` | `String(n)` | | `bytea` | `BinaryData` |
| `numeric(p,s)`, `decimal(p,s)` | `Number(p,s)` | | | |
Важное ограничение: типы 1С получает ОТ ДРАЙВЕРА ODBC, а не из схемы БД. Поэтому `boolean`
в список НЕ входит: в DSL это Булево, а psqlODBC при реальном импорте отдаёт `Строка(5)` (опция
драйвера *Bools as Char*). `text`, `real`, `double precision`, `money`, `json` и массивы не поддержаны —
для них замера нет.
### 3.2 Ссылочные типы
@@ -96,6 +113,13 @@ JSON DSL для описания объектов метаданных конф
| `DefinedType.Xxx` | `cfg:DefinedType.Xxx` (через `v8:TypeSet`) |
| `Characteristic.Xxx` | `cfg:Characteristic.Xxx` (через `v8:TypeSet`) |
| `CatalogRef` / `DocumentRef` / … / `AnyRef` / `AnyIBRef` (голый, без имени) | `cfg:<метатип>` (через `v8:TypeSet`) |
| `BusinessProcessRoutePointRef.Xxx` | `cfg:BusinessProcessRoutePointRef.Xxx` (точка маршрута) |
| `ExternalDataSourceTableRef.<Источник>.<Таблица>` | `cfg:ExternalDataSourceTableRef.И.Т` (имя трёхчастное) |
Ссылаться на таблицу внешнего источника можно, только если у неё `tableDataType: ObjectData`.
При `NonobjectData` платформа отвечает «Неизвестное имя типа» — хотя категория `Ref` в `GeneratedType`
такой таблицы объявлена наравне с остальными семью. Замерено на 8.3.24.1691.
**Тип-множество (`v8:TypeSet`)** — тип, подразумевающий набор типов:
- `DefinedType.Xxx` (Определяемый тип) и `Characteristic.Xxx` (значение Характеристики из ПВХ — «Вид субконто»/