--- name: epf-bsp-add-command description: Определить команду в БСП‑описании обработки (`СведенияОВнешнейОбработке`) — открытие формы, вызов клиентского/серверного метода, заполнение объекта и т.п. Используй когда нужно зарегистрировать команду в дополнительной обработке БСП argument-hint: <Идентификатор> [ТипКоманды] [Представление] allowed-tools: - Read - Edit - Glob - Grep --- # /epf-bsp-add-command — Добавление команды БСП Добавляет команду в существующую функцию `СведенияОВнешнейОбработке()` и генерирует соответствующий обработчик. Предварительно обработка должна быть инициализирована через `/epf-bsp-init`. ## Usage ``` /epf-bsp-add-command <Идентификатор> [ТипКоманды] [Представление] ``` | Параметр | Обязательный | По умолчанию | Описание | |---------------|:------------:|-----------------------|--------------------------------------------| | 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//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 = 'Заказ покупателя'"); НоваяКоманда.Идентификатор = "ЗаказПокупателя"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); НоваяКоманда.ПоказыватьОповещение = Ложь; ``` И в существующую процедуру `ВыполнитьКоманду` добавится блок обработки.