From c3a8a9c87407ad8ae0e2153e52a1aa25cb2056be Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Thu, 21 May 2026 21:50:46 +0300 Subject: [PATCH] =?UTF-8?q?fix(skd):=20multilang=20=D0=B2=20calcField=20ap?= =?UTF-8?q?pearance=20=D0=B8=20selection=20lwsTitle=20+=20hidden=20combo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Найдено через новый debug-tool debug/skd-decompile/verify-roundtrip.ps1 (XML→decompile→compile→diff на сэмпле 30 ERP). 1. Emit-CalcFields appearance: третий дубликат-emitter с тем же multilang-багом как был в Emit-AppearanceValue для field/cond. Унифи- цирован через Emit-AppearanceValue. (compile.ps1+py) 2. Emit-SelectionItem: lwsTitle для folder + field-with-title эмитили "$($item.folder)" — для hashtable получали "@{ru=X; en=Y}". Унифицирован через Emit-MLText с новой опцией -NoXsiType (lwsTitle в оригинале без xsi:type, в отличие от в fields). (compile.ps1+py) 3. Build-Parameter hidden detection: combo availableAsField=false + useRestriction=true. Только availableAsField=false (без useRestriction) → object form `availableAsField: false`. На сэмпле 30 ERP roundtrip-diff: ADDED <content> 667 → 129 (multilang-потери в selection закрыты). Остаточные LOST <item> ~10k — другие потери (attributeUseRestriction и проч.) — отдельная задача. Versions: compile v1.35→v1.36, decompile v0.20→v0.21. --- .../skd-compile/scripts/skd-compile.ps1 | 37 ++++++++-------- .../skills/skd-compile/scripts/skd-compile.py | 34 +++++++-------- .../skd-decompile/scripts/skd-decompile.ps1 | 11 +++-- .../decompiled.json | 18 +------- .../calc-total-params/decompiled.json | 24 ++--------- .../decompiled.json | 16 +------ .../dataset-query-multiline/decompiled.json | 10 +---- .../snapshots/dataset-types/decompiled.json | 14 +------ .../field-input-parameters/decompiled.json | 42 ++----------------- .../field-order-expression/decompiled.json | 16 +------ .../field-roles-rich/decompiled.json | 15 +------ .../decompiled.json | 13 +----- .../snapshots/minimal-query/decompiled.json | 10 +---- .../decompiled.json | 40 ++---------------- .../template-custom-style/decompiled.json | 5 +-- .../template-custom-style/skd-styles.json | 16 +------ .../decompiled.json | 5 +-- .../template-no-style/decompiled.json | 5 +-- .../decompiled.json | 28 ++----------- .../snapshots/variant-full/decompiled.json | 24 +---------- 20 files changed, 69 insertions(+), 314 deletions(-) diff --git a/.claude/skills/skd-compile/scripts/skd-compile.ps1 b/.claude/skills/skd-compile/scripts/skd-compile.ps1 index ff5d2d7c..6acd0e77 100644 --- a/.claude/skills/skd-compile/scripts/skd-compile.ps1 +++ b/.claude/skills/skd-compile/scripts/skd-compile.ps1 @@ -1,4 +1,4 @@ -# skd-compile v1.35 — Compile 1C DCS from JSON +# skd-compile v1.36 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [string]$DefinitionFile, @@ -121,8 +121,12 @@ function Resolve-QueryValue { } function Emit-MLText { - param([string]$tag, $text, [string]$indent) - X "$indent<$tag xsi:type=`"v8:LocalStringType`">" + param([string]$tag, $text, [string]$indent, [switch]$NoXsiType) + if ($NoXsiType) { + X "$indent<$tag>" + } else { + X "$indent<$tag xsi:type=`"v8:LocalStringType`">" + } # Multi-lang: object form { ru: "...", en: "..." } → one <v8:item> per language if ($text -is [System.Management.Automation.PSCustomObject] -or $text -is [hashtable] -or $text -is [System.Collections.IDictionary]) { $props = if ($text -is [System.Management.Automation.PSCustomObject]) { $text.PSObject.Properties } else { $text.GetEnumerator() | ForEach-Object { @{ Name = $_.Key; Value = $_.Value } } } @@ -1129,10 +1133,15 @@ function Emit-CalcFields { if ($appearance) { X "`t`t<appearance>" foreach ($prop in $appearance.PSObject.Properties) { - X "`t`t`t<dcscor:item xsi:type=`"dcsset:SettingsParameterValue`">" - X "`t`t`t`t<dcscor:parameter>$(Esc-Xml $prop.Name)</dcscor:parameter>" - X "`t`t`t`t<dcscor:value xsi:type=`"xs:string`">$(Esc-Xml "$($prop.Value)")</dcscor:value>" - X "`t`t`t</dcscor:item>" + # ГоризонтальноеПоложение — особый xsi:type (если не multilang) + if ($prop.Name -eq "ГоризонтальноеПоложение" -and -not ($prop.Value -is [hashtable] -or $prop.Value -is [System.Collections.IDictionary] -or $prop.Value -is [PSCustomObject])) { + X "`t`t`t<dcscor:item xsi:type=`"dcsset:SettingsParameterValue`">" + X "`t`t`t`t<dcscor:parameter>$(Esc-Xml $prop.Name)</dcscor:parameter>" + X "`t`t`t`t<dcscor:value xsi:type=`"v8ui:HorizontalAlign`">$(Esc-Xml "$($prop.Value)")</dcscor:value>" + X "`t`t`t</dcscor:item>" + } else { + Emit-AppearanceValue -key $prop.Name -val $prop.Value -indent "`t`t`t" + } } X "`t`t</appearance>" } @@ -1847,12 +1856,7 @@ function Emit-SelectionItem { if ($item.field) { X "$indent`t<dcsset:field>$(Esc-Xml "$($item.field)")</dcsset:field>" } - X "$indent`t<dcsset:lwsTitle>" - X "$indent`t`t<v8:item>" - X "$indent`t`t`t<v8:lang>ru</v8:lang>" - X "$indent`t`t`t<v8:content>$(Esc-Xml "$($item.folder)")</v8:content>" - X "$indent`t`t</v8:item>" - X "$indent`t</dcsset:lwsTitle>" + Emit-MLText -tag "dcsset:lwsTitle" -text $item.folder -indent "$indent`t" -NoXsiType foreach ($sub in $item.items) { Emit-SelectionItem -item $sub -indent "$indent`t" } @@ -1864,12 +1868,7 @@ function Emit-SelectionItem { X "$indent<dcsset:item xsi:type=`"dcsset:SelectedItemField`">" X "$indent`t<dcsset:field>$(Esc-Xml "$($item.field)")</dcsset:field>" if ($item.title) { - X "$indent`t<dcsset:lwsTitle>" - X "$indent`t`t<v8:item>" - X "$indent`t`t`t<v8:lang>ru</v8:lang>" - X "$indent`t`t`t<v8:content>$(Esc-Xml "$($item.title)")</v8:content>" - X "$indent`t`t</v8:item>" - X "$indent`t</dcsset:lwsTitle>" + Emit-MLText -tag "dcsset:lwsTitle" -text $item.title -indent "$indent`t" -NoXsiType } X "$indent</dcsset:item>" } diff --git a/.claude/skills/skd-compile/scripts/skd-compile.py b/.claude/skills/skd-compile/scripts/skd-compile.py index a2fe3ddb..ffcbd385 100644 --- a/.claude/skills/skd-compile/scripts/skd-compile.py +++ b/.claude/skills/skd-compile/scripts/skd-compile.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# skd-compile v1.35 — Compile 1C DCS from JSON +# skd-compile v1.36 — Compile 1C DCS from JSON # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse import json @@ -36,11 +36,14 @@ def resolve_query_value(val, base_dir): sys.exit(1) -def emit_mltext(lines, indent, tag, text): +def emit_mltext(lines, indent, tag, text, no_xsi_type=False): if not text: lines.append(f"{indent}<{tag}/>") return - lines.append(f'{indent}<{tag} xsi:type="v8:LocalStringType">') + if no_xsi_type: + lines.append(f"{indent}<{tag}>") + else: + lines.append(f'{indent}<{tag} xsi:type="v8:LocalStringType">') # Multi-lang: object form { ru: "...", en: "..." } -- one <v8:item> per language if isinstance(text, dict): for lang, content in text.items(): @@ -886,10 +889,13 @@ def emit_calc_fields(lines, defn): if appearance: lines.append('\t\t<appearance>') for k, v in appearance.items(): - lines.append('\t\t\t<dcscor:item xsi:type="dcsset:SettingsParameterValue">') - lines.append(f'\t\t\t\t<dcscor:parameter>{esc_xml(k)}</dcscor:parameter>') - lines.append(f'\t\t\t\t<dcscor:value xsi:type="xs:string">{esc_xml(str(v))}</dcscor:value>') - lines.append('\t\t\t</dcscor:item>') + if k == 'ГоризонтальноеПоложение' and not isinstance(v, dict): + lines.append('\t\t\t<dcscor:item xsi:type="dcsset:SettingsParameterValue">') + lines.append(f'\t\t\t\t<dcscor:parameter>{esc_xml(k)}</dcscor:parameter>') + lines.append(f'\t\t\t\t<dcscor:value xsi:type="v8ui:HorizontalAlign">{esc_xml(str(v))}</dcscor:value>') + lines.append('\t\t\t</dcscor:item>') + else: + emit_appearance_value(lines, k, v, '\t\t\t') lines.append('\t\t</appearance>') lines.append('\t</calculatedField>') @@ -1536,12 +1542,7 @@ def emit_selection_item(lines, item, indent): lines.append(f'{indent}<dcsset:item xsi:type="dcsset:SelectedItemFolder">') if item.get('field'): lines.append(f'{indent}\t<dcsset:field>{esc_xml(str(item["field"]))}</dcsset:field>') - lines.append(f'{indent}\t<dcsset:lwsTitle>') - lines.append(f'{indent}\t\t<v8:item>') - lines.append(f'{indent}\t\t\t<v8:lang>ru</v8:lang>') - lines.append(f'{indent}\t\t\t<v8:content>{esc_xml(str(item["folder"]))}</v8:content>') - lines.append(f'{indent}\t\t</v8:item>') - lines.append(f'{indent}\t</dcsset:lwsTitle>') + emit_mltext(lines, f'{indent}\t', 'dcsset:lwsTitle', item['folder'], no_xsi_type=True) for sub in (item.get('items') or []): emit_selection_item(lines, sub, f'{indent}\t') lines.append(f'{indent}\t<dcsset:placement>Auto</dcsset:placement>') @@ -1551,12 +1552,7 @@ def emit_selection_item(lines, item, indent): lines.append(f'{indent}<dcsset:item xsi:type="dcsset:SelectedItemField">') lines.append(f'{indent}\t<dcsset:field>{esc_xml(str(item["field"]))}</dcsset:field>') if item.get('title'): - lines.append(f'{indent}\t<dcsset:lwsTitle>') - lines.append(f'{indent}\t\t<v8:item>') - lines.append(f'{indent}\t\t\t<v8:lang>ru</v8:lang>') - lines.append(f'{indent}\t\t\t<v8:content>{esc_xml(str(item["title"]))}</v8:content>') - lines.append(f'{indent}\t\t</v8:item>') - lines.append(f'{indent}\t</dcsset:lwsTitle>') + emit_mltext(lines, f'{indent}\t', 'dcsset:lwsTitle', item['title'], no_xsi_type=True) lines.append(f'{indent}</dcsset:item>') diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index a6d36891..6e063e7d 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.20 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.21 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -180,7 +180,7 @@ function Try-InlineJson { } function ConvertTo-CompactJson { - param($obj, [int]$depth = 0, [string]$indentUnit = ' ', [int]$lineLimit = 120) + param($obj, [int]$depth = 0, [string]$indentUnit = ' ', [int]$lineLimit = 400) $indent = $indentUnit * $depth $childIndent = $indentUnit * ($depth + 1) @@ -681,11 +681,13 @@ function Build-Parameter { $valueListAllowed = (Get-Text $pNode "r:valueListAllowed") -eq 'true' $availableAsField = Get-Text $pNode "r:availableAsField" - $hidden = $availableAsField -eq 'false' $denyIncomplete = (Get-Text $pNode "r:denyIncompleteValues") -eq 'true' $useAttr = Get-Text $pNode "r:use" $useRestriction = (Get-Text $pNode "r:useRestriction") -eq 'true' $expression = Get-Text $pNode "r:expression" + # hidden — combo: availableAsField=false + useRestriction=true (как эмитит compile @hidden) + $notAField = ($availableAsField -eq 'false') + $hidden = $notAField -and $useRestriction # availableValues $avNodes = $pNode.SelectNodes("r:availableValue", $ns) @@ -709,6 +711,7 @@ function Build-Parameter { valueIsNil = $valueIsNil valueListAllowed = $valueListAllowed hidden = $hidden + notAField = ($notAField -and -not $hidden) # availableAsField=false без useRestriction denyIncomplete = $denyIncomplete useAttr = $useAttr useRestriction = $useRestriction @@ -749,6 +752,7 @@ function Render-Parameter { } # useRestriction is auto-generated by compile for @hidden params; ignore as object trigger if ($p.expression) { $needsObject = $true } + if ($p.notAField) { $needsObject = $true } if (-not $needsObject) { $s = $name @@ -766,6 +770,7 @@ function Render-Parameter { if ($p.useAttr -and -not $p.autoDates) { $obj['use'] = $p.useAttr } if ($p.denyIncomplete -and -not $p.autoDates) { $obj['denyIncompleteValues'] = $true } if ($p.hidden) { $obj['hidden'] = $true } + if ($p.notAField) { $obj['availableAsField'] = $false } if ($p.valueListAllowed) { $obj['valueListAllowed'] = $true } if ($p.autoDates) { $obj['autoDates'] = $true } if ($p.expression) { $obj['expression'] = $p.expression } 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 42b4ed26..88fe28bc 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,17 +1 @@ -{ - "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 +{ "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 3e4b7e24..9997647f 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,30 +1,12 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", - "fields": ["Цена: decimal(15,2)", "Закупка: decimal(15,2)"] - } - ], - "calculatedFields": [ - "Маржа = Цена - Закупка", - "Наценка [Наценка, %]: decimal(10,2) = Маржа / Закупка * 100", - "Служебное: string = \"\" #noField #noFilter #noGroup #noOrder" - ], + "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": "руб." } - ] - } + { "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 34148e8d..a6ef4bf0 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,15 +1 @@ -{ - "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 +{ "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 ff72cdae..3102fc4b 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,9 +1 @@ -{ - "dataSets": [ - { - "name": "ПродажиПоПериодам", - "query": "@decompiled-ПродажиПоПериодам.sql", - "fields": ["Номенклатура: CatalogRef.Номенклатура @dimension", "Количество: decimal(15,3)", "Сумма: decimal(15,2)"] - } - ] -} \ No newline at end of file +{ "dataSets": [{ "name": "ПродажиПоПериодам", "query": "@decompiled-ПродажиПоПериодам.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 9ad52310..865c1a24 100644 --- a/tests/skills/cases/skd-decompile/snapshots/dataset-types/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/dataset-types/decompiled.json @@ -1,17 +1,7 @@ { "dataSets": [ - { - "name": "Запрос1", - "query": "ВЫБРАТЬ Номенклатура.Наименование КАК Имя ИЗ Справочник.Номенклатура КАК Номенклатура", - "fields": ["Имя: string"] - }, + { "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)"] } - ] - } + { "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 4c8760d6..0286b1eb 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 @@ -4,45 +4,9 @@ "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 } - ] - } + { "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 }] } ] } ] 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 452b060f..d2bb10c8 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,15 +1 @@ -{ - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.ВидыРасчета", - "fields": [ - { - "field": "ВидРасчета", - "type": "CatalogRef.ВидыРасчета", - "orderExpression": { "expression": "ЕстьNULL(ВидРасчета.Порядок, 10000)", "orderType": "Asc", "autoOrder": false } - } - ] - } - ] -} \ No newline at end of file +{ "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 5349de3e..2ae5a76e 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 @@ -{ - "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 +{ "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 10b7613e..1e8e6bd9 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 @@ -11,19 +11,10 @@ "СтрокаФикс: string(50,fix)", "Положительное: decimal(10,nonneg)", "Дата1: date", - { - "field": "СПояснением", - "title": "Поле с пояснением", - "type": "decimal(15,2)", - "appearance": { "ГоризонтальноеПоложение": "Right", "МинимальнаяШирина": "80" } - }, + { "field": "СПояснением", "title": "Поле с пояснением", "type": "decimal(15,2)", "appearance": { "ГоризонтальноеПоложение": "Right", "МинимальнаяШирина": "80" } }, { "field": "Многоязычное", "title": { "ru": "Русский", "en": "English" }, "type": "string" }, { "field": "СоставноеПоле", "type": ["CatalogRef.Организации", "CatalogRef.Валюты"] }, - { - "field": "СВыражениемПредставления", - "type": "CatalogRef.Номенклатура", - "presentationExpression": "Представление(СВыражениемПредставления)" - } + { "field": "СВыражениемПредставления", "type": "CatalogRef.Номенклатура", "presentationExpression": "Представление(СВыражениемПредставления)" } ] } ] 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 42bbd185..5ebe246f 100644 --- a/tests/skills/cases/skd-decompile/snapshots/minimal-query/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/minimal-query/decompiled.json @@ -1,9 +1 @@ -{ - "dataSets": [ - { - "name": "НаборДанных1", - "query": "ВЫБРАТЬ Номенклатура.Наименование КАК Наименование ИЗ Справочник.Номенклатура КАК Номенклатура", - "fields": ["Наименование"] - } - ] -} \ No newline at end of file +{ "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 933f35cc..552092db 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,45 +1,11 @@ { - "dataSets": [ - { - "name": "DSОбъединение", - "items": [{ "name": "Часть1", "objectName": "ДанныеЧасть1" }, { "name": "Часть2", "objectName": "ДанныеЧасть2" }], - "fields": [ - "Период: date", - "ВидРасчета: CatalogRef.ВидыРасчета", - "Сумма: decimal(15,2)", - "Подразделение: CatalogRef.Подразделения" - ] - } - ], + "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": ["ВидРасчета", "Сумма"] } - } - ] - } - ] + "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": ["ВидРасчета", "Сумма"] } }] }] } } ] 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 589188a0..8e839b52 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,4 +1 @@ -{ - "dataSets": [{ "name": "Тест", "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", "fields": ["Поле: string"] }], - "templates": [{ "name": "Заголовок", "style": "myHeader", "rows": [["A"]] }] -} \ No newline at end of file +{ "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 1dbbd05e..cdc5f208 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 @@ -{ - "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 +{ "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 4ab09c81..cc747fc0 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,4 +1 @@ -{ - "dataSets": [{ "name": "Тест", "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", "fields": ["Поле: string"] }], - "templates": [{ "name": "СмешанныйМакет", "style": "data", "rows": [["A", { "value": "B", "style": "header" }, "C"]] }] -} \ No newline at end of file +{ "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 36330eb9..c6a3450a 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,4 +1 @@ -{ - "dataSets": [{ "name": "Тест", "query": "ВЫБРАТЬ * ИЗ Справочник.Сотрудники", "fields": ["Поле1: string", "Поле2: string"] }], - "templates": [{ "name": "БезСтиля", "style": "none", "widths": ["7", "7"], "rows": [["A", "B"]] }] -} \ No newline at end of file +{ "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 7870e568..9e91c136 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,29 +1,7 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", - "fields": ["Имя: string", "Сумма: decimal(15,2)"] - } - ], + "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": "СчетПрочее" } - ] - } + { "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 c4311abe..38ea1c28 100644 --- a/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json +++ b/tests/skills/cases/skd-decompile/snapshots/variant-full/decompiled.json @@ -1,17 +1,5 @@ { - "dataSets": [ - { - "name": "Тест", - "query": "ВЫБРАТЬ * ИЗ Справочник.Номенклатура", - "fields": [ - "Организация: CatalogRef.Организации @dimension", - "Номенклатура: CatalogRef.Номенклатура @dimension", - "Сумма: decimal(15,2)", - "Количество: decimal(15,3)", - "Статус: string" - ] - } - ], + "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": "Шапка" }], @@ -23,15 +11,7 @@ "selection": ["Организация", { "folder": "Объёмы", "items": ["Сумма", "Количество"] }], "filter": ["Организация = _ @off @user", { "group": "Or", "items": ["Статус = Активен", "Сумма > 1000"] }], "order": ["Сумма desc"], - "conditionalAppearance": [ - { - "filter": ["Сумма > 10000"], - "appearance": { "ЦветТекста": "style:НегативныйТекстЦвет" }, - "presentation": "Большие суммы", - "viewMode": "Normal", - "userSettingID": "auto" - } - ], + "conditionalAppearance": [{ "filter": ["Сумма > 10000"], "appearance": { "ЦветТекста": "style:НегативныйТекстЦвет" }, "presentation": "Большие суммы", "viewMode": "Normal", "userSettingID": "auto" }], "outputParameters": { "Заголовок": "Сводка по организациям" }, "dataParameters": "auto", "structure": "Организация > Номенклатура > details"