diff --git a/.claude/skills/cfe-patch-method/SKILL.md b/.claude/skills/cfe-patch-method/SKILL.md index 826c6f13..4944381b 100644 --- a/.claude/skills/cfe-patch-method/SKILL.md +++ b/.claude/skills/cfe-patch-method/SKILL.md @@ -36,8 +36,6 @@ allowed-tools: | `Check` | Проверить контролируемые методы на дрейф (только отчёт) | — | | `Actualize` | Актуализировать дрейфнувшие контролируемые методы | — | -Директива контекста, `Процедура`/`Функция`, сигнатура и обрамление определяются из оригинала автоматически — вручную задавать не нужно. - ## Формат ModulePath | ModulePath | Файл | @@ -64,15 +62,36 @@ allowed-tools: `Before` и `After` применимы только к **процедурам**. Для **функций** доступны `Instead` и `ModificationAndControl`. -## Что переносится из оригинала +## Маркеры `#Вставка` / `#Удаление` (для `ModificationAndControl`) -- **Директива контекста** (`&НаСервере`/`&НаКлиенте`/…) — как у оригинала. -- **Сигнатура** — полный список параметров (для `Instead` имена параметров подставляются в `ПродолжитьВызов`). -- **Обрамляющие `#Если … Тогда`** — наследуются от оригинала. -- **Области `#Область`** — метод помещается в ту же область (переиспользуется, если уже есть в модуле). -- Для `ModificationAndControl` — **всё тело** оригинала дословно; далее расставь маркеры `#Вставка`/`#КонецВставки` и `#Удаление`/`#КонецУдаления`. +`&ИзменениеИКонтроль` вставляет в перехватчик **копию тела оригинала**. Дальше отредактируй тело под свою доработку, **помечая каждое изменение** — платформа так отличает твою правку от неизменного оригинала: -Имя процедуры перехватчика — `<Метод>`; при коллизии в модуле добавляется суффикс типа (`_Перед`/`_После`/`_Вместо`). +- **Добавляешь код** → оберни его `#Вставка` … `#КонецВставки`. +- **Удаляешь код оригинала** → оберни удаляемые строки `#Удаление` … `#КонецУдаления`, но сами строки **оставь между маркерами** (платформа сверяет их с оригиналом). +- **Заменяешь** → `#Удаление` старое `#КонецУдаления` сразу за ним `#Вставка` новое `#КонецВставки`. + +Пример: +```bsl +&ИзменениеИКонтроль("ПриЗаписи") +Процедура Расш_ПриЗаписи(Отказ) + СуммаДокумента = РассчитатьСумму(); +#Вставка + // доработка: округляем + СуммаДокумента = Окр(СуммаДокумента, 2); +#КонецВставки +#Удаление + Записать(); +#КонецУдаления +#Вставка + ЗаписатьСПроверкой(Отказ); +#КонецВставки +КонецПроцедуры +``` + +Правила: +- Маркеры — на **отдельной строке с 0-й колонки** (без отступа), даже внутри отступов и текста запроса (`|…`). +- **Незамеченные (unmarked) строки должны совпадать с оригиналом дословно** — это и есть «контроль». Если оригинал в КФ изменится, unmarked-контекст разойдётся → метод потребует актуализации (см. ниже; проверить пачкой — `-Check`). +- Меняешь только свои `#Вставка`/`#Удаление`; чужой оригинал не трогай. ## Актуализация (повторный вызов `ModificationAndControl`) @@ -80,7 +99,7 @@ allowed-tools: - `[АКТУАЛЕН]` — оригинал не менялся, изменений нет; - `[АКТУАЛИЗИРОВАН]` — тело обновлено по новому оригиналу, правки (`#Вставка`/`#Удаление`) перенесены автоматически (в выводе — сводка перенесённого); -- `[АКТУАЛИЗИРОВАН-ЧАСТИЧНО]` — часть правок не удалось разместить (якорь изменился в новом оригинале). Они помечены `// [РЕСИНК-КОНФЛИКТ]` в модуле и не потеряны. Путь к merge-воркспейсу печатается в выводе — начни с `index.md`, дальше по каждому конфликту его `conflict.md` (см. ниже), размести блоки вручную в `.bsl` расширения. +- `[АКТУАЛИЗИРОВАН-ЧАСТИЧНО]` — часть правок не удалось разместить (якорь изменился в новом оригинале). Они помечены `// [РЕСИНК-КОНФЛИКТ]` в модуле и не потеряны. Путь к merge-воркспейсу печатается в выводе — начни с `index.md`, дальше по каждому конфликту его `conflict.md`, размести блоки вручную в `.bsl` расширения. Повторный вызов `Before`/`After`/`Instead` для уже перехваченного метода не создаёт дубль (`[ПРОПУЩЕН]`).