/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.exe -NoProfile -File skills/1c-cfe-patch-method/scripts/cfe-patch-method.ps1 -ExtensionPath src -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
Примеры
# Перехват &Перед на сервере
... -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)
&НаСервере
&Перед("ПриЗаписи")
Процедура Расш1_ПриЗаписи()
// TODO: код перед вызовом оригинального метода
КонецПроцедуры