From 55b80fdc085ca1a02ac4d489286374f08d22bfa0 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Thu, 21 May 2026 20:50:34 +0300 Subject: [PATCH] =?UTF-8?q?feat(skd-decompile):=20=D0=BA=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=BD=D1=8B=D0=B9=20JSON-=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=82=D0=BE=D1=80=20+=20?= =?UTF-8?q?=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B9=20shorthand=20totalFields?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Заменил ConvertTo-Json (PS5.1) на собственный ConvertTo-CompactJson: - 2-пробельный indent (вместо 4 + выравнивание keys по длине) - Массивы примитивов (string/number/bool/null) — inline `[a, b, c]` - Массивы с объектами/nested arrays — multi-line как раньше - Кириллица в UTF-8 (без \uXXXX-escapes) - Корректный escape строк (\\", \\, \n, \r, \t, \uXXXX для control chars) Build-TotalField: shorthand "name: expr" для любого однострочного expression. Раньше object form применялась когда expression не Func(arg). Теперь — только когда есть group или expression многострочный. Compile принимает любой shorthand вида "dataPath: expression" (Parse- TotalShorthand делает split по первому ":"). Save-UserStyles тоже использует новый сериализатор. Все 16 декомпиляционных snapshot'ов обновлены (косметика — JSON структурно тот же, тесты round-trip проходят). На реальном отчёте (целевой корпус): 405 → 264 строк (-35%). v0.18 → v0.19. --- .../skd-decompile/scripts/skd-decompile.ps1 | 130 +++++++++++---- .../decompiled.json | 74 +++++---- .../calc-total-params/decompiled.json | 70 ++++----- .../decompiled.json | 48 +++--- .../dataset-query-multiline/decompiled.json | 18 +-- .../snapshots/dataset-types/decompiled.json | 63 ++++---- .../field-input-parameters/decompiled.json | 123 +++++++-------- .../field-order-expression/decompiled.json | 34 ++-- .../field-roles-rich/decompiled.json | 19 +-- .../decompiled.json | 85 +++++----- .../snapshots/minimal-query/decompiled.json | 16 +- .../decompiled.json | 146 ++++++++--------- .../template-custom-style/decompiled.json | 36 ++--- .../template-custom-style/skd-styles.json | 26 +-- .../decompiled.json | 48 +++--- .../template-no-style/decompiled.json | 43 ++--- .../decompiled.json | 125 ++++++--------- .../snapshots/variant-full/decompiled.json | 148 ++++++++---------- 18 files changed, 604 insertions(+), 648 deletions(-) diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index a8fc378c..5bccd8fe 100644 --- a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 +++ b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 @@ -1,4 +1,4 @@ -# skd-decompile v0.18 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.19 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -107,6 +107,88 @@ function New-Sentinel { # --- 3. Helpers --- +# Custom JSON serializer — компактный, 2-пробельный indent, массивы примитивов inline. +# В отличие от ConvertTo-Json (PS5.1): +# - не выравнивает ключи объекта по самому длинному +# - не разворачивает массивы примитивов на отдельные строки +# - кириллица в UTF-8 (без \uXXXX-escapes) +function Convert-StringToJsonLiteral { + param([string]$s) + if ($null -eq $s) { return 'null' } + $sb = New-Object System.Text.StringBuilder + [void]$sb.Append('"') + foreach ($ch in $s.ToCharArray()) { + $code = [int]$ch + if ($code -eq 0x22) { [void]$sb.Append('\"') } + elseif ($code -eq 0x5C) { [void]$sb.Append('\\') } + elseif ($code -eq 0x08) { [void]$sb.Append('\b') } + elseif ($code -eq 0x09) { [void]$sb.Append('\t') } + elseif ($code -eq 0x0A) { [void]$sb.Append('\n') } + elseif ($code -eq 0x0C) { [void]$sb.Append('\f') } + elseif ($code -eq 0x0D) { [void]$sb.Append('\r') } + elseif ($code -lt 0x20) { [void]$sb.AppendFormat('\u{0:x4}', $code) } + else { [void]$sb.Append($ch) } + } + [void]$sb.Append('"') + return $sb.ToString() +} + +function ConvertTo-CompactJson { + param($obj, [int]$depth = 0, [string]$indentUnit = ' ') + $indent = $indentUnit * $depth + $childIndent = $indentUnit * ($depth + 1) + + if ($null -eq $obj) { return 'null' } + if ($obj -is [bool]) { if ($obj) { return 'true' } else { return 'false' } } + if ($obj -is [string]) { return (Convert-StringToJsonLiteral $obj) } + if ($obj -is [int] -or $obj -is [long]) { return "$obj" } + if ($obj -is [double] -or $obj -is [single] -or $obj -is [decimal]) { + # .NET ToString с invariant culture, чтобы не было запятой + return ([System.Convert]::ToString($obj, [System.Globalization.CultureInfo]::InvariantCulture)) + } + # Hashtable / OrderedDictionary / PSCustomObject — объект + if ($obj -is [System.Collections.IDictionary]) { + $keys = @($obj.Keys) + if ($keys.Count -eq 0) { return '{}' } + $parts = @() + foreach ($k in $keys) { + $val = ConvertTo-CompactJson -obj $obj[$k] -depth ($depth + 1) -indentUnit $indentUnit + $parts += "$childIndent$(Convert-StringToJsonLiteral "$k"): $val" + } + return "{`n" + ($parts -join ",`n") + "`n$indent}" + } + if ($obj -is [System.Management.Automation.PSCustomObject]) { + $props = @($obj.PSObject.Properties) + if ($props.Count -eq 0) { return '{}' } + $parts = @() + foreach ($p in $props) { + $val = ConvertTo-CompactJson -obj $p.Value -depth ($depth + 1) -indentUnit $indentUnit + $parts += "$childIndent$(Convert-StringToJsonLiteral "$($p.Name)"): $val" + } + return "{`n" + ($parts -join ",`n") + "`n$indent}" + } + # Array / IList + if ($obj -is [array] -or $obj -is [System.Collections.IList]) { + $items = @($obj) + if ($items.Count -eq 0) { return '[]' } + $allPrimitive = $true + foreach ($it in $items) { + if ($it -is [System.Collections.IDictionary] -or $it -is [System.Management.Automation.PSCustomObject] -or $it -is [array] -or $it -is [System.Collections.IList]) { + $allPrimitive = $false + break + } + } + if ($allPrimitive) { + $parts = @($items | ForEach-Object { ConvertTo-CompactJson -obj $_ -depth $depth -indentUnit $indentUnit }) + return '[' + ($parts -join ', ') + ']' + } + $parts = @($items | ForEach-Object { "$childIndent$(ConvertTo-CompactJson -obj $_ -depth ($depth + 1) -indentUnit $indentUnit)" }) + return "[`n" + ($parts -join ",`n") + "`n$indent]" + } + # Fallback + return (Convert-StringToJsonLiteral "$obj") +} + function Get-Text { param($node, [string]$xpath) if (-not $node) { return $null } @@ -489,25 +571,26 @@ function Build-TotalField { param($tfNode) $dataPath = Get-Text $tfNode "r:dataPath" $expression = Get-Text $tfNode "r:expression" - # Detect Func() → shorthand "name: Func" - if ($expression -match '^(\w+)\(([^)]*)\)$') { - $func = $matches[1] - $inner = $matches[2].Trim() - if ($inner -eq $dataPath) { - return "$dataPath`: $func" - } - # "name: Func(expr)" form — also a valid shorthand - return "$dataPath`: $func($inner)" - } - # group attachment via groupItem — Ring 2 / object form $groupNodes = $tfNode.SelectNodes("r:group", $ns) - $obj = [ordered]@{ dataPath = $dataPath; expression = $expression } - if ($groupNodes -and $groupNodes.Count -gt 0) { - $groups = @() - foreach ($g in $groupNodes) { $groups += $g.InnerText } - $obj['group'] = $groups + $hasGroups = $groupNodes -and $groupNodes.Count -gt 0 + + # Object form — только если есть group или expression многострочный + if ($hasGroups -or ($expression -match "[`r`n]")) { + $obj = [ordered]@{ dataPath = $dataPath; expression = $expression } + if ($hasGroups) { + $groups = @() + foreach ($g in $groupNodes) { $groups += $g.InnerText } + $obj['group'] = $groups + } + return $obj } - return $obj + + # Shorthand: "Func(dataPath)" → "name: Func" (агрегат с очевидным аргументом) + if ($expression -match '^(\w+)\((\w+)\)$' -and $matches[2] -eq $dataPath) { + return "$dataPath`: $($matches[1])" + } + # Любой другой однострочный expression → "name: expression" (compile берёт всё после ":" как expression) + return "$dataPath`: $expression" } # Detect StandardPeriod variant from node @@ -875,8 +958,7 @@ function Save-UserStyles { $out[$name] = $script:customStylesAccumulator[$name] } if ($out.Count -eq 0) { return } - $json = $out | ConvertTo-Json -Depth 8 - $json = [regex]::Replace($json, '\\u([0-9a-fA-F]{4})', { param($m) [char][int]("0x" + $m.Groups[1].Value) }) + $json = ConvertTo-CompactJson -obj $out $enc = New-Object System.Text.UTF8Encoding($false) [System.IO.File]::WriteAllText($stylesPath, $json, $enc) [Console]::Error.WriteLine("Saved skd-styles.json (custom styles: $($script:customStylesAccumulator.Count))") @@ -1878,13 +1960,7 @@ if ($settingsVariants.Count -gt 0) { $out['settingsVariants'] = $settingsVariant # --- 7. Serialize --- -$json = $out | ConvertTo-Json -Depth 32 - -# Unescape \uXXXX → UTF-8 literals -$json = [regex]::Replace($json, '\\u([0-9a-fA-F]{4})', { - param($m) - [char][int]("0x" + $m.Groups[1].Value) -}) +$json = ConvertTo-CompactJson -obj $out if ($OutputPath) { $enc = New-Object System.Text.UTF8Encoding($false) diff --git a/tests/skills/cases/skd-decompile/snapshots/appearance-multilang-value/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/appearance-multilang-value/decompiled.json index 47864f78..6b45c264 100644 --- a/tests/skills/cases/skd-decompile/snapshots/appearance-multilang-value/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/appearance-multilang-value/decompiled.json @@ -1,40 +1,38 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", - "fields": [ - { - "field": "ДатаДокумента", - "type": "date", - "appearance": { - "Формат": { - "ru": "ДЛФ=D", - "en": "DLF=D" - } - } - } - ] - } - ], - "settingsVariants": [ - { - "name": "Основной", - "settings": { - "conditionalAppearance": [ - { - "selection": [ - "ДатаДокумента" - ], - "appearance": { - "Формат": { - "ru": "ДЛФ=DT", - "en": "DLF=DT" - } - } - } - ] - } - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", + "fields": [ + { + "field": "ДатаДокумента", + "type": "date", + "appearance": { + "Формат": { + "ru": "ДЛФ=D", + "en": "DLF=D" + } + } + } + ] + } + ], + "settingsVariants": [ + { + "name": "Основной", + "settings": { + "conditionalAppearance": [ + { + "selection": ["ДатаДокумента"], + "appearance": { + "Формат": { + "ru": "ДЛФ=DT", + "en": "DLF=DT" + } + } + } + ] + } + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/calc-total-params/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/calc-total-params/decompiled.json index 66b65f94..346721a2 100644 --- a/tests/skills/cases/skd-decompile/snapshots/calc-total-params/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/calc-total-params/decompiled.json @@ -1,42 +1,32 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", - "fields": [ - "Цена: decimal(15,2)", - "Закупка: decimal(15,2)" - ] - } - ], - "calculatedFields": [ - "Маржа = Цена - Закупка", - "Наценка [Наценка, %]: decimal(10,2) = Маржа / Закупка * 100", - "Служебное: string = \"\" #noField #noFilter #noGroup #noOrder" - ], - "totalFields": [ - "Цена: Сумма", - "Маржа: Сумма(Цена - Закупка)" - ], - "parameters": [ - "Период [Отчетный период]: StandardPeriod = LastMonth @autoDates", - "Организация: CatalogRef.Организации", - "СписокДокументов: CatalogRef.Документы @valueList", - "СлужебныйПар: string @hidden", - { - "name": "ПорядокОкругления", - "type": "EnumRef.Округления", - "value": "Перечисление.Округления.Окр1", - "availableValues": [ - { - "value": "Перечисление.Округления.Окр1_00", - "presentation": "руб. коп" - }, - { - "value": "Перечисление.Округления.Окр1", - "presentation": "руб." - } - ] - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", + "fields": ["Цена: decimal(15,2)", "Закупка: decimal(15,2)"] + } + ], + "calculatedFields": ["Маржа = Цена - Закупка", "Наценка [Наценка, %]: decimal(10,2) = Маржа / Закупка * 100", "Служебное: string = \"\" #noField #noFilter #noGroup #noOrder"], + "totalFields": ["Цена: Сумма", "Маржа: Сумма(Цена - Закупка)"], + "parameters": [ + "Период [Отчетный период]: StandardPeriod = LastMonth @autoDates", + "Организация: CatalogRef.Организации", + "СписокДокументов: CatalogRef.Документы @valueList", + "СлужебныйПар: string @hidden", + { + "name": "ПорядокОкругления", + "type": "EnumRef.Округления", + "value": "Перечисление.Округления.Окр1", + "availableValues": [ + { + "value": "Перечисление.Округления.Окр1_00", + "presentation": "руб. коп" + }, + { + "value": "Перечисление.Округления.Окр1", + "presentation": "руб." + } + ] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/dataset-folder-and-auto-group/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/dataset-folder-and-auto-group/decompiled.json index 28d93d0e..fccb53af 100644 --- a/tests/skills/cases/skd-decompile/snapshots/dataset-folder-and-auto-group/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/dataset-folder-and-auto-group/decompiled.json @@ -1,26 +1,26 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", - "fields": [ - "Период: date", - { - "field": "СальдоНаНачалоПериода", - "folder": true, - "title": "Сальдо на начало периода" - }, - "СальдоНаНачалоПериода.Дт: decimal(15,2)", - "СальдоНаНачалоПериода.Кт: decimal(15,2)" - ] - } - ], - "settingsVariants": [ - { - "name": "Основной", - "settings": { - "structure": "Auto > Период" - } - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", + "fields": [ + "Период: date", + { + "field": "СальдоНаНачалоПериода", + "folder": true, + "title": "Сальдо на начало периода" + }, + "СальдоНаНачалоПериода.Дт: decimal(15,2)", + "СальдоНаНачалоПериода.Кт: decimal(15,2)" + ] + } + ], + "settingsVariants": [ + { + "name": "Основной", + "settings": { + "structure": "Auto > Период" + } + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/decompiled.json index c975ba67..f53710a5 100644 --- a/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/decompiled.json @@ -1,13 +1,9 @@ { - "dataSets": [ - { - "name": "ПродажиПоПериодам", - "query": "@ПродажиПоПериодам.sql", - "fields": [ - "Номенклатура: CatalogRef.Номенклатура @dimension", - "Количество: decimal(15,3)", - "Сумма: decimal(15,2)" - ] - } - ] + "dataSets": [ + { + "name": "ПродажиПоПериодам", + "query": "@ПродажиПоПериодам.sql", + "fields": ["Номенклатура: CatalogRef.Номенклатура @dimension", "Количество: decimal(15,3)", "Сумма: decimal(15,2)"] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/dataset-types/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/dataset-types/decompiled.json index e62c26ab..f3e77c97 100644 --- a/tests/skills/cases/skd-decompile/snapshots/dataset-types/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/dataset-types/decompiled.json @@ -1,38 +1,29 @@ { - "dataSets": [ - { - "name": "Запрос1", - "query": "ВЫБРАТЬ Номенклатура.Наименование КАК Имя ИЗ Справочник.Номенклатура КАК Номенклатура", - "fields": [ - "Имя: string" - ] - }, - { - "name": "Журнал", - "objectName": "ЖурналОшибок", - "fields": [ - "Сообщение: string(150)", - "Уровень: string" - ] - }, - { - "name": "Объединение", - "items": [ - { - "name": "Часть1", - "query": "ВЫБРАТЬ 1 КАК Поле", - "fields": [ - "Поле: decimal(10,2)" - ] - }, - { - "name": "Часть2", - "query": "ВЫБРАТЬ 2 КАК Поле", - "fields": [ - "Поле: decimal(10,2)" - ] - } - ] - } - ] + "dataSets": [ + { + "name": "Запрос1", + "query": "ВЫБРАТЬ Номенклатура.Наименование КАК Имя ИЗ Справочник.Номенклатура КАК Номенклатура", + "fields": ["Имя: string"] + }, + { + "name": "Журнал", + "objectName": "ЖурналОшибок", + "fields": ["Сообщение: string(150)", "Уровень: string"] + }, + { + "name": "Объединение", + "items": [ + { + "name": "Часть1", + "query": "ВЫБРАТЬ 1 КАК Поле", + "fields": ["Поле: decimal(10,2)"] + }, + { + "name": "Часть2", + "query": "ВЫБРАТЬ 2 КАК Поле", + "fields": ["Поле: decimal(10,2)"] + } + ] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/field-input-parameters/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/field-input-parameters/decompiled.json index 8f86f190..d5f1d427 100644 --- a/tests/skills/cases/skd-decompile/snapshots/field-input-parameters/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/field-input-parameters/decompiled.json @@ -1,66 +1,61 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", - "fields": [ - { - "field": "СегментНоменклатуры", - "type": "CatalogRef.СегментыНоменклатуры", - "inputParameters": [ - { - "parameter": "ПараметрыВыбора", - "choiceParameters": [ - { - "name": "Отбор.СпособФормирования", - "values": [ - "Перечисление.СпособыФормированияСегментов.ФормироватьВручную", - "Перечисление.СпособыФормированияСегментов.ПериодическиОбновлять" - ] - } - ] - } - ] - }, - { - "field": "Сотрудник", - "type": "CatalogRef.Сотрудники", - "inputParameters": [ - { - "parameter": "СвязиПараметровВыбора", - "choiceParameterLinks": [ - { - "name": "Отбор.ТекущаяОрганизация", - "value": "Организация", - "mode": "Clear" - }, - { - "name": "Отбор.ТекущееПодразделение", - "value": "Подразделение", - "mode": "Clear" - } - ] - } - ] - }, - { - "field": "ПростоЕА", - "type": "CatalogRef.Сотрудники", - "inputParameters": [ - { - "parameter": "ПараметрыВыбора", - "choiceParameters": [ - - ] - }, - { - "parameter": "БыстрыйВыбор", - "use": false, - "value": true - } - ] - } - ] - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", + "fields": [ + { + "field": "СегментНоменклатуры", + "type": "CatalogRef.СегментыНоменклатуры", + "inputParameters": [ + { + "parameter": "ПараметрыВыбора", + "choiceParameters": [ + { + "name": "Отбор.СпособФормирования", + "values": ["Перечисление.СпособыФормированияСегментов.ФормироватьВручную", "Перечисление.СпособыФормированияСегментов.ПериодическиОбновлять"] + } + ] + } + ] + }, + { + "field": "Сотрудник", + "type": "CatalogRef.Сотрудники", + "inputParameters": [ + { + "parameter": "СвязиПараметровВыбора", + "choiceParameterLinks": [ + { + "name": "Отбор.ТекущаяОрганизация", + "value": "Организация", + "mode": "Clear" + }, + { + "name": "Отбор.ТекущееПодразделение", + "value": "Подразделение", + "mode": "Clear" + } + ] + } + ] + }, + { + "field": "ПростоЕА", + "type": "CatalogRef.Сотрудники", + "inputParameters": [ + { + "parameter": "ПараметрыВыбора", + "choiceParameters": [] + }, + { + "parameter": "БыстрыйВыбор", + "use": false, + "value": true + } + ] + } + ] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/field-order-expression/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/field-order-expression/decompiled.json index 6e998416..15c6793e 100644 --- a/tests/skills/cases/skd-decompile/snapshots/field-order-expression/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/field-order-expression/decompiled.json @@ -1,19 +1,19 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.ВидыРасчета", - "fields": [ - { - "field": "ВидРасчета", - "type": "CatalogRef.ВидыРасчета", - "orderExpression": { - "expression": "ЕстьNULL(ВидРасчета.Порядок, 10000)", - "orderType": "Asc", - "autoOrder": false - } - } - ] - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.ВидыРасчета", + "fields": [ + { + "field": "ВидРасчета", + "type": "CatalogRef.ВидыРасчета", + "orderExpression": { + "expression": "ЕстьNULL(ВидРасчета.Порядок, 10000)", + "orderType": "Asc", + "autoOrder": false + } + } + ] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/field-roles-rich/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/field-roles-rich/decompiled.json index 5a9fc2c1..f5ec3470 100644 --- a/tests/skills/cases/skd-decompile/snapshots/field-roles-rich/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/field-roles-rich/decompiled.json @@ -1,14 +1,9 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ РегистрНакопления.Остатки", - "fields": [ - "Период: date @period", - "Контрагент: CatalogRef.Контрагенты @dimension @required", - "СуммаНач: decimal(15,2) @balance balanceGroupName=Сумма balanceType=OpeningBalance", - "СуммаКон: decimal(15,2) @balance balanceGroupName=Сумма balanceType=ClosingBalance" - ] - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ РегистрНакопления.Остатки", + "fields": ["Период: date @period", "Контрагент: CatalogRef.Контрагенты @dimension @required", "СуммаНач: decimal(15,2) @balance balanceGroupName=Сумма balanceType=OpeningBalance", "СуммаКон: decimal(15,2) @balance balanceGroupName=Сумма balanceType=ClosingBalance"] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/fields-types-and-restrictions/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/fields-types-and-restrictions/decompiled.json index a50e7de0..5765a182 100644 --- a/tests/skills/cases/skd-decompile/snapshots/fields-types-and-restrictions/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/fields-types-and-restrictions/decompiled.json @@ -1,46 +1,43 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", - "fields": [ - "Наименование", - "Количество: decimal(15,2)", - "Организация: CatalogRef.Организации @dimension", - "Служебное: string #noField #noFilter", - "СтрокаФикс: string(50,fix)", - "Положительное: decimal(10,nonneg)", - "Дата1: date", - { - "field": "СПояснением", - "title": "Поле с пояснением", - "type": "decimal(15,2)", - "appearance": { - "ГоризонтальноеПоложение": "Right", - "МинимальнаяШирина": "80" - } - }, - { - "field": "Многоязычное", - "title": { - "ru": "Русский", - "en": "English" - }, - "type": "string" - }, - { - "field": "СоставноеПоле", - "type": [ - "CatalogRef.Организации", - "CatalogRef.Валюты" - ] - }, - { - "field": "СВыражениемПредставления", - "type": "CatalogRef.Номенклатура", - "presentationExpression": "Представление(СВыражениемПредставления)" - } - ] - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", + "fields": [ + "Наименование", + "Количество: decimal(15,2)", + "Организация: CatalogRef.Организации @dimension", + "Служебное: string #noField #noFilter", + "СтрокаФикс: string(50,fix)", + "Положительное: decimal(10,nonneg)", + "Дата1: date", + { + "field": "СПояснением", + "title": "Поле с пояснением", + "type": "decimal(15,2)", + "appearance": { + "ГоризонтальноеПоложение": "Right", + "МинимальнаяШирина": "80" + } + }, + { + "field": "Многоязычное", + "title": { + "ru": "Русский", + "en": "English" + }, + "type": "string" + }, + { + "field": "СоставноеПоле", + "type": ["CatalogRef.Организации", "CatalogRef.Валюты"] + }, + { + "field": "СВыражениемПредставления", + "type": "CatalogRef.Номенклатура", + "presentationExpression": "Представление(СВыражениемПредставления)" + } + ] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/minimal-query/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/minimal-query/decompiled.json index 9206cba7..42bbd185 100644 --- a/tests/skills/cases/skd-decompile/snapshots/minimal-query/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/minimal-query/decompiled.json @@ -1,11 +1,9 @@ { - "dataSets": [ - { - "name": "НаборДанных1", - "query": "ВЫБРАТЬ Номенклатура.Наименование КАК Наименование ИЗ Справочник.Номенклатура КАК Номенклатура", - "fields": [ - "Наименование" - ] - } - ] + "dataSets": [ + { + "name": "НаборДанных1", + "query": "ВЫБРАТЬ Номенклатура.Наименование КАК Наименование ИЗ Справочник.Номенклатура КАК Номенклатура", + "fields": ["Наименование"] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/decompiled.json index c98f2ed9..94dc0fec 100644 --- a/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/structure-nested-and-folder/decompiled.json @@ -1,80 +1,70 @@ { - "dataSets": [ - { - "name": "DSОбъединение", - "items": [ - { - "name": "Часть1", - "objectName": "ДанныеЧасть1" - }, - { - "name": "Часть2", - "objectName": "ДанныеЧасть2" - } - ], - "fields": [ - "Период: date", - "ВидРасчета: CatalogRef.ВидыРасчета", - "Сумма: decimal(15,2)", - "Подразделение: CatalogRef.Подразделения" - ] - } - ], - "settingsVariants": [ - { - "name": "Основной", - "settings": { - "selection": [ - "Период", - { - "field": "Сумма", - "title": "Итого" - }, - { - "folder": "Группа итогов", - "items": [ - "ВидРасчета", - { - "field": "Сумма", - "title": "Сумма с расшифровкой" - }, - { - "folder": "Подгруппа", - "items": [ - "Подразделение" - ] - } - ] - } - ], - "structure": [ - { - "name": "Группа1", - "groupFields": [ - { - "field": "Период", - "periodAdditionType": "Day" - }, - { - "field": "Подразделение", - "groupType": "Hierarchy" - } - ], - "children": [ - { - "type": "nestedObject", - "objectID": "ДанныеЧасть1", - "settings": { - "selection": [ - "ВидРасчета", - "Сумма" - ] - } - } - ] - } - ] - } - } - ] + "dataSets": [ + { + "name": "DSОбъединение", + "items": [ + { + "name": "Часть1", + "objectName": "ДанныеЧасть1" + }, + { + "name": "Часть2", + "objectName": "ДанныеЧасть2" + } + ], + "fields": ["Период: date", "ВидРасчета: CatalogRef.ВидыРасчета", "Сумма: decimal(15,2)", "Подразделение: CatalogRef.Подразделения"] + } + ], + "settingsVariants": [ + { + "name": "Основной", + "settings": { + "selection": [ + "Период", + { + "field": "Сумма", + "title": "Итого" + }, + { + "folder": "Группа итогов", + "items": [ + "ВидРасчета", + { + "field": "Сумма", + "title": "Сумма с расшифровкой" + }, + { + "folder": "Подгруппа", + "items": ["Подразделение"] + } + ] + } + ], + "structure": [ + { + "name": "Группа1", + "groupFields": [ + { + "field": "Период", + "periodAdditionType": "Day" + }, + { + "field": "Подразделение", + "groupType": "Hierarchy" + } + ], + "children": [ + { + "type": "nestedObject", + "objectID": "ДанныеЧасть1", + "settings": { + "selection": ["ВидРасчета", "Сумма"] + } + } + ] + } + ] + } + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/template-custom-style/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/template-custom-style/decompiled.json index 3fd919b8..add46c36 100644 --- a/tests/skills/cases/skd-decompile/snapshots/template-custom-style/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/template-custom-style/decompiled.json @@ -1,22 +1,18 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", - "fields": [ - "Поле: string" - ] - } - ], - "templates": [ - { - "name": "Заголовок", - "style": "myHeader", - "rows": [ - [ - "A" - ] - ] - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", + "fields": ["Поле: string"] + } + ], + "templates": [ + { + "name": "Заголовок", + "style": "myHeader", + "rows": [ + ["A"] + ] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/template-custom-style/skd-styles.json b/tests/skills/cases/skd-decompile/snapshots/template-custom-style/skd-styles.json index 95f852b5..1dbbd05e 100644 --- a/tests/skills/cases/skd-decompile/snapshots/template-custom-style/skd-styles.json +++ b/tests/skills/cases/skd-decompile/snapshots/template-custom-style/skd-styles.json @@ -1,15 +1,15 @@ { - "myHeader": { - "font": "Calibri", - "fontSize": 11, - "bold": false, - "italic": false, - "hAlign": "Center", - "vAlign": "Center", - "wrap": false, - "bgColor": "style:ReportHeaderBackColor", - "textColor": null, - "borderColor": "style:ReportLineColor", - "borders": true - } + "myHeader": { + "font": "Calibri", + "fontSize": 11, + "bold": false, + "italic": false, + "hAlign": "Center", + "vAlign": "Center", + "wrap": false, + "bgColor": "style:ReportHeaderBackColor", + "textColor": null, + "borderColor": "style:ReportLineColor", + "borders": true + } } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/template-inline-cell-style/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/template-inline-cell-style/decompiled.json index ba6fd4f1..a2452b29 100644 --- a/tests/skills/cases/skd-decompile/snapshots/template-inline-cell-style/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/template-inline-cell-style/decompiled.json @@ -1,27 +1,25 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", - "fields": [ - "Поле: string" - ] - } - ], - "templates": [ - { - "name": "СмешанныйМакет", - "style": "data", - "rows": [ - [ - "A", - { - "value": "B", - "style": "header" - }, - "C" - ] - ] - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", + "fields": ["Поле: string"] + } + ], + "templates": [ + { + "name": "СмешанныйМакет", + "style": "data", + "rows": [ + [ + "A", + { + "value": "B", + "style": "header" + }, + "C" + ] + ] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/template-no-style/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/template-no-style/decompiled.json index 621c8bcf..ed4aa316 100644 --- a/tests/skills/cases/skd-decompile/snapshots/template-no-style/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/template-no-style/decompiled.json @@ -1,28 +1,19 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", - "fields": [ - "Поле1: string", - "Поле2: string" - ] - } - ], - "templates": [ - { - "name": "БезСтиля", - "style": "none", - "widths": [ - "7", - "7" - ], - "rows": [ - [ - "A", - "B" - ] - ] - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", + "fields": ["Поле1: string", "Поле2: string"] + } + ], + "templates": [ + { + "name": "БезСтиля", + "style": "none", + "widths": ["7", "7"], + "rows": [ + ["A", "B"] + ] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/templates-with-style-merge-drilldown/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/templates-with-style-merge-drilldown/decompiled.json index 3af36759..d6757eb6 100644 --- a/tests/skills/cases/skd-decompile/snapshots/templates-with-style-merge-drilldown/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/templates-with-style-merge-drilldown/decompiled.json @@ -1,81 +1,48 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", - "fields": [ - "Имя: string", - "Сумма: decimal(15,2)" - ] - } - ], - "templates": [ - { - "name": "Шапка", - "style": "header", - "widths": [ - "20", - "30", - "25", - "25" - ], - "rows": [ - [ - "Имя", - "Сумма", - "Поступление", - ">" - ], - [ - "|", - "|", - "из произв.", - "со сч.40" - ], - [ - "К1", - "К2", - "К3", - "К4" - ] - ] - }, - { - "name": "Данные", - "style": "data", - "widths": [ - "20", - "30", - "25", - "25" - ], - "rows": [ - [ - "{Имя}", - "{Сумма}", - "{Поступление}", - "{СчетПрочее}" - ] - ], - "parameters": [ - { - "name": "Имя", - "expression": "Имя" - }, - { - "name": "Сумма", - "expression": "Сумма" - }, - { - "name": "Поступление", - "expression": "СуммаПоступления", - "drilldown": "СуммаПоступления" - }, - { - "name": "СчетПрочее", - "expression": "СчетПрочее" - } - ] - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", + "fields": ["Имя: string", "Сумма: decimal(15,2)"] + } + ], + "templates": [ + { + "name": "Шапка", + "style": "header", + "widths": ["20", "30", "25", "25"], + "rows": [ + ["Имя", "Сумма", "Поступление", ">"], + ["|", "|", "из произв.", "со сч.40"], + ["К1", "К2", "К3", "К4"] + ] + }, + { + "name": "Данные", + "style": "data", + "widths": ["20", "30", "25", "25"], + "rows": [ + ["{Имя}", "{Сумма}", "{Поступление}", "{СчетПрочее}"] + ], + "parameters": [ + { + "name": "Имя", + "expression": "Имя" + }, + { + "name": "Сумма", + "expression": "Сумма" + }, + { + "name": "Поступление", + "expression": "СуммаПоступления", + "drilldown": "СуммаПоступления" + }, + { + "name": "СчетПрочее", + "expression": "СчетПрочее" + } + ] + } + ] } \ No newline at end of file diff --git a/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json b/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json index 3481de64..2617efe6 100644 --- a/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json @@ -1,87 +1,65 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", - "fields": [ - "Организация: CatalogRef.Организации @dimension", - "Номенклатура: CatalogRef.Номенклатура @dimension", - "Сумма: decimal(15,2)", - "Количество: decimal(15,3)", - "Статус: string" - ] - } - ], - "parameters": [ - "Период: StandardPeriod = LastMonth @autoDates", - "Активные: boolean = true" - ], - "templates": [ - { - "name": "Шапка", - "style": "header", - "rows": [ - [ - "Орг", - "Сум" - ] - ] - } - ], - "groupTemplates": [ - { - "groupName": "ДанныеОтчета", - "templateType": "GroupHeader", - "template": "Шапка" - } - ], - "settingsVariants": [ - { - "name": "Основной", - "title": "Основной вариант", - "settings": { - "selection": [ - "Организация", - { - "folder": "Объёмы", - "items": [ - "Сумма", - "Количество" - ] - } - ], - "filter": [ - "Организация = _ @off @user", - { - "group": "Or", - "items": [ - "Статус = Активен", - "Сумма > 1000" - ] - } - ], - "order": [ - "Сумма desc" - ], - "conditionalAppearance": [ - { - "filter": [ - "Сумма > 10000" - ], - "appearance": { - "ЦветТекста": "style:НегативныйТекстЦвет" - }, - "presentation": "Большие суммы", - "viewMode": "Normal", - "userSettingID": "auto" - } - ], - "outputParameters": { - "Заголовок": "Сводка по организациям" - }, - "dataParameters": "auto", - "structure": "Организация > Номенклатура > details" - } - } - ] + "dataSets": [ + { + "name": "Тест", + "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", + "fields": ["Организация: CatalogRef.Организации @dimension", "Номенклатура: CatalogRef.Номенклатура @dimension", "Сумма: decimal(15,2)", "Количество: decimal(15,3)", "Статус: string"] + } + ], + "parameters": ["Период: StandardPeriod = LastMonth @autoDates", "Активные: boolean = true"], + "templates": [ + { + "name": "Шапка", + "style": "header", + "rows": [ + ["Орг", "Сум"] + ] + } + ], + "groupTemplates": [ + { + "groupName": "ДанныеОтчета", + "templateType": "GroupHeader", + "template": "Шапка" + } + ], + "settingsVariants": [ + { + "name": "Основной", + "title": "Основной вариант", + "settings": { + "selection": [ + "Организация", + { + "folder": "Объёмы", + "items": ["Сумма", "Количество"] + } + ], + "filter": [ + "Организация = _ @off @user", + { + "group": "Or", + "items": ["Статус = Активен", "Сумма > 1000"] + } + ], + "order": ["Сумма desc"], + "conditionalAppearance": [ + { + "filter": ["Сумма > 10000"], + "appearance": { + "ЦветТекста": "style:НегативныйТекстЦвет" + }, + "presentation": "Большие суммы", + "viewMode": "Normal", + "userSettingID": "auto" + } + ], + "outputParameters": { + "Заголовок": "Сводка по организациям" + }, + "dataParameters": "auto", + "structure": "Организация > Номенклатура > details" + } + } + ] } \ No newline at end of file