1c-cfe-patch-method · git:20260828.e6ca64d · 2026-08-28 · sha256 b438d4e7cedc83d8

1c-cfe-patch-method git:20260828.e6ca64dA

Immutable. This exact content is served forever at /api/v1/blob/b438d4e7cedc83d8.

---
name: 1c-cfe-patch-method
description: "Перехватчики методов в расширении 1С (CFE). Используй когда нужно перехватить метод заимствованного объекта - код до, после или вместо оригинального - либо свериться с оригиналом после обновления основной конфигурации"
---

# /cfe-patch-method - Генерация перехватчика метода

Генерирует `.bsl` файл с декоратором перехвата для заимствованного объекта расширения. Создает файл, дописывает
в существующий регион или, если перехватчик `&ИзменениеИКонтроль` уже стоит, сверяет его с оригиналом и переносит
правки в новую редакцию метода.

## Предусловие

Объект должен быть заимствован в расширение (`/cfe-borrow`). Скрипт читает `NamePrefix` из `Configuration.xml` расширения для формирования имени процедуры.

## Параметры

| Параметр | Описание | По умолчанию |
|----------|----------|--------------|
| `ExtensionPath` | Путь к расширению (обязат.) | - |
| `ModulePath` | Путь к модулю (обязат.) | - |
| `MethodName` | Имя перехватываемого метода (обязат.) | - |
| `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 -ConfigPath C:\cfsrc\erp

# Сверка всех контролируемых методов после обновления конфигурации
... -ExtensionPath src -ConfigPath C:\cfsrc\erp -Check

# Сверка с переносом правок в новую редакцию
... -ExtensionPath src -ConfigPath C:\cfsrc\erp -Actualize
```

## Генерируемый код (Before)

```bsl
&НаСервере
&Перед("ПриЗаписи")
Процедура Расш1_ПриЗаписи
	// TODO: код перед вызовом оригинального метода
КонецПроцедуры
```