fix(meta-info,meta-decompile): xs:base64Binary без квалификаторов — двоичные данные, не хранилище

Вчерашняя правка исходила из того, что xs:base64Binary без BinaryDataQualifiers — вторая
форма ХранилищаЗначения. Спросили платформу: конфигурация с таким узлом загружается и
выгружается обратно как xs:base64Binary с Length 0 / AllowedLength Variable, то есть как
БЕЗЛИМИТНЫЕ двоичные данные. ХранилищеЗначения — отдельный узел v8:ValueStorage.

- meta-info: xs:base64Binary снова всегда ДвоичныеДанные (правка отменена, замер записан
  в комментарий).
- meta-decompile: узел без квалификаторов теперь возвращается как BinaryData(0), а не
  ValueStorage — раньше раундтрип молча менял тип реквизита. Проверено: пересборка из
  полученного DSL даёт байт в байт то же, что выгрузила платформа.
- Кейс и фикстура переименованы по факту и стали полной конфигурацией: теперь кейс доезжает
  до платформы в verify-snapshots (раньше падал с «конфигурации для загрузки нет»).

check-uuid-invariant: добавлен сценарий внешнего источника — правки идут в два файла, и
пересборка файла источника дала бы ему новый uuid, осиротив существующие таблицы. Проверка
не холостая: намеренная порча uuid источника гард роняет.

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 20:02:05 +03:00
co-authored by Claude Opus 5
parent b4bc02bc98
commit 11c0450d2a
18 changed files with 663 additions and 44 deletions
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# meta-decompile v0.67 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
# meta-decompile v0.68 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
#
# Зеркало meta-decompile.ps1 (КАНОН). Структура 1:1 — те же имена функций, порядок, комментарии.
@@ -311,8 +311,9 @@ def get_type_shorthand(type_node):
fr = _text(dn)
parts.append(fr) # Date | DateTime
elif re.search(r'(^|:)base64Binary$', raw, re.I):
# xs:base64Binary — это ДвоичныеДанные, если рядом есть свои квалификаторы;
# ХранилищеЗначения платформа пишет как v8:ValueStorage, но принимает и эту форму.
# xs:base64Binary — всегда ДвоичныеДанные (ХранилищеЗначения — это v8:ValueStorage).
# Узел без квалификаторов встречается только в рукописном XML: замерено на 8.3.24.1691 —
# платформа читает его как безлимит (Length 0, Variable) и так же выгружает обратно.
bq = type_node.find('v8:BinaryDataQualifiers', NS)
if bq is not None:
blen = bq.find('v8:Length', NS)
@@ -328,7 +329,7 @@ def get_type_shorthand(type_node):
else:
parts.append('BinaryData')
else:
parts.append('ValueStorage')
parts.append('BinaryData(0)')
else:
parts.append(strip_ns_prefix(raw)) # cfg:CatalogRef.X → CatalogRef.X
elif ln == 'TypeSet':