1c-cfe-patch-method · diff
git:20260228.62bc165 to git:20260827.48a9ce5
47 added, 6 removed. Audit A to A.
---
name: 1c-cfe-patch-method
- description: "Генерация перехватчика метода в расширении 1С (CFE). Используй когда нужно перехватить метод заимствованного объекта — вставить код до, после или вместо оригинального"
+ description: "Перехватчики методов в расширении 1С (CFE). Используй когда нужно перехватить метод заимствованного объекта - код до, после или вместо оригинального - либо свериться с оригиналом после обновления основной конфигурации"
---
# /cfe-patch-method — Генерация перехватчика метода
- Генерирует `.bsl` файл с декоратором перехвата для заимствованного объекта расширения. Создаёт файл или дописывает в существующий.
+ Генерирует `.bsl` файл с декоратором перехвата для заимствованного объекта расширения. Создает файл, дописывает
+ в существующий регион или, если перехватчик `&ИзменениеИКонтроль` уже стоит, сверяет его с оригиналом и переносит
+ правки в новую редакцию метода.
## Предусловие
Объект должен быть заимствован в расширение (`/cfe-borrow`). Скрипт читает `NamePrefix` из `Configuration.xml` расширения для формирования имени процедуры.
## Параметры
| Параметр | Описание | По умолчанию |
|----------|----------|--------------|
| `ExtensionPath` | Путь к расширению (обязат.) | — |
| `ModulePath` | Путь к модулю (обязат.) | — |
| `MethodName` | Имя перехватываемого метода (обязат.) | — |
- | `InterceptorType` | `Before` / `After` / `ModificationAndControl` (обязат.) | — |
- | `Context` | Директива контекста | `НаСервере` |
- | `IsFunction` | Метод — функция (добавит `Возврат`) | false |
+ | `InterceptorType` | `Before` / `After` / `Instead` / `ModificationAndControl` | обязателен вне `-Check` и `-Actualize` |
+ | `ConfigPath` | Исходники основной конфигурации: оттуда берутся сигнатура, тело и директива компиляции | - |
+ | `Context` | Директива контекста модуля формы | из оригинала, иначе `НаКлиенте` |
+ | `IsFunction` | Метод - функция (когда `ConfigPath` не задан) | false |
+ | `Check` | Сверить перехватчики `&ИзменениеИКонтроль` со всеми оригиналами, ничего не записывая | false |
+ | `Actualize` | То же плюс перенос правок в новую редакцию оригиналов | false |
+ `ModulePath` принимается и как имя объекта (`CommonModule.X`), и как путь к файлу модуля
+ (`CommonModules/X/Ext/Module.bsl`).
+
## Формат 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 и других типов.
## Типы перехвата
| InterceptorType | Декоратор | Назначение |
|-----------------|-----------|------------|
| `Before` | `&Перед` | Код до вызова оригинального метода |
| `After` | `&После` | Код после вызова оригинального метода |
+ | `Instead` | `&Вместо` | Замена метода с явным `ПродолжитьВызов` |
| `ModificationAndControl` | `&ИзменениеИКонтроль` | Копия тела метода с маркерами `#Вставка`/`#Удаление` |
+ `Before` и `After` к функции неприменимы: перехватчик обязан вернуть значение. Скрипт определяет вид
+ метода по оригиналу и отказывает.
+
+ Сигнатура, тело и директива компиляции берутся из `ConfigPath`: платформа связывает перехватчик с
+ оригиналом по имени и списку параметров. Охватывающее условие препроцессора (`#Если Сервер Тогда`)
+ переносится в модуль расширения.
+
+ ## Сверка с оригиналом
+
+ После обновления основной конфигурации тело метода в ней меняется, а копия в `&ИзменениеИКонтроль`
+ остается прежней. Повторный вызов с тем же методом пересобирает копию из новой редакции оригинала,
+ размещая правки по двустороннему якорю - соседним строкам сверху и снизу.
+
+ | Исход | Что произошло |
+ |-------|---------------|
+ | `[АКТУАЛЕН]` | Оригинал не менялся, файл не тронут |
+ | `[АКТУАЛИЗИРОВАН]` | Копия пересобрана, правки размещены по якорям |
+ | `[ПЕРЕНЕСЕНО В ОСНОВНУЮ]` | Правки попали в основную конфигурацию, из расширения убраны |
+ | `[АКТУАЛИЗИРОВАН-ЧАСТИЧНО]` | Якорь исчез: блок вынесен в конец тела с маркером `[РЕСИНК-КОНФЛИКТ]` |
+
+ Комментарий разработчика рядом с поглощенным кодом в основную конфигурацию не переносится - об этом
+ сообщается отдельной строкой.
+
+ `-Check` обходит все расширение и завершается ненулевым кодом при дрейфе, ничего не записывая -
+ пригодно для проверки перед сборкой. `-Actualize` делает то же с записью.
+
## Команда
```powershell
powershell.exe -NoProfile -File skills/1c-cfe-patch-method/scripts/cfe-patch-method.ps1 -ExtensionPath src -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
```
## Примеры
```powershell
# Перехват &Перед на сервере
... -ExtensionPath src -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
# Перехват &После на клиенте
... -ExtensionPath src -ModulePath "Document.Заказ.Form.ФормаДокумента" -MethodName "ПослеЗаписиНаСервере" -InterceptorType After -Context "НаКлиенте"
# ИзменениеИКонтроль для функции
- ... -ExtensionPath src -ModulePath "CommonModule.ОбщийМодуль" -MethodName "ПолучитьДанные" -InterceptorType ModificationAndControl -IsFunction
+ ... -ExtensionPath src -ModulePath "CommonModule.ОбщийМодуль" -MethodName "ПолучитьДанные" -InterceptorType ModificationAndControl -ConfigPath C:\cfsrc\erp
+
+ # Сверка всех контролируемых методов после обновления конфигурации
+ ... -ExtensionPath src -ConfigPath C:\cfsrc\erp -Check
+
+ # Сверка с переносом правок в новую редакцию
+ ... -ExtensionPath src -ConfigPath C:\cfsrc\erp -Actualize
```
## Генерируемый код (Before)
```bsl
&НаСервере
&Перед("ПриЗаписи")
Процедура Расш1_ПриЗаписи
// TODO: код перед вызовом оригинального метода
КонецПроцедуры
```