# Внешние обработки и отчёты (EPF / ERF)

Навыки для создания, модификации и сборки внешних обработок (`.epf`) и внешних отчётов (`.erf`) 1С:Предприятия 8.3 из XML-исходников.

## Навыки обработок (EPF)

| Навык | Параметры | Описание |
|-------|-----------|----------|
| `/epf-init` | `<Name> [Synonym]` | Создать новую обработку (корневой XML + модуль объекта) |
| `/epf-add-form` | `<ProcessorName> <FormName> [Synonym]` | Добавить управляемую форму к обработке |
| `/epf-build` | `<ProcessorName>` | Собрать EPF из XML (через 1cv8.exe) |
| `/epf-dump` | `<EpfFile>` | Разобрать EPF в XML (через 1cv8.exe) |
| `/epf-bsp-init` | `<ProcessorName> <Вид>` | Добавить регистрацию БСП (СведенияОВнешнейОбработке) |
| `/epf-bsp-add-command` | `<ProcessorName> <Идентификатор>` | Добавить команду в дополнительную обработку БСП |
| `/epf-validate` | `<ObjectPath> [-MaxErrors 30]` | Валидация структурной корректности обработки (10 проверок) |

## Внешние отчёты (ERF)

| Навык | Параметры | Описание |
|-------|-----------|----------|
| `/erf-init` | `<ReportName> [Synonym] [--WithSKD]` | Создать новый отчёт (корневой XML + модуль объекта + опционально СКД) |
| `/erf-build` | `<ReportName>` | Собрать ERF из XML (через 1cv8.exe) |
| `/erf-dump` | `<ErfFile>` | Разобрать ERF в XML (через 1cv8.exe) |
| `/erf-validate` | `<ObjectPath> [-MaxErrors 30]` | Валидация структурной корректности отчёта (10 проверок) |

Флаг `--WithSKD` создаёт макет `ОсновнаяСхемаКомпоновкиДанных` и привязывает его к `MainDataCompositionSchema`.

## Универсальные навыки

Работают с любыми объектами — обработками, отчётами, справочниками, документами и др.

| Навык | Параметры | Описание |
|-------|-----------|----------|
| `/template-add` | `<ObjectName> <TemplateName> <TemplateType>` | Добавить макет (HTML, Text, SpreadsheetDocument, BinaryData, DataCompositionSchema) |
| `/template-remove` | `<ObjectName> <TemplateName>` | Удалить макет |
| `/help-add` | `<ObjectName>` | Добавить встроенную справку (Help.xml + HTML) |
| `/form-remove` | `<ObjectName> <FormName>` | Удалить форму |

Для отчётов: при добавлении макета типа DataCompositionSchema автоматически заполняется `MainDataCompositionSchema` (если пуст).

Навыки удаления (`template-remove`, `form-remove`) не вызываются Claude автоматически — только по явной команде пользователя.

## Сценарии использования

Не обязательно запоминать команды и параметры. Просто опишите задачу своими словами — Claude сам подберёт нужные навыки.

### Обработка с формой

Типичная обработка для манипуляций с данными — форма для пользователя, модуль объекта для логики.

```
> Создай обработку ЗагрузкаПрайса с формой
```

Claude выполнит `/epf-init` и `/epf-add-form` с правильными параметрами.

### Внешняя печатная форма

Обработка с макетом табличного документа, подключаемая через механизм дополнительных обработок БСП к конкретному документу.

```
> Создай внешнюю печатную форму для документа Реализация. Макет — табличный документ.
```

Claude создаст обработку, добавит макет SpreadsheetDocument, вызовет `/epf-bsp-init` с видом ПечатнаяФорма и назначением, сгенерирует `СведенияОВнешнейОбработке()` и процедуру `Печать()`.

### Внешний отчёт с СКД

```
> Создай внешний отчёт ОстаткиНаСкладе с СКД
```

Claude выполнит `/erf-init ОстаткиНаСкладе --WithSKD`, затем предложит заполнить схему компоновки через `/skd-compile`.

### Доработка существующей обработки

```
> Добавь справку с описанием как пользоваться обработкой
```

Claude вызовет `/help-add` и предложит отредактировать HTML.

```
> Добавь ещё одну команду печати — накладная
```

Claude вызовет `/epf-bsp-add-command`, добавит команду в `СведенияОВнешнейОбработке()` и блок обработки в процедуру `Печать()`.

