Files
cc-1c-skills/.claude/skills/cfe-patch-method/SKILL.md
T
Nick ShirokovandClaude Opus 4.8 dcce32faed refactor(cfe-patch-method): эргономика вывода по итогам dogfood
По результатам прогона субагентом реального сценария (адаптация метода Бухгалтерии
+ рефакторинг оригинала → конфликт):

- SKILL.md: убрана протёкшая и УСТАРЕВШАЯ реализация — раздел про merge-воркспейс
  называл файлы merged.bsl/diff.txt, которых больше нет; раздел «Проверка/актуализация
  пачкой» дублировал рантайм-вывод. Оставлено только решенческое (режимы, область,
  зона ответственности, зачем проактивно).
- conflict.md: к каждой неразмещённой вставке добавлена привязка к якорю (после/перед из
  local) и подсказка «куда переносить» (якорь вынесен/отрефакторен → ищи в диффе новый
  вызов, размещай пост-обработкой) + напоминание сохранить BOM. Диагноз дрейфа якоря
  теперь виден, не нужно грепать вручную.
- Согласование числительных в итог-строках (было «1 конфликтов»).

Паритет ps1<->py, 16 кейсов зелёные в обоих.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 21:07:41 +03:00

11 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
Bash
Read
Glob

/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 Имя перехватываемого метода обязат. для генерации
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)

Если для метода уже есть перехватчик &ИзменениеИКонтроль, повторный вызов актуализирует его по текущему оригиналу:

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

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

Пакетно: -Check / -Actualize

По всем &ИзменениеИКонтроль расширения (сузить: -ModulePath — модуль, + -MethodName — один); затрагивают только тело контролируемых методов. -Check — отчёт по дрейфу (exit 1, если есть), ничего не пишет; -Actualize — авто-перенос правок, конфликты уходят в merge-воркспейс (путь и порядок разбора печатаются в выводе). Полезно после обновления КФ — о рассинхроне контроля платформа при загрузке молчит.

Команда

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>