fix(meta-*): двоичные данные с длиной, корень реестра в py, ХранилищеЗначения в meta-info

Мелкие находки ревью, по одному кейсу на каждую:

- meta-compile: BinaryData(N[,fixed|variable]) — фиксированная длина больше не теряется;
  голая форма по-прежнему 4294967292/Fixed, как её пишет платформа при импорте из СУБД.
  Посторонний текст в скобках (BinaryData(abc)) отвергается, а не даёт тихий безлимит —
  PS принимал его и молча подставлял дефолт, py такой тип не понимал вовсе.
- meta-decompile: сворачивает в голый BinaryData только точное совпадение с этим дефолтом.
- meta-info: xs:base64Binary без квалификаторов — вторая форма ХранилищаЗначения, а не
  двоичные данные; раньше два навыка читали один и тот же узел по-разному.
- meta-remove (py): в ветке «файлов нет» корень реестра был жёстко Configuration, поэтому
  осиротевшая таблица внешнего источника не находилась и навык падал, тогда как PS её
  разрегистрировал. Сообщение в обоих портах теперь называет реальный реестр.

Проверено: наборы meta-compile/decompile/info/remove/edit/validate зелёные в обоих
рантаймах, гарды прошли, снэпшот eds-binary-data принят платформой 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-06 19:11:29 +03:00
co-authored by Claude Opus 5
parent 7dc401718f
commit a38f30c9dd
29 changed files with 1660 additions and 36 deletions
@@ -8,27 +8,44 @@
"name": "PG",
"dataLockControlMode": "AutomaticAndManaged",
"tables": {
"prices": ["product_id: Number(10,0)", "price: Number(15,2)"],
"prices": [
"product_id: Number(10,0)",
"price: Number(15,2)"
],
"products": {
"nameInDataSource": "eds.public.products",
"tableDataType": "ObjectData",
"keyFields": ["id"],
"keyFields": [
"id"
],
"presentationField": "name",
"transactionsIsolationLevel": "ReadUncommitted",
"fields": [
"id: Number(10,0)",
"name: String(150)",
"photo: BinaryData | nullable",
{ "name": "cost", "type": "Number(15,2)", "nameInDataSource": "cost_net", "readOnly": true }
"sig: BinaryData(256,fixed) | nullable",
{
"name": "cost",
"type": "Number(15,2)",
"nameInDataSource": "cost_net",
"readOnly": true
}
]
}
},
"functions": {
"total": { "expression": "public.f_total(&1, &2)", "returns": "Number(15,2)" },
"total": {
"expression": "public.f_total(&1, &2)",
"returns": "Number(15,2)"
},
"nextKey": "NEXT VALUE FOR public.seq_key"
}
},
"args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
"args": {
"-JsonPath": "{inputFile}",
"-OutputDir": "{workDir}"
}
}
],
"params": {
@@ -36,7 +53,9 @@
"outputPath": "draft.json"
},
"expect": {
"files": ["draft.json"],
"files": [
"draft.json"
],
"fileContains": [
{
"file": "draft.json",
@@ -47,12 +66,16 @@
"\"transactionsIsolationLevel\": \"ReadUncommitted\"",
"photo: BinaryData | nullable",
"\"nameInDataSource\": \"cost_net\"",
"\"nextKey\": \"NEXT VALUE FOR public.seq_key\""
"\"nextKey\": \"NEXT VALUE FOR public.seq_key\"",
"sig: BinaryData(256,fixed) | nullable"
]
}
],
"fileNotContains": [
{ "file": "draft.json", "text": "ValueStorage" }
{
"file": "draft.json",
"text": "ValueStorage"
}
]
}
}