mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-30 16:36:56 +03:00
По результатам прогона субагентом реального сценария (адаптация метода Бухгалтерии + рефакторинг оригинала → конфликт): - SKILL.md: убрана протёкшая и УСТАРЕВШАЯ реализация — раздел про merge-воркспейс называл файлы merged.bsl/diff.txt, которых больше нет; раздел «Проверка/актуализация пачкой» дублировал рантайм-вывод. Оставлено только решенческое (режимы, область, зона ответственности, зачем проактивно). - conflict.md: к каждой неразмещённой вставке добавлена привязка к якорю (после/перед из local) и подсказка «куда переносить» (якорь вынесен/отрефакторен → ищи в диффе новый вызов, размещай пост-обработкой) + напоминание сохранить BOM. Диагноз дрейфа якоря теперь виден, не нужно грепать вручную. - Согласование числительных в итог-строках (было «1 конфликтов»). Паритет ps1<->py, 16 кейсов зелёные в обоих. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
131 lines
11 KiB
Markdown
131 lines
11 KiB
Markdown
---
|
|
name: cfe-patch-method
|
|
description: Генерация перехватчика метода в расширении 1С (CFE). Используй когда нужно перехватить метод заимствованного объекта — вставить код до, после, вместо оригинального или изменить его тело (ИзменениеИКонтроль), а также актуализировать перехватчик после изменения оригинала
|
|
argument-hint: -ExtensionPath <path> -ConfigPath <path> -ModulePath "Catalog.X.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
|
|
allowed-tools:
|
|
- Bash
|
|
- Read
|
|
- Glob
|
|
---
|
|
|
|
# /cfe-patch-method — Генерация перехватчика метода
|
|
|
|
Читает оригинал метода из конфигурации-источника и генерирует `.bsl`-перехватчик заимствованного объекта: с правильной директивой контекста, полной сигнатурой, обрамляющими инструкциями препроцессора и областями. Для `ИзменениеИКонтроль` копирует всё тело оригинала. Создаёт файл модуля, дописывает в существующий или актуализирует уже заимствованный метод.
|
|
|
|
## Предусловие
|
|
|
|
Объект должен быть заимствован в расширение (`/cfe-borrow`). Нужен доступ к исходникам базовой конфигурации (`-ConfigPath`) — оттуда читается оригинал метода. `NamePrefix` берётся из `Configuration.xml` расширения.
|
|
|
|
### Авто-определение ConfigPath
|
|
|
|
Если пользователь не указал `-ConfigPath` — попробуй определить автоматически:
|
|
1. Прочитай `.v8-project.json` из корня проекта
|
|
2. Разреши целевую базу (по имени, ветке или `default` — алгоритм из `/db-list`)
|
|
3. Если у базы есть поле `configSrc` — используй как `-ConfigPath`
|
|
4. Если `configSrc` нет — спроси у пользователя
|
|
|
|
## Параметры
|
|
|
|
| Параметр | Описание | По умолчанию |
|
|
|----------|----------|--------------|
|
|
| `ExtensionPath` | Путь к расширению (обязат.) | — |
|
|
| `ConfigPath` | Путь к конфигурации-источнику | обязат., кроме случая, когда `ModulePath` — путь к файлу |
|
|
| `ModulePath` | Логическое имя (`Тип.Имя.Модуль`) **или** путь к файлу модуля `.bsl` | обязат. для генерации |
|
|
| `MethodName` | Имя перехватываемого метода | обязат. для генерации |
|
|
| `InterceptorType` | `Before` / `After` / `Instead` / `ModificationAndControl` | обязат. для генерации |
|
|
| `Check` | Проверить контролируемые методы на дрейф (только отчёт) | — |
|
|
| `Actualize` | Актуализировать дрейфнувшие контролируемые методы | — |
|
|
|
|
Директива контекста, `Процедура`/`Функция`, сигнатура и обрамление определяются из оригинала автоматически — вручную задавать не нужно.
|
|
|
|
## Формат 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 и других типов.
|
|
|
|
Вместо логического имени в `ModulePath` можно передать **путь к файлу** модуля-источника `.bsl` — тогда `-ConfigPath` указывать не нужно (оригинал читается прямо из этого файла). Путь модуля расширения определяется от типовой папки в пути автоматически.
|
|
|
|
## Типы перехвата
|
|
|
|
| InterceptorType | Декоратор | Назначение |
|
|
|-----------------|-----------|------------|
|
|
| `Before` | `&Перед` | Код до вызова оригинального метода |
|
|
| `After` | `&После` | Код после вызова оригинального метода |
|
|
| `Instead` | `&Вместо` | Замена метода; в теле — скаффолд `ПродолжитьВызов(...)` |
|
|
| `ModificationAndControl` | `&ИзменениеИКонтроль` | Копия тела оригинала для правки маркерами `#Вставка`/`#Удаление` |
|
|
|
|
`Before` и `After` применимы только к **процедурам**. Для **функций** доступны `Instead` и `ModificationAndControl`.
|
|
|
|
## Что переносится из оригинала
|
|
|
|
- **Директива контекста** (`&НаСервере`/`&НаКлиенте`/…) — как у оригинала.
|
|
- **Сигнатура** — полный список параметров (для `Instead` имена параметров подставляются в `ПродолжитьВызов`).
|
|
- **Обрамляющие `#Если … Тогда`** — наследуются от оригинала.
|
|
- **Области `#Область`** — метод помещается в ту же область (переиспользуется, если уже есть в модуле).
|
|
- Для `ModificationAndControl` — **всё тело** оригинала дословно; далее расставь маркеры `#Вставка`/`#КонецВставки` и `#Удаление`/`#КонецУдаления`.
|
|
|
|
Имя процедуры перехватчика — `<NamePrefix><Метод>`; при коллизии в модуле добавляется суффикс типа (`_Перед`/`_После`/`_Вместо`).
|
|
|
|
## Актуализация (повторный вызов `ModificationAndControl`)
|
|
|
|
Если для метода уже есть перехватчик `&ИзменениеИКонтроль`, повторный вызов **актуализирует** его по текущему оригиналу:
|
|
|
|
- `[АКТУАЛЕН]` — оригинал не менялся, изменений нет;
|
|
- `[АКТУАЛИЗИРОВАН]` — тело обновлено по новому оригиналу, правки (`#Вставка`/`#Удаление`) перенесены автоматически (в выводе — сводка перенесённого);
|
|
- `[АКТУАЛИЗИРОВАН-ЧАСТИЧНО]` — часть правок не удалось разместить (якорь изменился в новом оригинале). Они помечены `// [РЕСИНК-КОНФЛИКТ]` в модуле и не потеряны. Путь к merge-воркспейсу печатается в выводе — начни с `index.md`, дальше по каждому конфликту его `conflict.md` (см. ниже), размести блоки вручную в `.bsl` расширения.
|
|
|
|
Повторный вызов `Before`/`After`/`Instead` для уже перехваченного метода не создаёт дубль (`[ПРОПУЩЕН]`).
|
|
|
|
## Пакетно: `-Check` / `-Actualize`
|
|
|
|
По **всем** `&ИзменениеИКонтроль` расширения (сузить: `-ModulePath` — модуль, `+ -MethodName` — один);
|
|
затрагивают **только тело** контролируемых методов. `-Check` — отчёт по дрейфу (`exit 1`, если есть),
|
|
ничего не пишет; `-Actualize` — авто-перенос правок, конфликты уходят в merge-воркспейс (путь и порядок
|
|
разбора печатаются в выводе). Полезно после обновления КФ — о рассинхроне контроля платформа при
|
|
загрузке молчит.
|
|
|
|
## Команда
|
|
|
|
```powershell
|
|
powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-patch-method.ps1" -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
|
|
```
|
|
|
|
## Примеры
|
|
|
|
```powershell
|
|
# Код перед записью
|
|
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
|
|
|
|
# Перехват После на форме
|
|
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Document.Заказ.Form.ФормаДокумента" -MethodName "ПослеЗаписиНаСервере" -InterceptorType After
|
|
|
|
# Замена функции (ПродолжитьВызов)
|
|
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "CommonModule.ОбщийМодуль" -MethodName "ПолучитьДанные" -InterceptorType Instead
|
|
|
|
# ИзменениеИКонтроль — копия тела для правки маркерами
|
|
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Document.РеализацияТоваров.ObjectModule" -MethodName "ОбработкаПроведения" -InterceptorType ModificationAndControl
|
|
|
|
# ModulePath как путь к файлу модуля-источника (без -ConfigPath)
|
|
... -ExtensionPath src\cfe\ИмяРасширения -ModulePath "src\cf\CommonModules\ОбщийМодуль\Ext\Module.bsl" -MethodName "ПолучитьДанные" -InterceptorType Instead
|
|
|
|
# Проверить все контролируемые методы расширения на дрейф
|
|
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -Check
|
|
|
|
# Актуализировать дрейфнувшие контролируемые методы пачкой
|
|
... -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -Actualize
|
|
```
|
|
|
|
## Верификация
|
|
|
|
```
|
|
/cfe-validate <ExtensionPath>
|
|
```
|