После обновления КФ контролируемые методы (&ИзменениеИКонтроль) молча уезжают в рассинхрон — платформа при загрузке не ругается, ошибка лишь в рантайме. Добавлены два явных режима по всему расширению (или -ModulePath/-MethodName для сужения): - -Check — отчёт: какие методы дрейфнули (ДРЕЙФ/КОНФЛИКТ/МЕТОД-ИСЧЕЗ), актуальные числом; ничего не пишет; exit 1 при наличии дрейфа. - -Actualize — чинит пачкой: авто-перенос + merge-воркспейс на конфликтах. Одиночный ресинк вынесен в общую функцию resync_one (report_only), одиночный путь и батч используют её. Зона ответственности узкая — только тело &ИзменениеИКонтроль. Merge-воркспейс переработан: тонкий index.md (список конфликтов + пути к .bsl расширения) + подпапка на метод (conflict.md с блоком/диффом + base/local/remote), без общей портянки. cfe-validate: крошка-указатель [INFO] при наличии контролируемых методов -> /cfe-patch-method -Check. Тесты: +check-clean/check-drift/actualize-batch. 16 кейсов, оба рантайма зелёные, байтовый паритет ps1<->py. verify-snapshots (реальная 1С) Windows ps+py — 16/16. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
12 KiB
name, description, argument-hint, allowed-tools
| name | description | argument-hint | allowed-tools | |||
|---|---|---|---|---|---|---|
| cfe-patch-method | Генерация перехватчика метода в расширении 1С (CFE). Используй когда нужно перехватить метод заимствованного объекта — вставить код до, после, вместо оригинального или изменить его тело (ИзменениеИКонтроль), а также актуализировать перехватчик после изменения оригинала | -ExtensionPath <path> -ConfigPath <path> -ModulePath "Catalog.X.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before |
|
/cfe-patch-method — Генерация перехватчика метода
Читает оригинал метода из конфигурации-источника и генерирует .bsl-перехватчик заимствованного объекта: с правильной директивой контекста, полной сигнатурой, обрамляющими инструкциями препроцессора и областями. Для ИзменениеИКонтроль копирует всё тело оригинала. Создаёт файл модуля, дописывает в существующий или актуализирует уже заимствованный метод.
Предусловие
Объект должен быть заимствован в расширение (/cfe-borrow). Нужен доступ к исходникам базовой конфигурации (-ConfigPath) — оттуда читается оригинал метода. NamePrefix берётся из Configuration.xml расширения.
Авто-определение ConfigPath
Если пользователь не указал -ConfigPath — попробуй определить автоматически:
- Прочитай
.v8-project.jsonиз корня проекта - Разреши целевую базу (по имени, ветке или
default— алгоритм из/db-list) - Если у базы есть поле
configSrc— используй как-ConfigPath - Если
configSrcнет — спроси у пользователя
Параметры
| Параметр | Описание | По умолчанию |
|---|---|---|
ExtensionPath |
Путь к расширению (обязат.) | — |
ConfigPath |
Путь к конфигурации-источнику | обязат., кроме случая, когда ModulePath — путь к файлу |
ModulePath |
Логическое имя (Тип.Имя.Модуль) или путь к файлу модуля .bsl |
обязат. для генерации |
MethodName |
Имя перехватываемого метода | обязат. для генерации |
InterceptorType |
Before / After / Instead / ModificationAndControl |
обязат. для генерации |
Check |
Проверить контролируемые методы на дрейф (только отчёт) | — |
Actualize |
Актуализировать дрейфнувшие контролируемые методы | — |
Директива контекста, Процедура/Функция, сигнатура и обрамление определяются из оригинала автоматически — вручную задавать не нужно.
Формат ModulePath
| ModulePath | Файл |
|---|---|
Catalog.X.ObjectModule |
Catalogs/X/Ext/ObjectModule.bsl |
Catalog.X.ManagerModule |
Catalogs/X/Ext/ManagerModule.bsl |
Catalog.X.Form.Y |
Catalogs/X/Forms/Y/Ext/Form/Module.bsl |
CommonModule.X |
CommonModules/X/Ext/Module.bsl |
Document.X.ObjectModule |
Documents/X/Ext/ObjectModule.bsl |
Document.X.Form.Y |
Documents/X/Forms/Y/Ext/Form/Module.bsl |
Аналогично для Report, DataProcessor, InformationRegister и других типов.
Вместо логического имени в ModulePath можно передать путь к файлу модуля-источника .bsl — тогда -ConfigPath указывать не нужно (оригинал читается прямо из этого файла). Путь модуля расширения определяется от типовой папки в пути автоматически.
Типы перехвата
| InterceptorType | Декоратор | Назначение |
|---|---|---|
Before |
&Перед |
Код до вызова оригинального метода |
After |
&После |
Код после вызова оригинального метода |
Instead |
&Вместо |
Замена метода; в теле — скаффолд ПродолжитьВызов(...) |
ModificationAndControl |
&ИзменениеИКонтроль |
Копия тела оригинала для правки маркерами #Вставка/#Удаление |
Before и After применимы только к процедурам. Для функций доступны Instead и ModificationAndControl.
Что переносится из оригинала
- Директива контекста (
&НаСервере/&НаКлиенте/…) — как у оригинала. - Сигнатура — полный список параметров (для
Insteadимена параметров подставляются вПродолжитьВызов). - Обрамляющие
#Если … Тогда— наследуются от оригинала. - Области
#Область— метод помещается в ту же область (переиспользуется, если уже есть в модуле). - Для
ModificationAndControl— всё тело оригинала дословно; далее расставь маркеры#Вставка/#КонецВставкии#Удаление/#КонецУдаления.
Имя процедуры перехватчика — <NamePrefix><Метод>; при коллизии в модуле добавляется суффикс типа (_Перед/_После/_Вместо).
Актуализация (повторный вызов ModificationAndControl)
Если для метода уже есть перехватчик &ИзменениеИКонтроль, повторный вызов актуализирует его по текущему оригиналу:
[АКТУАЛЕН]— оригинал не менялся, изменений нет;[АКТУАЛИЗИРОВАН]— тело обновлено по новому оригиналу, правки (#Вставка/#Удаление) перенесены автоматически (в выводе — сводка перенесённого);[АКТУАЛИЗИРОВАН-ЧАСТИЧНО]— часть правок не удалось разместить (окружающий контекст изменился). Они помечены// [РЕСИНК-КОНФЛИКТ]и не потеряны; в системный temp выгружается merge-воркспейс (base.bsl— предок,local.bsl— твоя версия с маркерами,remote.bsl— новый оригинал,merged.bsl— результат,diff.txt— base→remote) — путь печатается в выводе. Проверь конфликтные блоки и размести вручную.
Повторный вызов Before/After/Instead для уже перехваченного метода не создаёт дубль ([ПРОПУЩЕН]).
Проверка и актуализация пачкой (-Check / -Actualize)
После обновления конфигурации контролируемые методы (&ИзменениеИКонтроль) могут разойтись с
исходником — платформа при загрузке об этом молчит, ошибка всплывает лишь в рантайме. Эти режимы
проходят по всем &ИзменениеИКонтроль расширения (или сузить: -ModulePath — модуль, + -MethodName — один):
-Check— только отчёт: какие методы дрейфнули (ДРЕЙФ/КОНФЛИКТ/МЕТОД-ИСЧЕЗ); актуальные считаются числом (100/103 актуальны). Ничего не пишет. Код возврата 1, если есть что чинить.-Actualize— чинит: авто-переносит правки, для неоднозначных — merge-воркспейс.
Зона ответственности — только тело &ИзменениеИКонтроль (не свойства/формы/сигнатуры).
Merge-воркспейс конфликтов (-Actualize) в системном temp: index.md (тонкий список конфликтов с
путями к .bsl расширения для правки) + подпапка на каждый конфликтный метод с conflict.md
(что перенести + дифф) и base/local/remote. Путь печатается в выводе.
Команда
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-patch-method.ps1" -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
Примеры
# Код перед записью
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
# Перехват После на форме
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Document.Заказ.Form.ФормаДокумента" -MethodName "ПослеЗаписиНаСервере" -InterceptorType After
# Замена функции (ПродолжитьВызов)
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "CommonModule.ОбщийМодуль" -MethodName "ПолучитьДанные" -InterceptorType Instead
# ИзменениеИКонтроль — копия тела для правки маркерами
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Document.РеализацияТоваров.ObjectModule" -MethodName "ОбработкаПроведения" -InterceptorType ModificationAndControl
# ModulePath как путь к файлу модуля-источника (без -ConfigPath)
... -ExtensionPath src\cfe\ИмяРасширения -ModulePath "src\cf\CommonModules\ОбщийМодуль\Ext\Module.bsl" -MethodName "ПолучитьДанные" -InterceptorType Instead
# Проверить все контролируемые методы расширения на дрейф
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -Check
# Актуализировать дрейфнувшие контролируемые методы пачкой
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -Actualize
Верификация
/cfe-validate <ExtensionPath>