---
name: epf-bsp-add-command
description: Определить команду в БСП‑описании обработки (`СведенияОВнешнейОбработке`) — открытие формы, вызов клиентского/серверного метода, заполнение объекта и т.п. Используй когда нужно зарегистрировать команду в дополнительной обработке БСП
argument-hint: <ProcessorName> <Идентификатор> [ТипКоманды] [Представление]
allowed-tools:
  - Read
  - Edit
  - Glob
  - Grep
---

# /epf-bsp-add-command — Добавление команды БСП

Добавляет команду в существующую функцию `СведенияОВнешнейОбработке()` и генерирует соответствующий обработчик.

Предварительно обработка должна быть инициализирована через `/epf-bsp-init`.

## Usage

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

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

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

Пользователь может указать тип в свободной форме:

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

Если пользователь не указал тип — определи по виду обработки из существующего кода `СведенияОВнешнейОбработке()`:

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

## Шаблон добавления команды

Вставляется в `СведенияОВнешнейОбработке()` **перед** строкой `Возврат ПараметрыРегистрации`:

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

Для печатных форм (ВидОбработкиПечатнаяФорма) добавь также:

```bsl
	НоваяКоманда.Модификатор = "ПечатьMXL";
```

Примечание: в отличие от первой команды (из `/epf-bsp-init`), дополнительные команды используют строковые литералы `НСтр("ru = '...'")` для представления и строку для идентификатора, а не `Метаданные()`.

## Шаблоны обработчиков

### ВызовСерверногоМетода — если обработчик уже есть

Если процедура `ВыполнитьКоманду` уже существует в модуле объекта, добавь ветку перед `КонецЕсли`:

```bsl
	ИначеЕсли ИдентификаторКоманды = "{{Идентификатор}}" Тогда
		// TODO: Реализация {{Идентификатор}}
```

### ВызовСерверногоМетода — если обработчика нет

Для глобальных обработок (без `ОбъектыНазначения`):

```bsl
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт

	Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
		// TODO: Реализация {{Идентификатор}}
	КонецЕсли;

КонецПроцедуры
```

Для назначаемых обработок (с `ОбъектыНазначения`):

```bsl
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполненияКоманды) Экспорт

	Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
		// TODO: Реализация {{Идентификатор}}
	КонецЕсли;

КонецПроцедуры
```

### ПечатнаяФорма — если процедура Печать уже есть

Добавь блок перед `КонецПроцедуры`:

```bsl
	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "{{Идентификатор}}");
	Если ПечатнаяФорма <> Неопределено Тогда
		ПечатнаяФорма.ТабличныйДокумент = Сформировать{{Идентификатор}}(МассивОбъектов, ОбъектыПечати);
		ПечатнаяФорма.СинонимМакета = НСтр("ru = '{{Представление}}'");
	КонецЕсли;
```

### ПечатнаяФорма — если процедуры Печать нет

```bsl
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

	ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "{{Идентификатор}}");
	Если ПечатнаяФорма <> Неопределено Тогда
		ПечатнаяФорма.ТабличныйДокумент = Сформировать{{Идентификатор}}(МассивОбъектов, ОбъектыПечати);
		ПечатнаяФорма.СинонимМакета = НСтр("ru = '{{Представление}}'");
	КонецЕсли;

КонецПроцедуры
```

### ВызовКлиентскогоМетода

Добавляется в **модуль формы** (`Forms/<FormName>/Ext/Form/Module.bsl`):

Для глобальных обработок:

```bsl
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт

	Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
		// TODO: Реализация {{Идентификатор}}
	КонецЕсли;

КонецПроцедуры
```

Для назначаемых обработок:

```bsl
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт

	Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
		// TODO: Реализация {{Идентификатор}}
	КонецЕсли;

КонецПроцедуры
```

Если процедура уже есть — добавь ветку `ИначеЕсли`.

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

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

## Пример

Пользователь: `/epf-bsp-add-command МояОбработка ЗаказПокупателя серверный "Заказ покупателя"`

В `СведенияОВнешнейОбработке()` перед `Возврат` добавится:

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

И в существующую процедуру `ВыполнитьКоманду` добавится блок обработки.
