From 0dc014dc478f772a4461ecea61e8a466dcd80840 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Tue, 23 Jun 2026 12:57:41 +0300 Subject: [PATCH] =?UTF-8?q?fix(cfe-borrow):=20=D0=BD=D0=B5=20=D0=B7=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=B0=D1=82=D1=8C=20=D1=81=D1=83=D1=89=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D1=83=D1=8E=D1=89=D0=B8=D0=B9=20Module.bsl?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BD=D0=BE=D0=BC=20=D0=B7=D0=B0=D0=B8=D0=BC=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Повторный borrow формы записывал пустой Module.bsl безусловно → терялся пользовательский код, добавленный в модуль формы (аналог IngvarConsulting/unica#4, воспроизведено: 150→3 байта). Теперь пустой модуль создаётся только если файла ещё нет; существующий сохраняется ("Preserved existing Module.bsl"). Дополняет идемпотентность re-borrow (форма-обёртка/uuid уже были закрыты в v1.5). Тест form-bindings усилен: между первым и вторым заимствованием в модуль пишется код (writeFile), idempotent:true теперь проверяет его сохранность побайтно. Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 | 13 +++++++++---- .claude/skills/cfe-borrow/scripts/cfe-borrow.py | 12 ++++++++---- tests/skills/cases/cfe-borrow/form-bindings.json | 8 +++++++- .../Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl | 4 ++++ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 b/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 index 90c9d492..e64bbae7 100644 --- a/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 +++ b/.claude/skills/cfe-borrow/scripts/cfe-borrow.ps1 @@ -1,4 +1,4 @@ -# cfe-borrow v1.5 — Borrow objects from configuration into extension (CFE) +# cfe-borrow v1.6 — Borrow objects from configuration into extension (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills param( [Parameter(Mandatory)][string]$ExtensionPath, @@ -882,14 +882,19 @@ function Borrow-Form { [System.IO.File]::WriteAllText($formXmlFile, $formXmlSb.ToString(), $enc) Info " Created: $formXmlFile" - # 6. Create empty Module.bsl + # 6. Create empty Module.bsl — but NEVER overwrite an existing one (re-borrow must + # not clobber user code added to the form module). $moduleDir = Join-Path $formXmlDir "Form" if (-not (Test-Path $moduleDir)) { New-Item -ItemType Directory -Path $moduleDir -Force | Out-Null } $moduleBslFile = Join-Path $moduleDir "Module.bsl" - [System.IO.File]::WriteAllText($moduleBslFile, "", $enc) - Info " Created: $moduleBslFile" + if (Test-Path $moduleBslFile) { + Info " Preserved existing Module.bsl" + } else { + [System.IO.File]::WriteAllText($moduleBslFile, "", $enc) + Info " Created: $moduleBslFile" + } # 7. Register form in parent object ChildObjects Register-FormInObject $typeName $objName $formName diff --git a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py index 61a73b13..137dd561 100644 --- a/.claude/skills/cfe-borrow/scripts/cfe-borrow.py +++ b/.claude/skills/cfe-borrow/scripts/cfe-borrow.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# cfe-borrow v1.5 — Borrow objects from configuration into extension (CFE) +# cfe-borrow v1.6 — Borrow objects from configuration into extension (CFE) # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills import argparse @@ -1483,12 +1483,16 @@ def main(): save_text_bom(form_xml_file, "".join(parts)) info(f" Created: {form_xml_file}") - # 6. Create empty Module.bsl + # 6. Create empty Module.bsl — but NEVER overwrite an existing one (re-borrow must + # not clobber user code added to the form module). module_dir = os.path.join(form_xml_dir, "Form") os.makedirs(module_dir, exist_ok=True) module_bsl_file = os.path.join(module_dir, "Module.bsl") - save_text_bom(module_bsl_file, "") - info(f" Created: {module_bsl_file}") + if os.path.isfile(module_bsl_file): + info(" Preserved existing Module.bsl") + else: + save_text_bom(module_bsl_file, "") + info(f" Created: {module_bsl_file}") # 7. Register form in parent object ChildObjects register_form_in_object(type_name, obj_name, form_name) diff --git a/tests/skills/cases/cfe-borrow/form-bindings.json b/tests/skills/cases/cfe-borrow/form-bindings.json index 48d37e2a..6e580e5b 100644 --- a/tests/skills/cases/cfe-borrow/form-bindings.json +++ b/tests/skills/cases/cfe-borrow/form-bindings.json @@ -1,5 +1,5 @@ { - "name": "Заимствование формы: вырезание привязок (Multiple*/Footer) + идемпотентность повторного заимствования", + "name": "Заимствование формы: вырезание привязок (Multiple*/Footer) + идемпотентность (модуль и uuid не затираются при повторе)", "preRun": [ { "script": "meta-compile/scripts/meta-compile", @@ -34,6 +34,12 @@ { "script": "cfe-borrow/scripts/cfe-borrow", "args": { "-ExtensionPath": "{workDir}/ext", "-ConfigPath": "{workDir}", "-Object": "Catalog.Товары.Form.ФормаЭлемента", "-BorrowMainAttribute": "Form" } + }, + { + "writeFile": { + "path": "ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl", + "content": "&НаСервере\nПроцедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)\n\t// пользовательский код — не должен затираться повторным заимствованием\nКонецПроцедуры" + } } ], "params": { "extensionPath": "ext", "object": "Catalog.Товары.Form.ФормаЭлемента" }, diff --git a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl index e69de29b..6bb0b68a 100644 --- a/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl +++ b/tests/skills/cases/cfe-borrow/snapshots/form-bindings/Ext/Catalogs/Товары/Forms/ФормаЭлемента/Ext/Form/Module.bsl @@ -0,0 +1,4 @@ +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + // пользовательский код — не должен затираться повторным заимствованием +КонецПроцедуры \ No newline at end of file