diff --git a/.claude/skills/meta-compile/reference/external-data-source.md b/.claude/skills/meta-compile/reference/external-data-source.md
index ce0800ada..73173c47b 100644
--- a/.claude/skills/meta-compile/reference/external-data-source.md
+++ b/.claude/skills/meta-compile/reference/external-data-source.md
@@ -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)` — фиксированной.
**Составной тип у поля недопустим** — платформа такую конфигурацию не загружает.
diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1
index c18dadccf..8af82a2d1 100644
--- a/.claude/skills/meta-compile/scripts/meta-compile.ps1
+++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1
@@ -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 "$indentxs:base64Binary"
X "$indent"
X "$indent`t$blen"
diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py
index a55a14beb..fe798c2a5 100644
--- a/.claude/skills/meta-compile/scripts/meta-compile.py
+++ b/.claude/skills/meta-compile/scripts/meta-compile.py
@@ -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}cfg:{type_str}')
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}xs:base64Binary')
X(f'{indent}')
X(f'{indent}\t{blen}')
diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1
index 920509beb..8db3ca6b1 100644
--- a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1
+++ b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1
@@ -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
diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.py b/.claude/skills/meta-decompile/scripts/meta-decompile.py
index 0087922a0..c27cccc12 100644
--- a/.claude/skills/meta-decompile/scripts/meta-decompile.py
+++ b/.claude/skills/meta-decompile/scripts/meta-decompile.py
@@ -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:
diff --git a/.claude/skills/meta-info/scripts/meta-info.ps1 b/.claude/skills/meta-info/scripts/meta-info.ps1
index a1c3c657f..4baf89f32 100644
--- a/.claude/skills/meta-info/scripts/meta-info.ps1
+++ b/.claude/skills/meta-info/scripts/meta-info.ps1
@@ -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:
diff --git a/.claude/skills/meta-info/scripts/meta-info.py b/.claude/skills/meta-info/scripts/meta-info.py
index cc3ad9e20..8c71683ec 100644
--- a/.claude/skills/meta-info/scripts/meta-info.py
+++ b/.claude/skills/meta-info/scripts/meta-info.py
@@ -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)
diff --git a/.claude/skills/meta-remove/scripts/meta-remove.ps1 b/.claude/skills/meta-remove/scripts/meta-remove.ps1
index fae531979..00b728139 100644
--- a/.claude/skills/meta-remove/scripts/meta-remove.ps1
+++ b/.claude/skills/meta-remove/scripts/meta-remove.ps1
@@ -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"
diff --git a/.claude/skills/meta-remove/scripts/meta-remove.py b/.claude/skills/meta-remove/scripts/meta-remove.py
index 4316b3232..d0e169c77 100644
--- a/.claude/skills/meta-remove/scripts/meta-remove.py
+++ b/.claude/skills/meta-remove/scripts/meta-remove.py
@@ -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...")
diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md
index f58100301..f065af902 100644
--- a/docs/meta-dsl-spec.md
+++ b/docs/meta-dsl-spec.md
@@ -2080,9 +2080,21 @@ ChildObjects и модулей.
]
```
-Допустимые типы поля: `Number`, `String`, `Date`, `Boolean`, `UUID`, `BinaryData` (и `BinaryData(N)`
-с ограничением длины) и ссылка на таблицу внешнего источника —
-`ExternalDataSourceTableRef.<Источник>.<Таблица>`.
+Допустимые типы поля: `Number`, `String`, `Date`, `Boolean`, `UUID`, `BinaryData` и ссылка на таблицу
+внешнего источника — `ExternalDataSourceTableRef.<Источник>.<Таблица>`.
+
+Формы `BinaryData`:
+
+| Запись | Length | AllowedLength |
+|---|---|---|
+| `BinaryData` | 4294967292 | Fixed |
+| `BinaryData(N)` | N | Variable |
+| `BinaryData(N,fixed)` | N | Fixed |
+| `BinaryData(N,variable)` | N | Variable |
+
+Голая форма — то, что пишет платформа при импорте поля из СУБД. Декомпилятор
+сворачивает в неё только точное совпадение 4294967292/Fixed; любая другая длина возвращается
+со скобками. Посторонний текст в скобках (`BinaryData(abc)`) — ошибка компиляции.
`BinaryData` (ДвоичныеДанные) — **не** `ValueStorage`: платформа пишет его как `xs:base64Binary`
с `BinaryDataQualifiers`, тогда как ХранилищеЗначения — как `v8:ValueStorage`. Декомпилятор
diff --git a/tests/skills/cases/meta-compile/eds-binary-data.json b/tests/skills/cases/meta-compile/eds-binary-data.json
new file mode 100644
index 000000000..8aee11c28
--- /dev/null
+++ b/tests/skills/cases/meta-compile/eds-binary-data.json
@@ -0,0 +1,35 @@
+{
+ "name": "Двоичные данные: безлимит, переменная и фиксированная длина",
+ "input": {
+ "type": "ExternalDataSource",
+ "name": "PG",
+ "tables": {
+ "files": {
+ "keyFields": [
+ "id"
+ ],
+ "fields": [
+ "id: Number(10,0)",
+ "blob: BinaryData",
+ "thumb: BinaryData(4096)",
+ "sig: BinaryData(256,fixed)",
+ "note: BinaryData(64,variable)"
+ ]
+ }
+ }
+ },
+ "validatePath": "ExternalDataSources/PG",
+ "expect": {
+ "fileContains": [
+ {
+ "file": "ExternalDataSources/PG/Tables/files.xml",
+ "text": [
+ "4294967292",
+ "4096",
+ "256",
+ "64"
+ ]
+ }
+ ]
+ }
+}
diff --git a/tests/skills/cases/meta-compile/error-eds-binary-data-bad.json b/tests/skills/cases/meta-compile/error-eds-binary-data-bad.json
new file mode 100644
index 000000000..c1cb90c7c
--- /dev/null
+++ b/tests/skills/cases/meta-compile/error-eds-binary-data-bad.json
@@ -0,0 +1,24 @@
+{
+ "name": "BinaryData с мусором в скобках — отказ",
+ "input": {
+ "type": "ExternalDataSource",
+ "name": "PG",
+ "tables": {
+ "files": {
+ "keyFields": [
+ "id"
+ ],
+ "fields": [
+ "id: Number(10,0)",
+ "blob: BinaryData(abc)"
+ ]
+ }
+ }
+ },
+ "expectError": true,
+ "expect": {
+ "stderrContains": [
+ "Неверный тип 'BinaryData(abc)'"
+ ]
+ }
+}
diff --git a/tests/skills/cases/meta-compile/snapshots/eds-binary-data/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/Configuration.xml
new file mode 100644
index 000000000..da0e784ee
--- /dev/null
+++ b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/Configuration.xml
@@ -0,0 +1,252 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+ UUID-012
+ UUID-013
+
+
+ UUID-014
+ UUID-015
+
+
+
+ TestConfig
+
+
+ ru
+ TestConfig
+
+
+
+
+ Version8_3_24
+ ManagedApplication
+
+ PlatformApplication
+
+ Russian
+
+
+
+
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Biometrics
+ true
+
+
+ Location
+ false
+
+
+ BackgroundLocation
+ false
+
+
+ BluetoothPrinters
+ false
+
+
+ WiFiPrinters
+ false
+
+
+ Contacts
+ false
+
+
+ Calendars
+ false
+
+
+ PushNotifications
+ false
+
+
+ LocalNotifications
+ false
+
+
+ InAppPurchases
+ false
+
+
+ PersonalComputerFileExchange
+ false
+
+
+ Ads
+ false
+
+
+ NumberDialing
+ false
+
+
+ CallProcessing
+ false
+
+
+ CallLog
+ false
+
+
+ AutoSendSMS
+ false
+
+
+ ReceiveSMS
+ false
+
+
+ SMSLog
+ false
+
+
+ Camera
+ false
+
+
+ Microphone
+ false
+
+
+ MusicLibrary
+ false
+
+
+ PictureAndVideoLibraries
+ false
+
+
+ AudioPlaybackAndVibration
+ false
+
+
+ BackgroundAudioPlaybackAndVibration
+ false
+
+
+ InstallPackages
+ false
+
+
+ OSBackup
+ true
+
+
+ ApplicationUsageStatistics
+ false
+
+
+ BarcodeScanning
+ false
+
+
+ BackgroundAudioRecording
+ false
+
+
+ AllFilesAccess
+ false
+
+
+ Videoconferences
+ false
+
+
+ NFC
+ false
+
+
+ DocumentScanning
+ false
+
+
+ SpeechToText
+ false
+
+
+ Geofences
+ false
+
+
+ IncomingShareRequests
+ false
+
+
+ AllIncomingShareRequestsTypesProcessing
+ false
+
+
+
+
+
+ Normal
+
+
+ Language.Русский
+
+
+
+
+
+ Managed
+ NotAutoFree
+ DontUse
+ DontUse
+ TaxiEnableVersion8_2
+ DontUse
+ Version8_3_24
+
+
+
+ Русский
+ PG
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-compile/snapshots/eds-binary-data/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..3c1161b2d
--- /dev/null
+++ b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/Ext/ClientApplicationInterface.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ UUID-002
+
+
+
+
+ UUID-004
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-compile/snapshots/eds-binary-data/ExternalDataSources/PG.xml b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/ExternalDataSources/PG.xml
new file mode 100644
index 000000000..2c3e5fdaa
--- /dev/null
+++ b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/ExternalDataSources/PG.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+
+ PG
+
+
+ ru
+ PG
+
+
+
+ Automatic
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-compile/snapshots/eds-binary-data/ExternalDataSources/PG/Tables/files.xml b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/ExternalDataSources/PG/Tables/files.xml
new file mode 100644
index 000000000..ee88ce118
--- /dev/null
+++ b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/ExternalDataSources/PG/Tables/files.xml
@@ -0,0 +1,294 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+ UUID-012
+ UUID-013
+
+
+ UUID-014
+ UUID-015
+
+
+ UUID-016
+ UUID-017
+
+
+
+ files
+
+
+ ru
+ files
+
+
+
+ Table
+ files
+
+ NonobjectData
+
+ ExternalDataSource.PG.Table.files.Field.id
+
+
+
+
+
+ true
+ false
+
+ Auto
+ Begin
+ Directly
+ Auto
+
+
+
+
+
+
+
+
+
+
+
+ false
+ false
+ Auto
+
+ InDialog
+
+
+ Automatic
+
+
+
+
+ id
+
+
+ ru
+ id
+
+
+
+
+ xs:decimal
+
+ 10
+ 0
+ Any
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+ 0
+ DontCheck
+
+
+ Auto
+ Auto
+ Auto
+
+ id
+ false
+ false
+
+
+
+
+ blob
+
+
+ ru
+ blob
+
+
+
+
+ xs:base64Binary
+
+ 4294967292
+ Fixed
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+
+
+ Auto
+ Auto
+ Auto
+
+ blob
+ false
+ false
+
+
+
+
+ thumb
+
+
+ ru
+ thumb
+
+
+
+
+ xs:base64Binary
+
+ 4096
+ Variable
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+
+
+ Auto
+ Auto
+ Auto
+
+ thumb
+ false
+ false
+
+
+
+
+ sig
+
+
+ ru
+ sig
+
+
+
+
+ xs:base64Binary
+
+ 256
+ Fixed
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+
+
+ Auto
+ Auto
+ Auto
+
+ sig
+ false
+ false
+
+
+
+
+ note
+
+
+ ru
+ note
+
+
+
+
+ xs:base64Binary
+
+ 64
+ Variable
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+
+
+ Auto
+ Auto
+ Auto
+
+ note
+ false
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-compile/snapshots/eds-binary-data/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/Languages/Русский.xml
new file mode 100644
index 000000000..37c60d786
--- /dev/null
+++ b/tests/skills/cases/meta-compile/snapshots/eds-binary-data/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-decompile/external-data-source.json b/tests/skills/cases/meta-decompile/external-data-source.json
index c0361b1e6..3f8270fd7 100644
--- a/tests/skills/cases/meta-decompile/external-data-source.json
+++ b/tests/skills/cases/meta-decompile/external-data-source.json
@@ -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"
+ }
]
}
}
diff --git a/tests/skills/cases/meta-decompile/snapshots/external-data-source/ExternalDataSources/PG/Tables/products.xml b/tests/skills/cases/meta-decompile/snapshots/external-data-source/ExternalDataSources/PG/Tables/products.xml
index f68a791a1..a1716bda7 100644
--- a/tests/skills/cases/meta-decompile/snapshots/external-data-source/ExternalDataSources/PG/Tables/products.xml
+++ b/tests/skills/cases/meta-decompile/snapshots/external-data-source/ExternalDataSources/PG/Tables/products.xml
@@ -210,6 +210,47 @@
+
+ sig
+
+
+ ru
+ sig
+
+
+
+
+ xs:base64Binary
+
+ 256
+ Fixed
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+
+
+ Auto
+ Auto
+ Auto
+
+ sig
+ false
+ true
+
+
+
cost
diff --git a/tests/skills/cases/meta-decompile/snapshots/external-data-source/draft.json b/tests/skills/cases/meta-decompile/snapshots/external-data-source/draft.json
index 5bf91d417..dcf5e2d0a 100644
--- a/tests/skills/cases/meta-decompile/snapshots/external-data-source/draft.json
+++ b/tests/skills/cases/meta-decompile/snapshots/external-data-source/draft.json
@@ -14,6 +14,7 @@
"id: Number(10,0)",
"name: String(150)",
"photo: BinaryData | nullable",
+ "sig: BinaryData(256,fixed) | nullable",
{
"name": "cost",
"type": "Number(15,2)",
diff --git a/tests/skills/cases/meta-info/fixtures/valuestorage-base64/Catalogs/Вложения.xml b/tests/skills/cases/meta-info/fixtures/valuestorage-base64/Catalogs/Вложения.xml
new file mode 100644
index 000000000..5ea1c237f
--- /dev/null
+++ b/tests/skills/cases/meta-info/fixtures/valuestorage-base64/Catalogs/Вложения.xml
@@ -0,0 +1,176 @@
+
+
+
+
+
+ a11e37c8-2444-4782-b7bd-8aea08cb9e59
+ 67e5e532-fae8-43f7-b462-e873cb74032b
+
+
+ 8f8a87cf-1986-4972-83eb-d7c86b9f53ab
+ 26b89d83-cfca-4c88-85f3-7001585e4a9e
+
+
+ 5f2cdd97-e03d-485d-ad58-a24996d3d050
+ 5cb35f34-0105-4770-bb71-bfefe7c8dde0
+
+
+ bc462ca1-8645-40de-8805-05528f49b77d
+ 7a34ec0e-1899-4005-aab7-73f55df542cd
+
+
+ 772a6cd5-a420-46eb-89f9-580707183957
+ 80c973c9-2823-40ee-8149-d6e4a8182a36
+
+
+
+ Вложения
+
+
+ ru
+ Вложения
+
+
+
+ false
+ HierarchyFoldersAndItems
+ false
+ 2
+ true
+ true
+
+ ToItems
+ 9
+ 25
+ String
+ Variable
+ WholeCatalog
+ false
+ true
+ AsDescription
+
+ Auto
+ InDialog
+ false
+ BothWays
+
+ Catalog.Вложения.StandardAttribute.Description
+ Catalog.Вложения.StandardAttribute.Code
+
+ Begin
+ DontUse
+ Directly
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ Managed
+ Use
+
+
+
+
+
+ Use
+ Auto
+ DontUse
+ false
+ false
+
+
+
+
+ Данные
+
+
+ ru
+ Данные
+
+
+
+
+ xs:base64Binary
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+
+ DontIndex
+ Use
+ Use
+
+
+
+
+ Файл
+
+
+ ru
+ Файл
+
+
+
+
+ xs:base64Binary
+
+ 4294967292
+ Fixed
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+
+ DontIndex
+ Use
+ Use
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-info/snapshots/valuestorage-base64/Catalogs/Вложения.xml b/tests/skills/cases/meta-info/snapshots/valuestorage-base64/Catalogs/Вложения.xml
new file mode 100644
index 000000000..09ab8b853
--- /dev/null
+++ b/tests/skills/cases/meta-info/snapshots/valuestorage-base64/Catalogs/Вложения.xml
@@ -0,0 +1,176 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+
+ Вложения
+
+
+ ru
+ Вложения
+
+
+
+ false
+ HierarchyFoldersAndItems
+ false
+ 2
+ true
+ true
+
+ ToItems
+ 9
+ 25
+ String
+ Variable
+ WholeCatalog
+ false
+ true
+ AsDescription
+
+ Auto
+ InDialog
+ false
+ BothWays
+
+ Catalog.Вложения.StandardAttribute.Description
+ Catalog.Вложения.StandardAttribute.Code
+
+ Begin
+ DontUse
+ Directly
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ Managed
+ Use
+
+
+
+
+
+ Use
+ Auto
+ DontUse
+ false
+ false
+
+
+
+
+ Данные
+
+
+ ru
+ Данные
+
+
+
+
+ xs:base64Binary
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+
+ DontIndex
+ Use
+ Use
+
+
+
+
+ Файл
+
+
+ ru
+ Файл
+
+
+
+
+ xs:base64Binary
+
+ 4294967292
+ Fixed
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+
+ DontCheck
+ Items
+
+
+ Auto
+ Auto
+
+
+ Auto
+
+ DontIndex
+ Use
+ Use
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-info/valuestorage-base64.json b/tests/skills/cases/meta-info/valuestorage-base64.json
new file mode 100644
index 000000000..d1ba34db5
--- /dev/null
+++ b/tests/skills/cases/meta-info/valuestorage-base64.json
@@ -0,0 +1,8 @@
+{
+ "name": "xs:base64Binary без квалификаторов — ХранилищеЗначения, с ними — ДвоичныеДанные",
+ "setup": "fixture:valuestorage-base64",
+ "params": { "objectPath": "Catalogs/Вложения.xml" },
+ "expect": {
+ "stdoutContains": ["ХранилищеЗначения", "ДвоичныеДанные"]
+ }
+}
diff --git a/tests/skills/cases/meta-remove/eds-table-orphan-registration.json b/tests/skills/cases/meta-remove/eds-table-orphan-registration.json
new file mode 100644
index 000000000..9899c14a5
--- /dev/null
+++ b/tests/skills/cases/meta-remove/eds-table-orphan-registration.json
@@ -0,0 +1,29 @@
+{
+ "name": "Осиротевшая таблица: файла нет, регистрация в источнике снимается",
+ "preRun": [
+ {
+ "script": "meta-compile/scripts/meta-compile",
+ "input": {
+ "type": "ExternalDataSource",
+ "name": "PG",
+ "tables": {
+ "products": { "keyFields": ["id"], "fields": ["id: Number(10,0)"] },
+ "prices": ["product_id: Number(10,0)", "price: Number(15,2)"]
+ }
+ },
+ "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
+ },
+ { "deletePath": "ExternalDataSources/PG/Tables/prices.xml" }
+ ],
+ "object": "ExternalDataSource.PG.Table.prices",
+ "expect": {
+ "stdoutContains": ["Object files not found", "Proceeding with deregistration only"],
+ "files": ["ExternalDataSources/PG.xml", "ExternalDataSources/PG/Tables/products.xml"],
+ "fileContains": [
+ { "file": "ExternalDataSources/PG.xml", "text": "" }
+ ],
+ "fileNotContains": [
+ { "file": "ExternalDataSources/PG.xml", "text": "" }
+ ]
+ }
+}
diff --git a/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/Configuration.xml b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/Configuration.xml
new file mode 100644
index 000000000..da0e784ee
--- /dev/null
+++ b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/Configuration.xml
@@ -0,0 +1,252 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+ UUID-012
+ UUID-013
+
+
+ UUID-014
+ UUID-015
+
+
+
+ TestConfig
+
+
+ ru
+ TestConfig
+
+
+
+
+ Version8_3_24
+ ManagedApplication
+
+ PlatformApplication
+
+ Russian
+
+
+
+
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Biometrics
+ true
+
+
+ Location
+ false
+
+
+ BackgroundLocation
+ false
+
+
+ BluetoothPrinters
+ false
+
+
+ WiFiPrinters
+ false
+
+
+ Contacts
+ false
+
+
+ Calendars
+ false
+
+
+ PushNotifications
+ false
+
+
+ LocalNotifications
+ false
+
+
+ InAppPurchases
+ false
+
+
+ PersonalComputerFileExchange
+ false
+
+
+ Ads
+ false
+
+
+ NumberDialing
+ false
+
+
+ CallProcessing
+ false
+
+
+ CallLog
+ false
+
+
+ AutoSendSMS
+ false
+
+
+ ReceiveSMS
+ false
+
+
+ SMSLog
+ false
+
+
+ Camera
+ false
+
+
+ Microphone
+ false
+
+
+ MusicLibrary
+ false
+
+
+ PictureAndVideoLibraries
+ false
+
+
+ AudioPlaybackAndVibration
+ false
+
+
+ BackgroundAudioPlaybackAndVibration
+ false
+
+
+ InstallPackages
+ false
+
+
+ OSBackup
+ true
+
+
+ ApplicationUsageStatistics
+ false
+
+
+ BarcodeScanning
+ false
+
+
+ BackgroundAudioRecording
+ false
+
+
+ AllFilesAccess
+ false
+
+
+ Videoconferences
+ false
+
+
+ NFC
+ false
+
+
+ DocumentScanning
+ false
+
+
+ SpeechToText
+ false
+
+
+ Geofences
+ false
+
+
+ IncomingShareRequests
+ false
+
+
+ AllIncomingShareRequestsTypesProcessing
+ false
+
+
+
+
+
+ Normal
+
+
+ Language.Русский
+
+
+
+
+
+ Managed
+ NotAutoFree
+ DontUse
+ DontUse
+ TaxiEnableVersion8_2
+ DontUse
+ Version8_3_24
+
+
+
+ Русский
+ PG
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..3c1161b2d
--- /dev/null
+++ b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/Ext/ClientApplicationInterface.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ UUID-002
+
+
+
+
+ UUID-004
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/ExternalDataSources/PG.xml b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/ExternalDataSources/PG.xml
new file mode 100644
index 000000000..a1b89619b
--- /dev/null
+++ b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/ExternalDataSources/PG.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+
+ PG
+
+
+ ru
+ PG
+
+
+
+ Automatic
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/ExternalDataSources/PG/Tables/products.xml b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/ExternalDataSources/PG/Tables/products.xml
new file mode 100644
index 000000000..205ef9363
--- /dev/null
+++ b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/ExternalDataSources/PG/Tables/products.xml
@@ -0,0 +1,130 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+ UUID-012
+ UUID-013
+
+
+ UUID-014
+ UUID-015
+
+
+ UUID-016
+ UUID-017
+
+
+
+ products
+
+
+ ru
+ products
+
+
+
+ Table
+ products
+
+ NonobjectData
+
+ ExternalDataSource.PG.Table.products.Field.id
+
+
+
+
+
+ true
+ false
+
+ Auto
+ Begin
+ Directly
+ Auto
+
+
+
+
+
+
+
+
+
+
+
+ false
+ false
+ Auto
+
+ InDialog
+
+
+ Automatic
+
+
+
+
+ id
+
+
+ ru
+ id
+
+
+
+
+ xs:decimal
+
+ 10
+ 0
+ Any
+
+
+ false
+
+
+
+ false
+
+ false
+ false
+
+
+ false
+ 0
+ DontCheck
+
+
+ Auto
+ Auto
+ Auto
+
+ id
+ false
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/Languages/Русский.xml b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/Languages/Русский.xml
new file mode 100644
index 000000000..37c60d786
--- /dev/null
+++ b/tests/skills/cases/meta-remove/snapshots/eds-table-orphan-registration/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file