---
name: epf-expert
description: >
  Этот скилл MUST быть вызван для всех операций с внешними обработками 1С (EPF):
  создание (init), сборка (build), разборка (dump), добавление формы (add-form),
  регистрация в БСП (bsp-init), добавление команды БСП (bsp-add-command).
  SHOULD также вызывать при любой работе с EPF-файлами и их исходниками.
  Do NOT использовать для внешних отчётов (ERF) — используй erf-expert;
  для добавления формы к объекту конфигурации — form-add.
argument-hint: "<mode> [args...]  # modes: init|build|dump|add-form|bsp-init|bsp-add-command"
allowed-tools:
  - Bash
  - Read
  - Write
  - Edit
  - Glob
  - Grep
---

# /epf-expert — Внешние обработки 1С (EPF)

Единый скилл для всех операций с внешними обработками EPF. Выбери нужный режим:

| Режим | Что делает |
|-------|-----------|
| `init` | Создать новую пустую обработку (scaffold XML) |
| `build` | Собрать EPF из XML-исходников |
| `dump` | Разобрать EPF в XML-исходники |
| `add-form` | Добавить управляемую форму к обработке |
| `bsp-init` | Зарегистрировать обработку в подсистеме БСП |
| `bsp-add-command` | Добавить команду в регистрацию БСП |

---

## Режим: init — создание обработки

Генерирует минимальный набор XML-исходников для внешней обработки (EPF) 1С.

### Usage

```
/epf-expert init <Name> [Synonym] [SrcDir]
```

| Параметр | Обязательный | По умолчанию | Описание |
|----------|:------------:|--------------|----------|
| Name     | да           | —            | Имя обработки (латиница/кириллица) |
| Synonym  | нет          | = Name       | Синоним (отображаемое имя) |
| SrcDir   | нет          | `src`        | Каталог исходников относительно CWD |

### Команда

```powershell
powershell.exe -NoProfile -File .claude/skills/epf-expert/scripts/epf-init.ps1 -Name "<Name>" [-Synonym "<Synonym>"] [-SrcDir "<SrcDir>"]
```

### Что создаётся

```
<SrcDir>/
├── <Name>.xml          # Корневой файл метаданных (4 UUID)
└── <Name>/
    └── Ext/
        └── ObjectModule.bsl  # Модуль объекта с 3 регионами
```

- Корневой XML содержит `MetaDataObject/ExternalDataProcessor` с пустыми `DefaultForm` и `ChildObjects`
- ClassId фиксирован: `c3831ec8-d8d5-4f93-8a22-f9bfae07327f`
- Файл создаётся в UTF-8 с BOM

### Дальнейшие шаги

- Добавить форму: `/epf-expert add-form`
- Добавить макет: `/mxl-expert template-add`
- Добавить справку: `/help-add`
- Собрать EPF: `/epf-expert build`

---

## Режим: build — сборка EPF

Собирает EPF файл из XML-исходников с помощью платформы 1С.

### Usage

```
/epf-expert build <Name> [SrcDir] [OutDir]
```

| Параметр | Обязательный | По умолчанию | Описание |
|----------|:------------:|--------------|----------|
| Name     | да           | —            | Имя объекта (имя корневого XML) |
| SrcDir   | нет          | `src`        | Каталог исходников |
| OutDir   | нет          | `build`      | Каталог для результата |

### Параметры подключения

Прочитай `.v8-project.json` из корня проекта. Возьми `v8path` и разреши базу:
1. Если пользователь указал параметры (путь, сервер) — используй напрямую
2. Если указал базу по имени — ищи в `.v8-project.json`
3. Если не указал — сопоставь ветку Git с `databases[].branches`
4. Если ветка не совпала — используй `default`
5. Если `.v8-project.json` нет — создай пустую ИБ в `./base`

Если `v8path` не задан: `Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort -Desc | Select -First 1`

### Команда

```powershell
powershell.exe -NoProfile -File .claude/skills/epf-expert/scripts/epf-build.ps1 -InfoBasePath "<путь>" -SourceFile "src\<Name>.xml" -OutputFile "build\<Name>.epf"
```

| Параметр | Обязательный | Описание |
|----------|:------------:|----------|
| `-V8Path <путь>` | нет | Каталог bin платформы |
| `-InfoBasePath <путь>` | * | Файловая база |
| `-InfoBaseServer <сервер>` | * | Сервер 1С |
| `-InfoBaseRef <имя>` | * | Имя базы на сервере |
| `-UserName <имя>` | нет | Пользователь |
| `-Password <пароль>` | нет | Пароль |
| `-SourceFile <путь>` | да | Корневой XML исходников |
| `-OutputFile <путь>` | да | Выходной EPF файл |

> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef`

**Примечание:** Если объект использует ссылочные типы конфигурации — сборка в пустой базе упадёт с ошибкой XDTO. Зарегистрируй базу с целевой конфигурацией через `/db-list add`.

---

## Режим: dump — разборка EPF

Разбирает EPF файл в XML-исходники с помощью платформы 1С (иерархический формат).

### Usage

```
/epf-expert dump <File> [OutDir]
```

| Параметр | Обязательный | По умолчанию | Описание |
|----------|:------------:|--------------|----------|
| File     | да           | —            | Путь к EPF файлу |
| OutDir   | нет          | `src`        | Каталог для выгрузки исходников |

### Параметры подключения

Аналогично режиму `build` — разрешение базы через `.v8-project.json`.

### Команда

```powershell
powershell.exe -NoProfile -File .claude/skills/epf-expert/scripts/epf-dump.ps1 -InfoBasePath "<путь>" -InputFile "<файл>.epf" -OutputDir "src"
```

| Параметр | Обязательный | Описание |
|----------|:------------:|----------|
| `-V8Path <путь>` | нет | Каталог bin платформы |
| `-InfoBasePath <путь>` | * | Файловая база |
| `-InfoBaseServer <сервер>` | * | Сервер 1С |
| `-InfoBaseRef <имя>` | * | Имя базы на сервере |
| `-UserName <имя>` | нет | Пользователь |
| `-Password <пароль>` | нет | Пароль |
| `-InputFile <путь>` | да | Путь к EPF файлу |
| `-OutputDir <путь>` | да | Каталог для выгрузки |
| `-Format <формат>` | нет | `Hierarchical` (по умолч.) / `Plain` |

### Структура результата (Hierarchical)

```
<OutDir>/
├── <Name>.xml
└── <Name>/
    ├── Ext/
    │   └── ObjectModule.bsl
    ├── Forms/
    │   ├── <FormName>.xml
    │   └── <FormName>/Ext/Form.xml
    └── Templates/
        ├── <TemplateName>.xml
        └── <TemplateName>/Ext/Template.<ext>
```

---

## Режим: add-form — добавление формы

Создаёт управляемую форму и регистрирует её в корневом XML обработки.

### Usage

```
/epf-expert add-form <ProcessorName> <FormName> [Synonym] [--main]
```

| Параметр      | Обязательный | По умолчанию | Описание |
|---------------|:------------:|--------------|----------|
| ProcessorName | да           | —            | Имя обработки (должна существовать) |
| FormName      | да           | —            | Имя формы |
| Synonym       | нет          | = FormName   | Синоним формы |
| --main        | нет          | авто         | Установить как форму по умолчанию |
| SrcDir        | нет          | `src`        | Каталог исходников |

### Команда

```powershell
powershell.exe -NoProfile -File .claude/skills/epf-expert/scripts/add-form.ps1 -ProcessorName "<ProcessorName>" -FormName "<FormName>" [-Synonym "<Synonym>"] [-Main] [-SrcDir "<SrcDir>"]
```

### Что создаётся

```
<SrcDir>/<ProcessorName>/Forms/
├── <FormName>.xml                    # Метаданные формы (1 UUID)
└── <FormName>/
    └── Ext/
        ├── Form.xml                  # Описание формы (logform namespace)
        └── Form/
            └── Module.bsl           # BSL-модуль с 5 регионами
