$npx -y skills add Nikolay-Shirokov/cc-1c-skills --skill cfe-patch-methodГенерация и актуализация перехватчика метода в расширении 1С (CFE). Используй когда нужно перехватить метод заимствованного объекта — вставить код до, после, вместо оригинала, изменить его тело (ИзменениеИКонтроль) — или актуализировать перехватчик после изменения оригинала
| 1 | # /cfe-patch-method — Генерация перехватчика метода |
| 2 | |
| 3 | Читает оригинал метода из конфигурации-источника и генерирует `.bsl`-перехватчик заимствованного объекта: с правильной директивой контекста, полной сигнатурой, обрамляющими инструкциями препроцессора и областями. Для `ИзменениеИКонтроль` копирует всё тело оригинала. Создаёт файл модуля, дописывает в существующий или актуализирует уже заимствованный метод. |
| 4 | |
| 5 | ## Предусловие |
| 6 | |
| 7 | Объект должен быть заимствован в расширение (`/cfe-borrow`). Нужен доступ к исходникам базовой конфигурации (`-ConfigPath`) — оттуда читается оригинал метода. `NamePrefix` берётся из `Configuration.xml` расширения. |
| 8 | |
| 9 | ### Авто-определение ConfigPath |
| 10 | |
| 11 | Если пользователь не указал `-ConfigPath` — попробуй определить автоматически: |
| 12 | 1. Прочитай `.v8-project.json` из корня проекта |
| 13 | 2. Разреши целевую базу (по имени, ветке или `default` — алгоритм из `/db-list`) |
| 14 | 3. Если у базы есть поле `configSrc` — используй как `-ConfigPath` |
| 15 | 4. Если `configSrc` нет — спроси у пользователя |
| 16 | |
| 17 | ## Параметры |
| 18 | |
| 19 | | Параметр | Описание | По умолчанию | |
| 20 | |----------|----------|--------------| |
| 21 | | `ExtensionPath` | Путь к расширению (обязат.) | — | |
| 22 | | `ConfigPath` | Путь к конфигурации-источнику | обязат., кроме случая, когда `ModulePath` — путь к файлу | |
| 23 | | `ModulePath` | Логическое имя (`Тип.Имя.Модуль`) **или** путь к файлу модуля `.bsl` | обязат. для генерации | |
| 24 | | `MethodName` | Имя перехватываемого метода | обязат. для генерации | |
| 25 | | `InterceptorType` | `Before` / `After` / `Instead` / `ModificationAndControl` | обязат. для генерации | |
| 26 | | `Check` | Проверить контролируемые методы на дрейф (только отчёт) | — | |
| 27 | | `Actualize` | Актуализировать дрейфнувшие контролируемые методы | — | |
| 28 | |
| 29 | ## Формат ModulePath |
| 30 | |
| 31 | | ModulePath | Файл | |
| 32 | |------------|------| |
| 33 | | `Catalog.X.ObjectModule` | `Catalogs/X/Ext/ObjectModule.bsl` | |
| 34 | | `Catalog.X.ManagerModule` | `Catalogs/X/Ext/ManagerModule.bsl` | |
| 35 | | `Catalog.X.Form.Y` | `Catalogs/X/Forms/Y/Ext/Form/Module.bsl` | |
| 36 | | `CommonModule.X` | `CommonModules/X/Ext/Module.bsl` | |
| 37 | | `Document.X.ObjectModule` | `Documents/X/Ext/ObjectModule.bsl` | |
| 38 | | `Document.X.Form.Y` | `Documents/X/Forms/Y/Ext/Form/Module.bsl` | |
| 39 | |
| 40 | Аналогично для Report, DataProcessor, InformationRegister и других типов. |
| 41 | |
| 42 | Вместо логического имени в `ModulePath` можно передать **путь к файлу** модуля-источника `.bsl` — тогда `-ConfigPath` указывать не нужно (оригинал читается прямо из этого файла). Путь модуля расширения определяется от типовой папки в пути автоматически. |
| 43 | |
| 44 | ## Типы перехвата |
| 45 | |
| 46 | | InterceptorType | Декоратор | Назначение | Применим к | |
| 47 | |-----------------|-----------|------------|------------| |
| 48 | | `Before` | `&Перед` | Код до вызова оригинального метода | процедуры | |
| 49 | | `After` | `&После` | Код после вызова оригинального метода | процедуры | |
| 50 | | `Instead` | `&Вместо` | Замена метода; в теле — скаффолд `ПродолжитьВызов(...)` | процедуры и функции | |
| 51 | | `ModificationAndControl` | `&ИзменениеИКонтроль` | Копия тела оригинала для правки маркерами `#Вставка`/`#Удаление` | процедуры и функции | |
| 52 | |
| 53 | ## Маркеры `#Вставка` / `#Удаление` (для `ModificationAndControl`) |
| 54 | |
| 55 | `&ИзменениеИКонтроль` вставляет в перехватчик **копию тела оригинала**. Дальше отредактируй тело под свою доработку, **помечая каждое изменение** — платформа так отличает твою правку от неизменного оригинала: |
| 56 | |
| 57 | - **Добавляешь код** → оберни его `#Вставка` … `#КонецВставки`. |
| 58 | - **Удаляешь код оригинала** → оберни удаляемые строки `#Удаление` … `#КонецУдаления`, но сами строки **оставь между маркерами** (платформа сверяет их с оригиналом). |
| 59 | - **Заменяешь** → `#Удаление` старое `#КонецУдаления` сразу за ним `#Вставка` новое `#КонецВставки`. |
| 60 | |
| 61 | Пример: |
| 62 | ```bsl |
| 63 | &ИзменениеИКонтроль("ПриЗаписи") |
| 64 | Процедура Расш_ПриЗаписи(Отказ) |
| 65 | СуммаДокумента = РассчитатьСумму(); |
| 66 | #Вставка |
| 67 | // доработка: округляем |
| 68 | СуммаДокумента = Окр(СуммаДокумента, 2); |
| 69 | #КонецВставки |
| 70 | #Удаление |
| 71 | Записать(); |
| 72 | #КонецУдаления |
| 73 | #Вставка |
| 74 | ЗаписатьСПроверкой(Отказ); |
| 75 | #КонецВставки |
| 76 | КонецПроцедуры |
| 77 | ``` |
| 78 | |
| 79 | Правила: |
| 80 | - Маркеры — на **отдельной строке с 0-й колонки** (без отступа), даже внутри отступов и текста запроса (`|…`). |
| 81 | - **Незамеченные (unmarked) строки должны совпадать с оригиналом дословно** — это и есть «контроль». Если оригинал в конфигурации-источнике изменится, unmarked-контекст разойдётся → метод потребует актуализации (см. ниже; проверить пачкой — `-Check`). |
| 82 | - Меняешь только свои `#Вставка`/`#Удаление`; чужой оригинал не трогай. |
| 83 | |
| 84 | ## Актуализация |
| 85 | |
| 86 | После изменения оригинала в конфигурации-источнике перехватчик `&ИзменениеИКонтроль` может рассинхро |