Files
cc-1c-skills/.claude/skills/cfe-patch-method/SKILL.md
T
Nick ShirokovandClaude Opus 4.8 9aaa3a1c1e feat(cfe-patch-method): батч -Check/-Actualize контролируемых методов (v2.2)
После обновления КФ контролируемые методы (&ИзменениеИКонтроль) молча уезжают в
рассинхрон — платформа при загрузке не ругается, ошибка лишь в рантайме. Добавлены
два явных режима по всему расширению (или -ModulePath/-MethodName для сужения):

- -Check — отчёт: какие методы дрейфнули (ДРЕЙФ/КОНФЛИКТ/МЕТОД-ИСЧЕЗ), актуальные
  числом; ничего не пишет; exit 1 при наличии дрейфа.
- -Actualize — чинит пачкой: авто-перенос + merge-воркспейс на конфликтах.

Одиночный ресинк вынесен в общую функцию resync_one (report_only), одиночный путь и
батч используют её. Зона ответственности узкая — только тело &ИзменениеИКонтроль.

Merge-воркспейс переработан: тонкий index.md (список конфликтов + пути к .bsl расширения)
+ подпапка на метод (conflict.md с блоком/диффом + base/local/remote), без общей портянки.

cfe-validate: крошка-указатель [INFO] при наличии контролируемых методов -> /cfe-patch-method -Check.

Тесты: +check-clean/check-drift/actualize-batch. 16 кейсов, оба рантайма зелёные,
байтовый паритет ps1<->py. verify-snapshots (реальная 1С) Windows ps+py — 16/16.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 20:37:58 +03:00

12 KiB

name, description, argument-hint, allowed-tools
name description argument-hint allowed-tools
cfe-patch-method Генерация перехватчика метода в расширении 1С (CFE). Используй когда нужно перехватить метод заимствованного объекта — вставить код до, после, вместо оригинального или изменить его тело (ИзменениеИКонтроль), а также актуализировать перехватчик после изменения оригинала -ExtensionPath <path> -ConfigPath <path> -ModulePath "Catalog.X.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before
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)

Если для метода уже есть перехватчик &ИзменениеИКонтроль, повторный вызов актуализирует его по текущему оригиналу:

  • [АКТУАЛЕН] — оригинал не менялся, изменений нет;
  • [АКТУАЛИЗИРОВАН] — тело обновлено по новому оригиналу, правки (#Вставка/#Удаление) перенесены автоматически (в выводе — сводка перенесённого);
  • [АКТУАЛИЗИРОВАН-ЧАСТИЧНО] — часть правок не удалось разместить (окружающий контекст изменился). Они помечены // [РЕСИНК-КОНФЛИКТ] и не потеряны; в системный temp выгружается merge-воркспейс (base.bsl — предок, local.bsl — твоя версия с маркерами, remote.bsl — новый оригинал, merged.bsl — результат, diff.txt — base→remote) — путь печатается в выводе. Проверь конфликтные блоки и размести вручную.

Повторный вызов Before/After/Instead для уже перехваченного метода не создаёт дубль ([ПРОПУЩЕН]).

Проверка и актуализация пачкой (-Check / -Actualize)

После обновления конфигурации контролируемые методы (&ИзменениеИКонтроль) могут разойтись с исходником — платформа при загрузке об этом молчит, ошибка всплывает лишь в рантайме. Эти режимы проходят по всем &ИзменениеИКонтроль расширения (или сузить: -ModulePath — модуль, + -MethodName — один):

  • -Check — только отчёт: какие методы дрейфнули (ДРЕЙФ / КОНФЛИКТ / МЕТОД-ИСЧЕЗ); актуальные считаются числом (100/103 актуальны). Ничего не пишет. Код возврата 1, если есть что чинить.
  • -Actualize — чинит: авто-переносит правки, для неоднозначных — merge-воркспейс.

Зона ответственности — только тело &ИзменениеИКонтроль (не свойства/формы/сигнатуры).

Merge-воркспейс конфликтов (-Actualize) в системном temp: index.md (тонкий список конфликтов с путями к .bsl расширения для правки) + подпапка на каждый конфликтный метод с conflict.md (что перенести + дифф) и base/local/remote. Путь печатается в выводе.

Команда

powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/cfe-patch-method.ps1" -ExtensionPath src\cfe\ИмяРасширения -ConfigPath src\cf -ModulePath "Catalog.Контрагенты.ObjectModule" -MethodName "ПриЗаписи" -InterceptorType Before

Примеры

# Код перед записью
... -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>