```

- `<SrcDir>/<ProcessorName>.xml` — добавляется `<Form>` в `ChildObjects`, обновляется `DefaultForm`
- FormType: Managed; UsePurposes: PlatformApplication, MobilePlatformApplication
- AutoCommandBar с id=-1; Реквизит "Объект" с MainAttribute=true

---

## Режим: bsp-init — регистрация в БСП

Добавляет в модуль объекта обработки функцию `СведенияОВнешнейОбработке()` для подсистемы БСП.

### Usage

```
/epf-expert bsp-init <ProcessorName> <Вид> [Назначение...]
```

| Параметр      | Обязательный | По умолчанию | Описание |
|---------------|:------------:|--------------|----------|
| ProcessorName | да           | —            | Имя обработки |
| Вид           | да           | —            | Вид обработки (см. маппинг) |
| Назначение    | *            | —            | Объекты для назначаемых видов |
| SrcDir        | нет          | `src`        | Каталог исходников |

\* Обязательно для: ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов.

### Маппинг вида обработки

| Пользователь пишет | Вид | API-метод |
|---------------------|-----|-----------|
| доп обработка, глобальная | ДополнительнаяОбработка | `ВидОбработкиДополнительнаяОбработка()` |
| доп отчёт, глобальный отчёт | ДополнительныйОтчет | `ВидОбработкиДополнительныйОтчет()` |
| заполнение | ЗаполнениеОбъекта | `ВидОбработкиЗаполнениеОбъекта()` |
| отчёт (назначаемый) | Отчет | `ВидОбработкиОтчет()` |
| печатная форма, печать | ПечатнаяФорма | `ВидОбработкиПечатнаяФорма()` |
| создание связанных объектов | СозданиеСвязанныхОбъектов | `ВидОбработкиСозданиеСвязанныхОбъектов()` |

### Тип команды по умолчанию

| Вид | ТипКоманды |
|-----|-----------|
| ДополнительнаяОбработка | `ТипКомандыОткрытиеФормы()` |
| ДополнительныйОтчет | `ТипКомандыОткрытиеФормы()` |
| ЗаполнениеОбъекта | `ТипКомандыВызовСерверногоМетода()` |
| Отчет | `ТипКомандыОткрытиеФормы()` |
| ПечатнаяФорма | `ТипКомандыВызовСерверногоМетода()` |
| СозданиеСвязанныхОбъектов | `ТипКомандыВызовСерверногоМетода()` |

### Шаблон функции

```bsl
Функция СведенияОВнешнейОбработке() Экспорт

	МетаданныеОбработки = Метаданные();

	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
	ПараметрыРегистрации.Вид    = ДополнительныеОтчетыИОбработкиКлиентСервер.{{ВидОбработки}};
	ПараметрыРегистрации.Версия = "1.0";

	{{СЕКЦИЯ_НАЗНАЧЕНИЕ}}  // только для назначаемых видов

	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление        = МетаданныеОбработки.Представление();
	НоваяКоманда.Идентификатор        = МетаданныеОбработки.Имя;
	НоваяКоманда.Использование        = ДополнительныеОтчетыИОбработкиКлиентСервер.{{ТипКоманды}};
	НоваяКоманда.ПоказыватьОповещение = Ложь;
	{{СЕКЦИЯ_МОДИФИКАТОР}}  // только для ПечатнаяФорма: НоваяКоманда.Модификатор = "ПечатьMXL"

	Возврат ПараметрыРегистрации;

КонецФункции
```

### Инструкции

1. Найди `ObjectModule.bsl`: `src/{{ProcessorName}}/Ext/ObjectModule.bsl`
2. Если `СведенияОВнешнейОбработке` уже есть — сообщи, не дублируй
3. Найди область `#Область ПрограммныйИнтерфейс` и вставь функцию внутрь
4. Для видов с серверным обработчиком — добавь соответствующую процедуру после функции
5. Используй табы для отступов

---

## Режим: bsp-add-command — добавление команды БСП

Добавляет команду в существующую функцию `СведенияОВнешнейОбработке()`. Предварительно должен быть вызван `bsp-init`.

### Usage

```
/epf-expert bsp-add-command <ProcessorName> <Идентификатор> [ТипКоманды] [Представление]
```

| Параметр      | Обязательный | По умолчанию | Описание |
|---------------|:------------:|--------------|----------|
| ProcessorName | да           | —            | Имя обработки |
| Идентификатор | да           | —            | Внутреннее имя команды (латиница) |
| ТипКоманды    | нет          | из вида      | Тип запуска |
| Представление | нет          | = Идентификатор | Отображаемое имя |
| SrcDir        | нет          | `src`        | Каталог исходников |

### Маппинг типов команд

| Пользователь пишет | ТипКоманды |
|--------------------|-----------|
| открыть форму | `ТипКомандыОткрытиеФормы()` |
| клиентский метод | `ТипКомандыВызовКлиентскогоМетода()` |
| серверный метод | `ТипКомандыВызовСерверногоМетода()` |
| заполнение формы | `ТипКомандыЗаполнениеФормы()` |
| сценарий | `ТипКомандыСценарийВБезопасномРежиме()` |

### Шаблон вставляется перед `Возврат ПараметрыРегистрации`

```bsl
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
	НоваяКоманда.Представление        = НСтр("ru = '{{Представление}}'");
	НоваяКоманда.Идентификатор        = "{{Идентификатор}}";
	НоваяКоманда.Использование        = ДополнительныеОтчетыИОбработкиКлиентСервер.{{ТипКоманды}};
	НоваяКоманда.ПоказыватьОповещение = Ложь;
```

### Инструкции

1. Найди и прочитай `ObjectModule.bsl`
2. Убедись что `СведенияОВнешнейОбработке()` существует — если нет, предложи `bsp-init`
3. Определи вид обработки из существующего кода
4. Вставь блок команды перед `Возврат ПараметрыРегистрации`
5. Добавь обработчик: для серверных — в `ObjectModule.bsl`, для клиентских — в модуль формы
6. Если обработчик уже есть — добавь ветку `ИначеЕсли`, не дублируй процедуру
