feat(meta-compile,meta-decompile): object-списки InputByString/DataLockFields/BasedOn (v1.28/v0.19)

Три object-блока каталога компилятор хардкодил (InputByString={Descr,Code},
DataLockFields/BasedOn пустые), декомпилятор не захватывал.

Class-2 фикс InputByString: хардкод → вывод из Code/DescriptionLength
([Descr при D>0]+[Code при C>0]) — покрывает 88.5% каталогов, убил каскад
Field ADDED=80 (у 1057/1640 InputByString = только Наименование).

Class-3 DSL:
  • inputByString — массив имён полей (авто-резолв через Expand-DataPath,
    как dataPath), [] = пусто; декомпилятор эмитит только при отличии от дефолта.
  • dataLockFields — поля блокировки, omit-on-empty.
  • basedOn — «ввод на основании», MDObjectRef verbatim, omit-on-empty.
Хелперы Emit-FieldBlock/Emit-BasedOn (+py-порт); декомпилятор Short-Field
(частичная форма StandardAttribute.X/Attribute.X для dogfood резолвера).

Class-2 ловушка PS: пустой @() в позиц.параметр схлопывается в $null, а
@($null) = массив из 1 null → пустой <xr:Field>. Фикс — Where-Object фильтр.

Роундтрип 120 объектов: match 20→94, TOTAL 305→183 (−122), DataLockFields
35→0, InputByString/BasedOn=0, новых diff не внесено. Override-кейсы (реверс,
+реквизит, пустой, codeonly, dlf, basedOn) роундтрипятся чисто. Регресс 46/46
ps1+py, ps1↔py identical. spec §7.1.5, кейс catalog-inputbystring-datalock.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-07-04 14:07:53 +03:00
parent e95fb6b619
commit 65c4fba471
10 changed files with 622 additions and 15 deletions
+29
View File
@@ -347,6 +347,9 @@ JSON DSL для описания объектов метаданных конф
| `extendedListPresentation` | пусто | ExtendedListPresentation (ML) |
| `explanation` | пусто | Explanation (ML) |
| `standardAttributes` | *(ключа нет → блок опущен)* | StandardAttributes |
| `inputByString` | *(ключа нет → авто-вывод)* | InputByString (поля ввода по строке, §7.1.5) |
| `dataLockFields` | `[]` | DataLockFields (поля блокировки данных, §7.1.5) |
| `basedOn` | `[]` | BasedOn (ввод на основании, §7.1.5) |
| `characteristics` | `[]` | Characteristics (привязка ПВХ, §7.1.4) |
| `attributes` | `[]` | → Attribute в ChildObjects |
| `tabularSections` | `{}` | → TabularSection в ChildObjects |
@@ -485,6 +488,32 @@ JSON DSL для описания объектов метаданных конф
Декомпилятор пишет короткую форму (поля голые/частичные, `filterValue` без каталога, `from` полный).
#### 7.1.5 `inputByString` / `dataLockFields` / `basedOn` — object-списки полей
Три списка object-уровня. Имена полей — прощающий ввод как `dataPath`: голое стандартное (`Наименование`/`Код`/
`Владелец`, RU→EN) → `<Тип>.<Объект>.StandardAttribute.<EN>`; голое обычное → `Attribute.<имя>`;
частичное `StandardAttribute.X`/`Attribute.X` → + префикс; полный путь → как есть.
- **`inputByString`** — поля быстрого ввода по строке (`<InputByString>`). **Дефолт выводится** из наличия Кода/
Наименования: `[Наименование при descriptionLength>0] + [Код при codeLength>0]` — покрывает ~88% каталогов, ключ не
нужен. Задавать только при отличии: другой порядок, подмножество, добавленные реквизиты, или **пустой список `[]`**
(быстрый ввод выключен).
```json
"inputByString": ["Код", "Наименование", "Контрагент"] // порядок + реквизит
"inputByString": [] // явно пусто
```
- **`dataLockFields`** — поля управляемой блокировки данных (`<DataLockFields>`). По умолчанию пусто; массив имён полей.
```json
"dataLockFields": ["Организация", "Контрагент", "Владелец"]
```
- **`basedOn`** — «ввод на основании» (`<BasedOn>`), список ссылок на объекты метаданных (`MDObjectRef`) verbatim.
```json
"basedOn": ["Catalog.Контрагенты", "Document.ЗаказПоставщику"]
```
Декомпилятор: `inputByString` — только при отличии от выведенного дефолта (иначе опущен); `dataLockFields`/`basedOn` —
omit-on-empty. Поля пишутся частичной формой (`StandardAttribute.X`/`Attribute.X`).
### 7.2 Document
| Поле JSON | Умолчание | XML элемент |