diff --git a/.claude/skills/epf-build/scripts/stub-db-create.ps1 b/.claude/skills/epf-build/scripts/stub-db-create.ps1 index df12dfaa3..85da57924 100644 --- a/.claude/skills/epf-build/scripts/stub-db-create.ps1 +++ b/.claude/skills/epf-build/scripts/stub-db-create.ps1 @@ -1,4 +1,4 @@ -# stub-db-create v1.10 — Create temp 1C infobase with metadata stubs for EPF/ERF build +# stub-db-create v1.11 — Create temp 1C infobase with metadata stubs for EPF/ERF build # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)] @@ -387,6 +387,16 @@ if ($needsRegistrator) { # # Подстановка типа делается ТОЛЬКО в .xml (это DefaultForm и основной реквизит формы); в .bsl # такой же текст был бы кодом, и трогать его нельзя. +function Convert-RefTags { + param([string]$Text, [string]$ExtTag, [string]$CfgTag) + + # Только префикс вида объекта в начале квалифицированного имени. Глобальная замена подстроки + # резала бы и имя самого объекта, если оно оканчивается так же (ПриёмкаExternalReport), — + # ссылка расходилась с именем, и заглушка не грузилась. [regex]::Replace, а не -replace: + # оператор регистронезависим, а теги 1С регистрозависимы. + return [regex]::Replace($Text, "(?", "<$cfgTag>").Replace("", "") - $conv = $conv.Replace("${extTag}Object.", "${cfgTag}Object.").Replace("$extTag.", "$cfgTag.") + $conv = Convert-RefTags $conv $extTag $cfgTag # Тип менеджера у внешней обработки не объявлен, а объекту конфигурации он обязателен: # без него платформа отвечает «отсутствует один или более типов объекта». @@ -454,7 +464,7 @@ function Add-SourceObjectToConfig { if ($f.Extension -ieq '.xml') { $t = [IO.File]::ReadAllText($f.FullName, [Text.Encoding]::UTF8) $t = $reGuid.Replace($t, $reissue) - $t = $t.Replace("${extTag}Object.", "${cfgTag}Object.").Replace("$extTag.", "$cfgTag.") + $t = Convert-RefTags $t $extTag $cfgTag [IO.File]::WriteAllText($dst, $t, $encBom) } else { Copy-Item -Path $f.FullName -Destination $dst -Force diff --git a/.claude/skills/epf-build/scripts/stub-db-create.py b/.claude/skills/epf-build/scripts/stub-db-create.py index 4c16cb645..89548f798 100644 --- a/.claude/skills/epf-build/scripts/stub-db-create.py +++ b/.claude/skills/epf-build/scripts/stub-db-create.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# stub-db-create v1.10 — Create temp 1C infobase with metadata stubs for EPF/ERF build +# stub-db-create v1.11 — Create temp 1C infobase with metadata stubs for EPF/ERF build # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -1133,6 +1133,14 @@ def write_bom(path, content): GUID_RE = re.compile(r'[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}') +def retag_refs(text, ext_tag, cfg_tag): + # Только префикс вида объекта в начале квалифицированного имени. Глобальная замена подстроки + # резала бы и имя самого объекта, если оно оканчивается так же (ПриёмкаExternalReport), — + # ссылка расходилась с именем, и заглушка не грузилась. + return re.sub(r'(?' % ext_tag, '<%s>' % cfg_tag) conv = conv.replace('' % ext_tag, '' % cfg_tag) - conv = conv.replace('%sObject.' % ext_tag, '%sObject.' % cfg_tag).replace('%s.' % ext_tag, '%s.' % cfg_tag) + conv = retag_refs(conv, ext_tag, cfg_tag) # Тип менеджера у внешней обработки не объявлен, а объекту конфигурации он обязателен: # без него платформа отвечает «отсутствует один или более типов объекта». @@ -1200,7 +1208,7 @@ def add_source_object_to_config(source_xml, cfg_dir): with io.open(full, encoding='utf-8-sig') as fh: t = fh.read() t = reissue(t) - t = t.replace('%sObject.' % ext_tag, '%sObject.' % cfg_tag).replace('%s.' % ext_tag, '%s.' % cfg_tag) + t = retag_refs(t, ext_tag, cfg_tag) write_bom(dst, t) else: shutil.copyfile(full, dst) diff --git a/tests/skills/cases/stub-db-create/embed-converts-object.json b/tests/skills/cases/stub-db-create/embed-converts-object.json index 1977724a4..70a5ced78 100644 --- a/tests/skills/cases/stub-db-create/embed-converts-object.json +++ b/tests/skills/cases/stub-db-create/embed-converts-object.json @@ -1,6 +1,5 @@ { "name": "Внешняя обработка конвертируется в объект конфигурации", - "osOnly": "win32", "fakePlatform": { "exit": 1, "log": "" @@ -27,18 +26,18 @@ ], "args_extra": [ "-SourceDir", - "{workDir}\\src", + "{workDir}/src", "-V8Path", - "{workDir}\\fake.cmd", + "{fakePlatform}", "-TempBasePath", - "{workDir}\\base", + "{workDir}/base", "-EmbedSourceFile", - "{workDir}\\src\\Проба.xml" + "{workDir}/src/Проба.xml" ], "expect": { "fileContains": [ { - "file": "base\\cfg\\DataProcessors\\Проба.xml", + "file": "base/cfg/DataProcessors/Проба.xml", "text": [ "", @@ -47,12 +46,12 @@ ] }, { - "file": "base\\cfg\\Configuration.xml", + "file": "base/cfg/Configuration.xml", "text": "Проба" } ], "fileNotContains": { - "file": "base\\cfg\\DataProcessors\\Проба.xml", + "file": "base/cfg/DataProcessors/Проба.xml", "text": [ "ТестExternalDataProcessor", + "DataProcessor.ТестExternalDataProcessor.Form.Форма", + "", + "" + ] + }, + { + "file": "base/cfg/DataProcessors/ТестExternalDataProcessor/Forms/Форма/Ext/Form.xml", + "text": "cfg:DataProcessorObject.ТестExternalDataProcessor" + }, + { + "file": "base/cfg/Configuration.xml", + "text": "ТестExternalDataProcessor" + } + ], + "fileNotContains": [ + { + "file": "base/cfg/DataProcessors/ТестExternalDataProcessor.xml", + "text": [ + "ТестDataProcessor", + "ExternalDataProcessor." + ] + }, + { + "file": "base/cfg/DataProcessors/ТестExternalDataProcessor/Forms/Форма/Ext/Form.xml", + "text": "ТестDataProcessor" + } + ] + }, + "expectError": true, + "noSnapshot": "платформа фейковая, а GUID копии перевыпускаются случайными — проверяется сгенерированная конфигурация" +} diff --git a/tests/skills/cases/stub-db-create/embed-name-suffix-report.json b/tests/skills/cases/stub-db-create/embed-name-suffix-report.json new file mode 100644 index 000000000..9d1e33d85 --- /dev/null +++ b/tests/skills/cases/stub-db-create/embed-name-suffix-report.json @@ -0,0 +1,73 @@ +{ + "name": "Имя, оканчивающееся на ExternalReport, не калечится в ссылках", + "fakePlatform": { + "exit": 1, + "log": "" + }, + "preRun": [ + { + "script": "erf-init/scripts/init", + "args": { + "-Name": "ПриёмкаExternalReport", + "-SrcDir": "{workDir}/src", + "-WithSKD": true + } + }, + { + "script": "form-add/scripts/form-add", + "args": { + "-ObjectPath": "{workDir}/src/ПриёмкаExternalReport.xml", + "-FormName": "Форма", + "-SetDefault": true + } + } + ], + "args_extra": [ + "-SourceDir", + "{workDir}/src", + "-V8Path", + "{fakePlatform}", + "-TempBasePath", + "{workDir}/base", + "-EmbedSourceFile", + "{workDir}/src/ПриёмкаExternalReport.xml" + ], + "expect": { + "fileContains": [ + { + "file": "base/cfg/Reports/ПриёмкаExternalReport.xml", + "text": [ + "ПриёмкаExternalReport", + "Report.ПриёмкаExternalReport.Form.Форма", + "", + "", + "Report.ПриёмкаExternalReport.Template.ОсновнаяСхемаКомпоновкиДанных" + ] + }, + { + "file": "base/cfg/Reports/ПриёмкаExternalReport/Forms/Форма/Ext/Form.xml", + "text": "cfg:ReportObject.ПриёмкаExternalReport" + }, + { + "file": "base/cfg/Configuration.xml", + "text": "ПриёмкаExternalReport" + } + ], + "fileNotContains": [ + { + "file": "base/cfg/Reports/ПриёмкаExternalReport.xml", + "text": [ + "ПриёмкаReport", + "ExternalReport." + ] + }, + { + "file": "base/cfg/Reports/ПриёмкаExternalReport/Forms/Форма/Ext/Form.xml", + "text": "ПриёмкаReport" + } + ] + }, + "expectError": true, + "noSnapshot": "платформа фейковая, а GUID копии перевыпускаются случайными — проверяется сгенерированная конфигурация" +} diff --git a/tests/skills/cases/stub-db-create/embed-reissues-guids.json b/tests/skills/cases/stub-db-create/embed-reissues-guids.json index 8c8f2f591..d9464c3f1 100644 --- a/tests/skills/cases/stub-db-create/embed-reissues-guids.json +++ b/tests/skills/cases/stub-db-create/embed-reissues-guids.json @@ -1,6 +1,5 @@ { "name": "У копии все GUID свои", - "osOnly": "win32", "fakePlatform": { "exit": 1, "log": "" @@ -27,18 +26,18 @@ ], "args_extra": [ "-SourceDir", - "{workDir}\\src", + "{workDir}/src", "-V8Path", - "{workDir}\\fake.cmd", + "{fakePlatform}", "-TempBasePath", - "{workDir}\\base", + "{workDir}/base", "-EmbedSourceFile", - "{workDir}\\src\\Проба.xml" + "{workDir}/src/Проба.xml" ], "expect": { "fileNotContains": [ { - "file": "base\\cfg\\DataProcessors\\Проба.xml", + "file": "base/cfg/DataProcessors/Проба.xml", "text": [ "aaaaaaaa-1111-2222-3333-bbbbbbbbbbbb", "cccccccc-4444-5555-6666-dddddddddddd", @@ -46,12 +45,12 @@ ] }, { - "file": "base\\cfg\\DataProcessors\\Проба\\Forms\\Форма.xml", + "file": "base/cfg/DataProcessors/Проба/Forms/Форма.xml", "text": "11111111-2222-3333-4444-555555555555" } ], "fileContains": { - "file": "base\\cfg\\DataProcessors\\Проба.xml", + "file": "base/cfg/DataProcessors/Проба.xml", "text": "" } },