mcpField
C
cfe-patch-method

cfe-patch-method

github.com/nikolay-shirokov开发74155 次安装今天更新
代码仓库

关于 cfe-patch-method

用于从源配置代码生成和维护 1C 扩展方法拦截器的技能,支持多种拦截类型,并可检查或同步源代码变更后的受控方法。

主要功能

  1. 01生成含完整签名的拦截器
  2. 02支持 Before、After、Instead 和受控修改
  3. 03检查受控方法的源代码漂移
  4. 04根据更新后的源代码重新同步修改

适用场景

  1. 01在 1C 方法调用前后添加代码
  2. 02替换过程或函数
  3. 03保留标记差异并定制方法
  4. 04源代码更新后检查扩展方法

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/nikolay-shirokov/cc-1c-skills --skill cfe-patch-method

安装后在 Claude Code 中输入/cfe-patch-method确认已加载。

附带文件scripts/cfe-patch-method.ps1scripts/cfe-patch-method.py

README 原文English

来自项目 README

README 暂无中文译文,以下为英文原文;中文介绍见上方。

/cfe-patch-method — Генерация перехватчика метода

Читает оригинал метода из конфигурации-источника и генерирует .bsl-перехватчик заимствованного объекта: с правильной директивой контекста, полной сигнатурой, обрамляющими инструкциями препроцессора и областями. Для ИзменениеИКонтроль копирует всё тело оригинала. Создаёт файл модуля, дописывает в существующий или актуализирует уже заимствованный метод.

Предусловие

Объект должен быть заимствован в расширение (/cfe-borrow). Нужен доступ к исходникам базовой конфигурации (-ConfigPath) — оттуда читается оригинал метода. NamePrefix берётся из Configuration.xml расширения.

Авто-определение ConfigPath

Если пользователь не указал -ConfigPath — попробуй определить автоматически:

  1. Прочитай .v8-project.json из корня проекта
  2. Разреши целевую базу (по имени, ветке или default — алгоритм из /db-list)
  3. Если у базы есть поле configSrc — используй как -ConfigPath
  4. Если configSrc нет — спроси у пользователя

Параметры

ПараметрОписаниеПо умолчанию
ExtensionPathПуть к расширению (обязат.)—
ConfigPathПуть к конфигурации-источникуобязат., кроме случая, когда ModulePath — путь к файлу
ModulePathЛогическое имя (Тип.Имя.Модуль) или путь к файлу модуля .bslобязат. для генерации
MethodNameИмя перехватываемого методаобязат. для генерации
InterceptorTypeBefore / After / Instead / ModificationAndControlобязат. для генерации
CheckПроверить контролируемые методы на дрейф (только отчёт)—
ActualizeАктуализировать дрейфнувшие контролируемые методы—

Формат ModulePath

ModulePathФайл
Catalog.X.ObjectModuleCatalogs/X/Ext/ObjectModule.bsl
Catalog.X.ManagerModuleCatalogs/X/Ext/ManagerModule.bsl
Catalog.X.Form.YCatalogs/X/Forms/Y/Ext/Form/Module.bsl
CommonModule.XCommonModules/X/Ext/Module.bsl
CommonForm.XCommonForms/X/Ext/Form/Module.bsl
Document.X.ObjectModuleDocuments/X/Ext/ObjectModule.bsl
Document.X.Form.YDocuments/X/Forms/Y/Ext/Form/Module.bsl

Аналогично для Report, DataProcessor, InformationRegister и других типов.

Вместо логического имени в ModulePath можно передать путь к файлу модуля-источника .bsl — тогда -ConfigPath указывать не нужно (оригинал читается прямо из этого файла). Путь модуля расширения определяется от типовой папки в пути автоматически.

Типы перехвата

InterceptorTypeДекораторНазначениеПрименим к
Before&ПередКод до вызова оригинального методапроцедуры
After&ПослеКод после вызова оригинального методапроцедуры
Instead&ВместоЗамена метода; в теле — скаффолд ПродолжитьВызов(...)процедуры и функции
ModificationAndControl&ИзменениеИКонтрольКопия тела оригинала для правки маркерами #Вставка/#Удалениепроцедуры и функции

Маркеры #Вставка / #Удаление (для ModificationAndControl)

&ИзменениеИКонтроль вставляет в перехватчик копию тела оригинала. Дальше отредактируй тело под свою доработку, помечая каждое изменение — платформа так отличает твою правку от неизменного оригинала:

  • Добавляешь код → оберни его #Вставка … #КонецВставки.
  • Удаляешь код оригинала → оберни удаляемые строки #Удаление … #КонецУдаления, но сами строки оставь между маркерами (платформа сверяет их с оригиналом).
  • Заменяешь → #Удаление старое #КонецУдаления сразу за ним #Вставка новое #КонецВставки.

