---
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";
```

Для команды ЗагрузкаДанныхИзФайла `Модификатор` обязателен: полное имя справочника, в который загружаются данные. Если пользователь его не назвал — спроси.

```bsl
	НоваяКоманда.Модификатор = "Справочник.Номенклатура";
```

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

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

Шаблон выбирается по паре «тип команды × вид обработки».

### ОткрытиеФормы

Обработчик не нужен: открывается основная форма обработки, идентификатор команды приходит в `Параметры.ИдентификаторКоманды`.

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

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

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

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

Процедура добавляется в модуль объекта. Сигнатура зависит от вида обработки.

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

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

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

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

ЗаполнениеОбъекта, Отчет:

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

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

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

Для команды типа ЗаполнениеФормы обработчик тот же: `ОбъектыНазначения` = `Неопределено`, заполняемая форма передаётся в `ПараметрыВыполненияКоманды.ЭтаФорма`.

СозданиеСвязанныхОбъектов (ссылки созданных объектов добавляются в массив `СозданныеОбъекты`):

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

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

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

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

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

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

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

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

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

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

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

Добавляется в **модуль основной формы** (`Forms/<FormName>/Ext/Form/Module.bsl`). Имя и сигнатура зависят от вида обработки.

ДополнительнаяОбработка, ДополнительныйОтчет:

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

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

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

ЗаполнениеОбъекта, Отчет:

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

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

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

СозданиеСвязанныхОбъектов:

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

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

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

ПечатнаяФорма (процедура называется `Печать`, не `ВыполнитьКоманду`):

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

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

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

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

### ЗагрузкаДанныхИзФайла

В модуль объекта добавляются три экспортные процедуры. Если какая-то из них уже есть — добавь в неё ветку `ИначеЕсли`.

```bsl
Процедура ОпределитьПараметрыЗагрузкиДанныхИзФайла(ИдентификаторКоманды, ПараметрыЗагрузки) Экспорт

	Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
		// ПараметрыЗагрузки.ИмяМакетаСШаблоном = "ЗагрузкаДанныхИзФайла";
		// ПараметрыЗагрузки.ОбязательныеКолонки.Добавить("<ИмяКолонки>");
	КонецЕсли;

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

Процедура СопоставитьЗагружаемыеДанныеИзФайла(ИдентификаторКоманды, ЗагружаемыеДанные) Экспорт

	Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
		// TODO: Заполнить колонку СопоставленныйОбъект по данным из файла
	КонецЕсли;

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

Процедура ЗагрузитьИзФайла(ИдентификаторКоманды, ЗагружаемыеДанные, ПараметрыЗагрузки, Отказ) Экспорт

	Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
		// TODO: Загрузка; для каждой строки заполнить РезультатСопоставленияСтроки
		// ("Создан", "Обновлен", "Пропущен") и при ошибке ОписаниеОшибки
	КонецЕсли;

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

Колонки загружаемых данных берутся из макета обработки `ЗагрузкаДанныхИзФайла` (имя макета можно переопределить через `ПараметрыЗагрузки.ИмяМакетаСШаблоном`). Если макета нет — предложи создать его через `/template-add`.

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

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

## Пример

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

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

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

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