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 + + + files
+
+
+
\ 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 + ForItem + DontIndex + Use + Use + + + + + Файл + + + ru + Файл + + + + + xs:base64Binary + + 4294967292 + Fixed + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + 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 + ForItem + DontIndex + Use + Use + + + + + Файл + + + ru + Файл + + + + + xs:base64Binary + + 4294967292 + Fixed + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + 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": "products
" } + ], + "fileNotContains": [ + { "file": "ExternalDataSources/PG.xml", "text": "prices
" } + ] + } +} 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 + + + products
+
+
+
\ 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