Пример:

&ИзменениеИКонтроль("ПриЗаписи")
Процедура Расш_ПриЗаписи(Отказ)
	СуммаДокумента = РассчитатьСумму();
#Вставка
	// доработка: округляем
	СуммаДокумента = Окр(СуммаДокумента, 2);
#КонецВставки
#Удаление
	Записать();
#КонецУдаления
#Вставка
	ЗаписатьСПроверкой(Отказ);
#КонецВставки
КонецПроцедуры

Правила:

  • Маркеры — на отдельной строке с 0-й колонки (без отступа), даже внутри отступов и текста запроса (|…).
  • Незамеченные (unmarked) строки должны совпадать с оригиналом дословно — это и есть «контроль». Дословно — включая комментарии, регистр и пробелы внутри строки (Х = Х + 1 ≠ Х=Х+1); свободны только отступ и пустые строки. Если оригинал в конфигурации-источнике изменится, unmarked-контекст разойдётся → метод потребует актуализации (см. ниже; проверить пачкой — -Check).
  • Меняешь только свои #Вставка/#Удаление; чужой оригинал не трогай.

Актуализация

После изменения оригинала в конфигурации-источнике перехватчик &ИзменениеИКонтроль может рассинхронизироваться — unmarked-контекст разойдётся с новым оригиналом. Платформа при загрузке об этом молчит, поэтому актуализируй сам:

  • Проверить — -Check: отчёт по всем контролируемым методам расширения, ничего не пишет (exit 1, если есть дрейф или конфликт).
  • Актуализировать — -Actualize: переносит правки (#Вставка/#Удаление) на новый оригинал по всему расширению. Сузить область: -ModulePath — один модуль, + -MethodName — один метод. Для одного метода то же делает повторный вызов с -InterceptorType ModificationAndControl.

Статусы в выводе:

  • [АКТУАЛЕН] — оригинал не менялся, правок нет;
  • [АКТУАЛИЗИРОВАН] — тело обновлено по новому оригиналу, правки сохранены (в выводе — сводка);
  • [АКТУАЛИЗИРОВАН-ЧАСТИЧНО] — часть правок не удалось разместить (якорь изменился в новом оригинале). Они помечены // [РЕСИНК-КОНФЛИКТ] в модуле и не потеряны; путь к merge-воркспейсу — в выводе (начни с index.md, дальше по каждому конфликту его conflict.md, размести блоки вручную в .bsl расширения);
  • [ПЕРЕНЕСЕНО В ОСНОВНУЮ] — правка уже есть в новом оригинале (вставленный код внесён вендором) или удаляемый блок уже вырезан. Правка неактуальна — убирается из тела, дублировать/конфликтовать не нужно. Если так со всеми правками метода — перехватчик можно удалить. -Check этим не роняет exit.

Повторный вызов Before/After/Instead для уже перехваченного метода дубль не создаёт ([ПРОПУЩЕН]).

-Check смотрит исходники. Вердикт платформы — уже после загрузки в базу: /db-cfe-admin check.

Команда

powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-patch-method.ps1" -ExtensionPath src\cfe\extname -ConfigPath src\cf -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before

Примеры

# Код перед записью
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before

# Перехват После на форме
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -ModulePath "Document.Заказ.Form.ФормаДокумента" -MethodName "ПослеЗаписиНаСервере" -InterceptorType After

# Замена функции (ПродолжитьВызов)
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -ModulePath "CommonModule.ОбщийМодуль" -MethodName "ПолучитьДанные" -InterceptorType Instead

# ИзменениеИКонтроль — копия тела для правки маркерами
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -ModulePath "Document.РеализацияТоваров.ObjectModule" -MethodName "ОбработкаПроведения" -InterceptorType ModificationAndControl

# ModulePath как путь к файлу модуля-источника (без -ConfigPath)
... -ExtensionPath src\cfe\extname -ModulePath "src\cf\CommonModules\ОбщийМодуль\Ext\Module.bsl" -MethodName "ПолучитьДанные" -InterceptorType Instead

# Проверить все контролируемые методы расширения на дрейф
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Check

# Актуализировать дрейфнувшие контролируемые методы пачкой
... -ExtensionPath src\cfe\extname -ConfigPath src\cf -Actualize

Верификация

/cfe-validate <ExtensionPath> -ConfigPath <ConfigPath>

评论

支持 Markdown