mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-08 19:20:52 +03:00
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:
co-authored by
Claude Opus 5
parent
7dc401718f
commit
a38f30c9dd
@@ -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>')
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-decompile v0.66 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
|
||||
# meta-decompile v0.67 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
#
|
||||
# Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document,
|
||||
@@ -213,7 +213,12 @@ function Get-TypeShorthand {
|
||||
if ($bq) {
|
||||
$blen = $bq.SelectSingleNode('v8:Length', $nsm)
|
||||
$bal = $bq.SelectSingleNode('v8:AllowedLength', $nsm)
|
||||
if ($blen -and $bal -and $bal.InnerText -eq 'Variable') { $parts += "BinaryData($($blen.InnerText))" }
|
||||
$blenVal = if ($blen) { $blen.InnerText.Trim() } else { "" }
|
||||
$balVal = if ($bal) { $bal.InnerText.Trim() } else { "" }
|
||||
# Голым BinaryData сворачиваем ТОЛЬКО точный дефолт компилятора
|
||||
# (4294967292/Fixed), иначе фиксированная длина терялась на раундтрипе.
|
||||
if ($balVal -eq 'Variable' -and $blenVal) { $parts += "BinaryData($blenVal)" }
|
||||
elseif ($blenVal -and $blenVal -ne '4294967292') { $parts += "BinaryData($blenVal,fixed)" }
|
||||
else { $parts += 'BinaryData' }
|
||||
} else { $parts += 'ValueStorage' }
|
||||
break
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-decompile v0.66 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
|
||||
# meta-decompile v0.67 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
#
|
||||
# Зеркало meta-decompile.ps1 (КАНОН). Структура 1:1 — те же имена функций, порядок, комментарии.
|
||||
@@ -317,8 +317,14 @@ def get_type_shorthand(type_node):
|
||||
if bq is not None:
|
||||
blen = bq.find('v8:Length', NS)
|
||||
bal = bq.find('v8:AllowedLength', NS)
|
||||
if blen is not None and bal is not None and _text(bal) == 'Variable':
|
||||
parts.append(f'BinaryData({_text(blen)})')
|
||||
blen_val = _text(blen).strip() if blen is not None else ''
|
||||
bal_val = _text(bal).strip() if bal is not None else ''
|
||||
# Голым BinaryData сворачиваем ТОЛЬКО точный дефолт компилятора
|
||||
# (4294967292/Fixed), иначе фиксированная длина терялась на раундтрипе.
|
||||
if bal_val.lower() == 'variable' and blen_val:
|
||||
parts.append(f'BinaryData({blen_val})')
|
||||
elif blen_val and blen_val != '4294967292':
|
||||
parts.append(f'BinaryData({blen_val},fixed)')
|
||||
else:
|
||||
parts.append('BinaryData')
|
||||
else:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-info v1.12 — Compact summary of 1C metadata object
|
||||
# meta-info v1.13 — Compact summary of 1C metadata object
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
param(
|
||||
@@ -233,7 +233,12 @@ function Format-SingleType([string]$raw, $parentNode) {
|
||||
}
|
||||
"v8:ValueStorage" { return "ХранилищеЗначения" }
|
||||
"v8:UUID" { return "УникальныйИдентификатор" }
|
||||
"xs:base64Binary" { return "ДвоичныеДанные" }
|
||||
"xs:base64Binary" {
|
||||
# ДвоичныеДанные только при своих квалификаторах: без них это вторая форма
|
||||
# ХранилищаЗначения, которую платформа принимает (так же различает meta-decompile).
|
||||
$bq = $parentNode.SelectSingleNode("v8:BinaryDataQualifiers", $ns)
|
||||
if ($bq) { return "ДвоичныеДанные" } else { return "ХранилищеЗначения" }
|
||||
}
|
||||
"v8:Null" { return "Null" }
|
||||
default {
|
||||
# Normalize d5p1:/dNpN: -> cfg:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-info v1.12 — Compact summary of 1C metadata object (Python port)
|
||||
# meta-info v1.13 — Compact summary of 1C metadata object (Python port)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import os
|
||||
@@ -320,7 +320,10 @@ def format_single_type(raw, parent_node):
|
||||
if raw == "v8:UUID":
|
||||
return "УникальныйИдентификатор"
|
||||
if raw == "xs:base64Binary":
|
||||
return "ДвоичныеДанные"
|
||||
# ДвоичныеДанные только при своих квалификаторах: без них это вторая форма
|
||||
# ХранилищаЗначения, которую платформа принимает (так же различает meta-decompile).
|
||||
bq = find(parent_node, "v8:BinaryDataQualifiers")
|
||||
return "ДвоичныеДанные" if bq is not None else "ХранилищеЗначения"
|
||||
if raw == "v8:Null":
|
||||
return "Null"
|
||||
# Normalize d5p1:/dNpN: → cfg: (both map to same namespace)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-remove v1.12 — Remove metadata object from 1C configuration dump
|
||||
# meta-remove v1.13 — Remove metadata object from 1C configuration dump
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
[CmdletBinding(PositionalBinding=$false)]
|
||||
param(
|
||||
@@ -345,7 +345,7 @@ if (-not $hasXml -and -not $hasDir) {
|
||||
}
|
||||
}
|
||||
if (-not $registeredInCfg) {
|
||||
Write-Host "[ERROR] Object not found: $typePlural/$objName.xml and not registered in Configuration.xml"
|
||||
Write-Host "[ERROR] Object not found: $typePlural/$objName.xml and not registered in $registryLabel"
|
||||
exit 1
|
||||
}
|
||||
Write-Host "[WARN] Object files not found: $typePlural/$objName.xml"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-remove v1.12 — Remove metadata object from 1C configuration dump
|
||||
# meta-remove v1.13 — Remove metadata object from 1C configuration dump
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -451,7 +451,7 @@ def main():
|
||||
# Check if registered in Configuration.xml before proceeding
|
||||
cfg_check_tree = etree.parse(registry_xml, etree.XMLParser(remove_blank_text=False))
|
||||
cfg_check_root = cfg_check_tree.getroot()
|
||||
child_objects = cfg_check_root.find(f"{{{MD_NS}}}Configuration/{{{MD_NS}}}ChildObjects")
|
||||
child_objects = cfg_check_root.find(f"{{{MD_NS}}}{registry_root}/{{{MD_NS}}}ChildObjects")
|
||||
registered_in_cfg = False
|
||||
if child_objects is not None:
|
||||
for child in child_objects:
|
||||
@@ -459,7 +459,7 @@ def main():
|
||||
registered_in_cfg = True
|
||||
break
|
||||
if not registered_in_cfg:
|
||||
print(f"[ERROR] Object not found: {type_plural}/{obj_name}.xml and not registered in Configuration.xml")
|
||||
print(f"[ERROR] Object not found: {type_plural}/{obj_name}.xml and not registered in {registry_label}")
|
||||
sys.exit(1)
|
||||
print(f"[WARN] Object files not found: {type_plural}/{obj_name}.xml")
|
||||
print(" Proceeding with deregistration only...")
|
||||
|
||||
Reference in New Issue
Block a user