mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-08 03:00:52 +03:00
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:
co-authored by
Claude Opus 5
parent
eccb11b0ed
commit
ed160c65b5
@@ -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` (значение Характеристики из ПВХ — «Вид субконто»/
|
||||
|
||||
Reference in New Issue
Block a user