```
> Собери
```

Claude вызовет `/epf-build` или `/erf-build` в зависимости от типа объекта.

### Примеры слеш-команд

Слеш-команды работают для случаев, когда хочется точного контроля:

```
> /epf-init МояОбработка "Моя обработка"
> /epf-add-form МояОбработка Форма
> /template-add МояОбработка Макет HTML
> /help-add МояОбработка
> /epf-build МояОбработка

> /erf-init МойОтчёт --WithSKD
> /template-add МойОтчёт ДопМакет SpreadsheetDocument
> /erf-build МойОтчёт
```

## Структура каталогов

После `/epf-init` создаётся структура:

```
src/
├── МояОбработка.xml                          # Корневой файл метаданных
└── МояОбработка/
    └── Ext/
        └── ObjectModule.bsl                  # Модуль объекта
```

После `/epf-add-form` и `/template-add`:

```
src/
├── МояОбработка.xml
└── МояОбработка/
    ├── Ext/
    │   └── ObjectModule.bsl
    ├── Forms/
    │   ├── Форма.xml                         # Метаданные формы
    │   └── Форма/
    │       └── Ext/
    │           ├── Form.xml                  # Описание формы
    │           └── Form/
    │               └── Module.bsl            # Модуль формы
    └── Templates/
        ├── Макет.xml                         # Метаданные макета
        └── Макет/
            └── Ext/
                └── Template.html             # Содержимое макета
```

После `/erf-init МойОтчёт --WithSKD`:

```
src/
├── МойОтчёт.xml                              # Корневой файл (ExternalReport)
└── МойОтчёт/
    ├── Ext/
    │   └── ObjectModule.bsl                  # Модуль объекта
    └── Templates/
        ├── ОсновнаяСхемаКомпоновкиДанных.xml
        └── ОсновнаяСхемаКомпоновкиДанных/
            └── Ext/
                └── Template.xml              # Пустая СКД
```

Первая добавленная форма автоматически становится основной (DefaultForm). Флаг `--main` нужен только для переназначения основной формы на другую.

## Сборка и разборка

### Сборка (`/epf-build`, `/erf-build`)

Если база не указана — автоматически создаётся временная база с заглушками метаданных для ссылочных типов. Явная база не обязательна, но предпочтительна — обеспечивает точное соответствие типов.

**Ограничение**: если на форме обработки выведены наборы записей регистров, в XML-исходниках нет информации о том, чем является поле регистра — измерением, ресурсом или реквизитом. Скрипт пытается угадать категорию по имени, но при ошибке 1С молча сбрасывает привязки колонок (DataPath). В таких случаях лучше использовать реальную базу с нужной конфигурацией.

### Разборка (`/epf-dump`, `/erf-dump`)

База с конфигурацией **обязательна**. Dump в пустой базе безвозвратно теряет ссылочные типы (`CatalogRef.XXX` → `xs:string`).

## Технические детали

- Все XML-файлы создаются в **UTF-8 с BOM** (как в реальных выгрузках 1С)
- PowerShell-скрипты используют `System.Xml.XmlDocument` для модификации корневого XML
- UUID генерируются через `[guid]::NewGuid()`
- ClassId обработки: `c3831ec8-d8d5-4f93-8a22-f9bfae07327f`
- ClassId отчёта: `e41aff26-25cf-4bb6-b6c1-3f478a75f374`
- Порядок элементов в `ChildObjects`: TabularSections → Forms → Templates
- Первая форма автоматически назначается основной (DefaultForm)
- Навыки БСП (`epf-bsp-*`) не используют скрипты — Claude модифицирует код напрямую через Read/Edit
- Для отчётов: `/template-add` с типом DataCompositionSchema автоматически заполняет `MainDataCompositionSchema`

## Спецификации

- [XML-формат выгрузки обработок](1c-epf-spec.md) — структура XML-файлов, namespace, элементы форм
- [XML-формат внешних отчётов](1c-erf-spec.md) — отличия ERF от EPF, Properties, MainDataCompositionSchema
- [Встроенная справка](1c-help-spec.md) — Help.xml, HTML-страницы, кнопка справки на форме
- [Сборка и разборка EPF/ERF](build-spec.md) — команды `1cv8.exe`, параметры, коды возврата
