diff --git a/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 b/.claude/skills/skd-decompile/scripts/skd-decompile.ps1 index 0a8f4957..a8fc378c 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.17 — Decompile 1C DCS Template.xml to JSON DSL (draft) +# skd-decompile v0.18 — Decompile 1C DCS Template.xml to JSON DSL (draft) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -697,6 +697,45 @@ foreach ($k in $script:builtinPresets.Keys) { # existingUserPresetsRaw — копия загруженного skd-styles.json (PSCustomObject) для merge при записи. $script:existingUserPresetsRaw = $null +# Аккумулятор внешних SQL-файлов для записи рядом с outputPath: @{name = "filename.sql"; text = "...sql text..."} +$script:queryFilesAccumulator = @() +$script:queryFileNamesUsed = @{} + +# Если запрос ≥3 строк и есть outputPath — вынести в отдельный .sql и вернуть "@.sql". +# Иначе — оставить inline. +function Maybe-ExternalizeQuery { + param([string]$queryText, [string]$datasetName) + if (-not $queryText) { return $queryText } + if (-not $script:outputDir) { return $queryText } + # Считаем строки — \r\n или \n + $lineCount = ([regex]::Matches($queryText, "`n")).Count + 1 + if ($lineCount -lt 3) { return $queryText } + # Уникализация имени файла + $safeName = ($datasetName -replace '[^\w\-]', '_') + if (-not $safeName) { $safeName = 'query' } + $fileName = "$safeName.sql" + $suffix = 1 + while ($script:queryFileNamesUsed.ContainsKey($fileName)) { + $suffix++ + $fileName = "$safeName`_$suffix.sql" + } + $script:queryFileNamesUsed[$fileName] = $true + $script:queryFilesAccumulator += [ordered]@{ fileName = $fileName; text = $queryText } + return "@$fileName" +} + +# Записать все накопленные .sql файлы рядом с outputPath. +function Save-QueryFiles { + if ($script:queryFilesAccumulator.Count -eq 0) { return } + if (-not $script:outputDir) { return } + $enc = New-Object System.Text.UTF8Encoding($false) + foreach ($qf in $script:queryFilesAccumulator) { + $path = Join-Path $script:outputDir $qf.fileName + [System.IO.File]::WriteAllText($path, $qf.text, $enc) + } + [Console]::Error.WriteLine("Saved $($script:queryFilesAccumulator.Count) external query file(s)") +} + # customStylesAccumulator — новые customN, накопленные в текущем прогоне, для записи в skd-styles.json. $script:customStylesAccumulator = [ordered]@{} @@ -1592,7 +1631,8 @@ function Build-DataSet { switch ($xsiType) { 'DataSetQuery' { - $ds['query'] = Get-Text $dsNode "r:query" + $queryText = Get-Text $dsNode "r:query" + $ds['query'] = Maybe-ExternalizeQuery -queryText $queryText -datasetName $name } 'DataSetObject' { $ds['objectName'] = Get-Text $dsNode "r:objectName" @@ -1850,6 +1890,7 @@ if ($OutputPath) { $enc = New-Object System.Text.UTF8Encoding($false) [System.IO.File]::WriteAllText($OutputPath, $json, $enc) Save-UserStyles -dirPath $script:outputDir + Save-QueryFiles if ($script:warnings.Count -gt 0) { $wPath = [System.IO.Path]::ChangeExtension($OutputPath, $null).TrimEnd('.') + '.warnings.md' diff --git a/tests/skills/cases/skd-decompile/dataset-query-multiline.json b/tests/skills/cases/skd-decompile/dataset-query-multiline.json new file mode 100644 index 00000000..d3ba81f1 --- /dev/null +++ b/tests/skills/cases/skd-decompile/dataset-query-multiline.json @@ -0,0 +1,23 @@ +{ + "name": "Многострочный query → внешний .sql файл (@.sql)", + "preRun": [ + { + "script": "skd-compile/scripts/skd-compile", + "input": { + "dataSets": [{ + "name": "ПродажиПоПериодам", + "query": "ВЫБРАТЬ\n\tНоменклатура,\n\tКоличество,\n\tСумма\nИЗ\n\tРегистрНакопления.Продажи\nГДЕ\n\tПериод МЕЖДУ &НачалоПериода И &КонецПериода", + "fields": [ + "Номенклатура: CatalogRef.Номенклатура @dimension", + "Количество: decimal(15,3)", + "Сумма: decimal(15,2)" + ] + }] + }, + "args": { "-DefinitionFile": "{inputFile}", "-OutputPath": "Template.xml" }, + "cwd": "{workDir}" + } + ], + "params": { "templatePath": "Template.xml" }, + "outputPath": "decompiled.json" +} diff --git a/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/Template.xml b/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/Template.xml new file mode 100644 index 00000000..41377c0c --- /dev/null +++ b/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/Template.xml @@ -0,0 +1,81 @@ + + + + ИсточникДанных1 + Local + + + ПродажиПоПериодам + + Номенклатура + Номенклатура + + true + + + d5p1:CatalogRef.Номенклатура + + + + Количество + Количество + + xs:decimal + + 15 + 3 + Any + + + + + Сумма + Сумма + + xs:decimal + + 15 + 2 + Any + + + + ИсточникДанных1 + ВЫБРАТЬ + Номенклатура, + Количество, + Сумма +ИЗ + РегистрНакопления.Продажи +ГДЕ + Период МЕЖДУ &НачалоПериода И &КонецПериода + + + Основной + + + ru + Основной + + + + + + + + + + + + + + + + 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 new file mode 100644 index 00000000..c975ba67 --- /dev/null +++ b/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/decompiled.json @@ -0,0 +1,13 @@ +{ + "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-query-multiline/ПродажиПоПериодам.sql b/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/ПродажиПоПериодам.sql new file mode 100644 index 00000000..a5e89126 --- /dev/null +++ b/tests/skills/cases/skd-decompile/snapshots/dataset-query-multiline/ПродажиПоПериодам.sql @@ -0,0 +1,8 @@ +ВЫБРАТЬ + Номенклатура, + Количество, + Сумма +ИЗ + РегистрНакопления.Продажи +ГДЕ + Период МЕЖДУ &НачалоПериода И &КонецПериода \ No newline at end of file