Files
cc-1c-skills/.claude/skills/cfe-patch-method/SKILL.md
T
Nick ShirokovandClaude Opus 4.8 f89cdf9eff docs(cfe-patch-method): SKILL.md — убрать дублирующее вывод, детализировать маркеры
Принцип: в SKILL.md — только то, чего модель НЕ видит в выводе/результате.

- Убрано: «контекст/сигнатура/обрамление определяются автоматически» (параметров
  для них нет, результат виден); секция «Что переносится из оригинала» целиком
  (всё видно в сгенерированном коде); устаревшие имена файлов воркспейса.
- Добавлено: раздел «Маркеры #Вставка/#Удаление» — синтаксис и семантика, которые
  модель пишет сама и из копии тела не считает (удаляемые строки остаются между
  маркерами, 0-я колонка, unmarked = дословно оригинал = суть контроля, пример).

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

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
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.

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

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

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

Пример:

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

Правила:

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

Актуализация (повторный вызов 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>