diff --git a/.claude/skills/epf-build/scripts/stub-db-create.ps1 b/.claude/skills/epf-build/scripts/stub-db-create.ps1
index c36a95029..df12dfaa3 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.9 — Create temp 1C infobase with metadata stubs for EPF/ERF build
+# stub-db-create v1.10 — Create temp 1C infobase with metadata stubs for EPF/ERF build
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -442,9 +442,13 @@ function Add-SourceObjectToConfig {
# Содержимое объекта — как есть; в XML та же подстановка типа, .bsl копируются байт в байт.
$srcContent = Join-Path (Split-Path $SourceXml -Parent) $name
if (Test-Path $srcContent) {
+ # Длину префикса берём у РАЗРЕШЁННОГО пути, а не у переданной строки: путь может
+ # прийти с коротким именем (C:\Users\NSHIRO~1\…), а Get-ChildItem отдаёт полное — тогда
+ # отрезание по длине исходной строки оставляет в относительном пути чужие символы.
+ $srcRoot = (Get-Item -LiteralPath $srcContent).FullName.TrimEnd('\', '/')
$dstContent = Join-Path $objDir $name
- foreach ($f in (Get-ChildItem -Path $srcContent -Recurse -File)) {
- $rel = $f.FullName.Substring($srcContent.Length).TrimStart('\', '/')
+ foreach ($f in (Get-ChildItem -LiteralPath $srcRoot -Recurse -File)) {
+ $rel = $f.FullName.Substring($srcRoot.Length).TrimStart('\', '/')
$dst = Join-Path $dstContent $rel
New-Item -ItemType Directory -Path (Split-Path $dst -Parent) -Force | Out-Null
if ($f.Extension -ieq '.xml') {
diff --git a/.claude/skills/epf-build/scripts/stub-db-create.py b/.claude/skills/epf-build/scripts/stub-db-create.py
index 8b8871968..4c16cb645 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.9 — Create temp 1C infobase with metadata stubs for EPF/ERF build
+# stub-db-create v1.10 — Create temp 1C infobase with metadata stubs for EPF/ERF build
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
diff --git a/tests/skills/cases/stub-db-create/_skill.json b/tests/skills/cases/stub-db-create/_skill.json
new file mode 100644
index 000000000..f0f1cab2f
--- /dev/null
+++ b/tests/skills/cases/stub-db-create/_skill.json
@@ -0,0 +1,5 @@
+{
+ "script": "epf-build/scripts/stub-db-create",
+ "setup": "none",
+ "args": []
+}
\ No newline at end of file
diff --git a/tests/skills/cases/stub-db-create/embed-converts-object.json b/tests/skills/cases/stub-db-create/embed-converts-object.json
new file mode 100644
index 000000000..1977724a4
--- /dev/null
+++ b/tests/skills/cases/stub-db-create/embed-converts-object.json
@@ -0,0 +1,64 @@
+{
+ "name": "Внешняя обработка конвертируется в объект конфигурации",
+ "osOnly": "win32",
+ "fakePlatform": {
+ "exit": 1,
+ "log": ""
+ },
+ "preRun": [
+ {
+ "writeFile": {
+ "path": "src/Проба.xml",
+ "content": "\n\n\t\n\t\t\n\t\t\t\n\t\t\t\tcccccccc-4444-5555-6666-dddddddddddd\n\t\t\t\teeeeeeee-7777-8888-9999-ffffffffffff\n\t\t\t\n\t\t\n\t\t\n\t\t\tПроба\n\t\t\tExternalDataProcessor.Проба.Form.Форма\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\n\n"
+ }
+ },
+ {
+ "writeFile": {
+ "path": "src/Проба/Ext/ObjectModule.bsl",
+ "content": "Процедура Проба()\r\n\tСообщить(\"ExternalDataProcessorObject.Проба\");\r\n\tСообщить(\"ExternalDataProcessor.Проба.Form.Форма\");\r\nКонецПроцедуры\r\n"
+ }
+ },
+ {
+ "writeFile": {
+ "path": "src/Проба/Forms/Форма.xml",
+ "content": "\n\n\t\n\n"
+ }
+ }
+ ],
+ "args_extra": [
+ "-SourceDir",
+ "{workDir}\\src",
+ "-V8Path",
+ "{workDir}\\fake.cmd",
+ "-TempBasePath",
+ "{workDir}\\base",
+ "-EmbedSourceFile",
+ "{workDir}\\src\\Проба.xml"
+ ],
+ "expect": {
+ "fileContains": [
+ {
+ "file": "base\\cfg\\DataProcessors\\Проба.xml",
+ "text": [
+ "",
+ "",
+ "DataProcessor.Проба.Form.Форма"
+ ]
+ },
+ {
+ "file": "base\\cfg\\Configuration.xml",
+ "text": "Проба"
+ }
+ ],
+ "fileNotContains": {
+ "file": "base\\cfg\\DataProcessors\\Проба.xml",
+ "text": [
+ "\n\n\t\n\t\t\n\t\t\t\n\t\t\t\tcccccccc-4444-5555-6666-dddddddddddd\n\t\t\t\teeeeeeee-7777-8888-9999-ffffffffffff\n\t\t\t\n\t\t\n\t\t\n\t\t\tПроба\n\t\t\tExternalDataProcessor.Проба.Form.Форма\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\n\n"
+ }
+ },
+ {
+ "writeFile": {
+ "path": "src/Проба/Ext/ObjectModule.bsl",
+ "content": "Процедура Проба()\r\n\tСообщить(\"ExternalDataProcessorObject.Проба\");\r\n\tСообщить(\"ExternalDataProcessor.Проба.Form.Форма\");\r\nКонецПроцедуры\r\n"
+ }
+ },
+ {
+ "writeFile": {
+ "path": "src/Проба/Forms/Форма.xml",
+ "content": "\n\n\t\n\n"
+ }
+ }
+ ],
+ "args_extra": [
+ "-SourceDir",
+ "{workDir}\\src",
+ "-V8Path",
+ "{workDir}\\fake.cmd",
+ "-TempBasePath",
+ "{workDir}\\base",
+ "-EmbedSourceFile",
+ "{workDir}\\src\\Проба.xml"
+ ],
+ "expect": {
+ "filesEqual": [
+ {
+ "actual": "base/cfg/DataProcessors/Проба/Ext/ObjectModule.bsl",
+ "expected": "src/Проба/Ext/ObjectModule.bsl"
+ }
+ ],
+ "fileContains": {
+ "file": "base\\cfg\\DataProcessors\\Проба\\Ext\\ObjectModule.bsl",
+ "text": "ExternalDataProcessorObject.Проба"
+ }
+ },
+ "expectError": true,
+ "noSnapshot": "проверяется равенство файлов, а не снэпшот"
+}
\ No newline at end of file
diff --git a/tests/skills/cases/stub-db-create/embed-reissues-guids.json b/tests/skills/cases/stub-db-create/embed-reissues-guids.json
new file mode 100644
index 000000000..8c8f2f591
--- /dev/null
+++ b/tests/skills/cases/stub-db-create/embed-reissues-guids.json
@@ -0,0 +1,60 @@
+{
+ "name": "У копии все GUID свои",
+ "osOnly": "win32",
+ "fakePlatform": {
+ "exit": 1,
+ "log": ""
+ },
+ "preRun": [
+ {
+ "writeFile": {
+ "path": "src/Проба.xml",
+ "content": "\n\n\t\n\t\t\n\t\t\t\n\t\t\t\tcccccccc-4444-5555-6666-dddddddddddd\n\t\t\t\teeeeeeee-7777-8888-9999-ffffffffffff\n\t\t\t\n\t\t\n\t\t\n\t\t\tПроба\n\t\t\tExternalDataProcessor.Проба.Form.Форма\n\t\t\n\t\t\n\t\t\t\n\t\t\n\t\n\n"
+ }
+ },
+ {
+ "writeFile": {
+ "path": "src/Проба/Ext/ObjectModule.bsl",
+ "content": "Процедура Проба()\r\n\tСообщить(\"ExternalDataProcessorObject.Проба\");\r\n\tСообщить(\"ExternalDataProcessor.Проба.Form.Форма\");\r\nКонецПроцедуры\r\n"
+ }
+ },
+ {
+ "writeFile": {
+ "path": "src/Проба/Forms/Форма.xml",
+ "content": "\n\n\t\n\n"
+ }
+ }
+ ],
+ "args_extra": [
+ "-SourceDir",
+ "{workDir}\\src",
+ "-V8Path",
+ "{workDir}\\fake.cmd",
+ "-TempBasePath",
+ "{workDir}\\base",
+ "-EmbedSourceFile",
+ "{workDir}\\src\\Проба.xml"
+ ],
+ "expect": {
+ "fileNotContains": [
+ {
+ "file": "base\\cfg\\DataProcessors\\Проба.xml",
+ "text": [
+ "aaaaaaaa-1111-2222-3333-bbbbbbbbbbbb",
+ "cccccccc-4444-5555-6666-dddddddddddd",
+ "eeeeeeee-7777-8888-9999-ffffffffffff"
+ ]
+ },
+ {
+ "file": "base\\cfg\\DataProcessors\\Проба\\Forms\\Форма.xml",
+ "text": "11111111-2222-3333-4444-555555555555"
+ }
+ ],
+ "fileContains": {
+ "file": "base\\cfg\\DataProcessors\\Проба.xml",
+ "text": ""
+ }
+ },
+ "expectError": true,
+ "noSnapshot": "генерируются случайные GUID — снять эталон нельзя"
+}