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
@@ -97,9 +97,11 @@
]
```
Допустимые типы: `Number`, `String`, `Date`, `Boolean`, `UUID`, `BinaryData` (двоичные данные;
`BinaryData(N)` — с ограничением длины) и ссылка на таблицу внешнего источника —
`ExternalDataSourceTableRef.<Источник>.<Таблица>`.
Допустимые типы: `Number`, `String`, `Date`, `Boolean`, `UUID`, `BinaryData` и ссылка на таблицу
внешнего источника — `ExternalDataSourceTableRef.<Источник>.<Таблица>`.
Двоичные данные: `BinaryData` — безлимит (так их пишет платформа при импорте из СУБД),
`BinaryData(N)` — переменной длины, `BinaryData(N,fixed)` — фиксированной.
**Составной тип у поля недопустим** — платформа такую конфигурацию не загружает.
@@ -1,4 +1,4 @@
# meta-compile v1.108 — Compile 1C metadata object from JSON
# meta-compile v1.109 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
[CmdletBinding(PositionalBinding=$false)]
param(
@@ -812,9 +812,17 @@ function Emit-TypeContent {
# ValueStorage (ХранилищеЗначения) — канон v8:ValueStorage (не xs:base64Binary, хоть 1С и принимает оба).
# ДвоичныеДанные — xs:base64Binary с квалификаторами (у полей внешних источников).
if ($typeStr -eq "BinaryData" -or $typeStr -match '^BinaryData\(') {
$blen = if ($typeStr -match '^BinaryData\((\d+)\)$') { $Matches[1] } else { "4294967292" }
$ballowed = if ($typeStr -match '^BinaryData\(\d+\)$') { "Variable" } else { "Fixed" }
if ($typeStr -match '^BinaryData(\(|$)') {
# BinaryData — безлимит (так платформа пишет поле внешнего источника: 4294967292/Fixed).
# BinaryData(N) — переменной длины, BinaryData(N,fixed) — фиксированной.
$bm = [regex]::Match($typeStr, '^BinaryData(\((\d+)(,\s*(fixed|variable))?\))?$', 'IgnoreCase')
if (-not $bm.Success) {
Write-Error "Неверный тип '$typeStr': ждётся BinaryData, BinaryData(Длина) или BinaryData(Длина,fixed|variable)."
exit 1
}
$blen = if ($bm.Groups[2].Success) { $bm.Groups[2].Value } else { "4294967292" }
$ballowed = if ($bm.Groups[4].Success) { if ($bm.Groups[4].Value.ToLowerInvariant() -eq "fixed") { "Fixed" } else { "Variable" } }
elseif ($bm.Groups[2].Success) { "Variable" } else { "Fixed" }
X "$indent<v8:Type>xs:base64Binary</v8:Type>"
X "$indent<v8:BinaryDataQualifiers>"
X "$indent`t<v8:Length>$blen</v8:Length>"
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# meta-compile v1.108 — Compile 1C metadata object from JSON
# meta-compile v1.109 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -932,10 +932,18 @@ def emit_type_content(indent, type_str):
X(f'{indent}<v8:TypeSet>cfg:{type_str}</v8:TypeSet>')
return
# ДвоичныеДанные — xs:base64Binary с квалификаторами (у полей внешних источников).
m_bin = re.match(r'^BinaryData(?:\((\d+)\))?$', type_str)
if m_bin:
if re.match(r'^BinaryData(\(|$)', type_str, re.I):
# BinaryData — безлимит (так платформа пишет поле внешнего источника: 4294967292/Fixed).
# BinaryData(N) — переменной длины, BinaryData(N,fixed) — фиксированной.
m_bin = re.match(r'^BinaryData(?:\((\d+)(?:,\s*(fixed|variable))?\))?$', type_str, re.I)
if not m_bin:
print(f"Неверный тип '{type_str}': ждётся BinaryData, BinaryData(Длина) или BinaryData(Длина,fixed|variable).", file=sys.stderr)
sys.exit(1)
blen = m_bin.group(1) or '4294967292'
ballowed = 'Variable' if m_bin.group(1) else 'Fixed'
if m_bin.group(2):
ballowed = 'Fixed' if m_bin.group(2).lower() == 'fixed' else 'Variable'
else:
ballowed = 'Variable' if m_bin.group(1) else 'Fixed'
X(f'{indent}<v8:Type>xs:base64Binary</v8:Type>')
X(f'{indent}<v8:BinaryDataQualifiers>')
X(f'{indent}\t<v8:Length>{blen}</v8:Length>')