关于 epf-bsp-add-command
用于 1C:Enterprise 开发的技能,可在已初始化的外部处理模块中注册命令并生成相应处理程序。它根据命令类型和处理类型选择代码模板,并避免重复创建处理程序。
主要功能
- 01添加 БСП 命令注册代码
- 02按类型生成处理程序
- 03支持服务器和客户端方法
- 04扩展已有处理程序而非重复创建
适用场景
- 01为已有外部处理添加命令
- 02为命令生成服务器或客户端处理程序
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nikolay-shirokov/ cc-1c-skills --skill epf-bsp-add-command安装后在 Claude Code 中输入/epf-bsp-add-command确认已加载。
README 原文English
来自项目 READMEREADME 暂无中文译文,以下为英文原文;中文介绍见上方。
/epf-bsp-add-command — Добавление команды БСП
Добавляет команду в существующую функцию СведенияОВнешнейОбработке() и генерирует соответствующий обработчик.
Предварительно обработка должна быть инициализирована через /epf-bsp-init.
Usage
/epf-bsp-add-command <ProcessorName> <Идентификатор> [ТипКоманды] [Представление]
| Параметр | Обязательный | По умолчанию | Описание |
|---|---|---|---|
| ProcessorName | да | — | Имя обработки |
| Идентификатор | да | — | Внутреннее имя команды (латиница) |
| ТипКоманды | нет | из вида обработки | Тип запуска команды (см. маппинг ниже) |
| Представление | нет | = Идентификатор | Отображаемое имя команды для пользователя |
| SrcDir | нет | src | Каталог исходников |
Маппинг типов команд
Пользователь может указать тип в свободной форме:
| Пользователь пишет | ТипКоманды | Доступен для вида обработки |
|---|---|---|
| открыть форму, форма | ТипКомандыОткрытиеФормы() | любого |
| клиентский метод, на клиенте | ТипКомандыВызовКлиентскогоМетода() | любого |
| серверный метод, на сервере | ТипКомандыВызовСерверногоМетода() | любого |
| заполнение формы, заполнить форму | ТипКомандыЗаполнениеФормы() | ЗаполнениеОбъекта |
| загрузка из файла, импорт из файла | ТипКомандыЗагрузкаДанныхИзФайла() | ДополнительнаяОбработка; в конфигурации должна быть подсистема «Загрузка данных из файла» |
Других типов команд в БСП нет. Если запрошенный тип не подходит ни под одну строку — спроси пользователя, не придумывай метод. Если тип недоступен для вида обработки — сообщи об этом и не добавляй команду.
Если пользователь не указал тип — определи по виду обработки из существующего кода СведенияОВнешнейОбработке():
| Вид обработки (из кода) | ТипКоманды по умолчанию |
|---|---|
| ДополнительнаяОбработка | ТипКомандыОткрытиеФормы() |
| ДополнительныйОтчет | ТипКомандыОткрытиеФормы() |
| ЗаполнениеОбъекта | ТипКомандыВызовСерверногоМетода() |
| Отчет | ТипКомандыОткрытиеФормы() |
| ПечатнаяФорма | ТипКомандыВызовСерверногоМетода() |
| СозданиеСвязанныхОбъектов | ТипКомандыВызовСерверногоМетода() |
Шаблон добавления команды
Вставляется в СведенияОВнешнейОбработке() перед строкой Возврат ПараметрыРегистрации:
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = '{{Представление}}'");
НоваяКоманда.Идентификатор = "{{Идентификатор}}";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.{{ТипКоманды}};
НоваяКоманда.ПоказыватьОповещение = Ложь;
Для печатных форм (ВидОбработкиПечатнаяФорма) добавь также:
НоваяКоманда.Модификатор = "ПечатьMXL";
Для команды ЗагрузкаДанныхИзФайла Модификатор обязателен: полное имя справочника, в который загружаются данные. Если пользователь его не назвал — спроси.
НоваяКоманда.Модификатор = "Справочник.Номенклатура";
Примечание: в отличие от первой команды (из /epf-bsp-init), дополнительные команды используют строковые литералы НСтр("ru = '...'") для представления и строку для идентификатора, а не Метаданные().
Шаблоны обработчиков
Шаблон выбирается по паре «тип команды × вид обработки».
ОткрытиеФормы
Обработчик не нужен: открывается основная форма обработки, идентификатор команды приходит в Параметры.ИдентификаторКоманды.
ВызовСерверногоМетода, ЗаполнениеФормы — если обработчик уже есть
Если процедура ВыполнитьКоманду уже существует в модуле объекта, добавь ветку перед КонецЕсли:
ИначеЕсли ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Реализация {{Идентификатор}}
ВызовСерверногоМетода, ЗаполнениеФормы — если обработчика нет
Процедура добавляется в модуль объекта. Сигнатура зависит от вида обработки.
ДополнительнаяОбработка, ДополнительныйОтчет (без ОбъектыНазначения):
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Реализация {{Идентификатор}}
КонецЕсли;
КонецПроцедуры
ЗаполнениеОбъекта, Отчет:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Реализация {{Идентификатор}}
КонецЕсли;
КонецПроцедуры
Для команды типа ЗаполнениеФормы обработчик тот же: ОбъектыНазначения = Неопределено, заполняемая форма передаётся в ПараметрыВыполненияКоманды.ЭтаФорма.
СозданиеСвязанныхОбъектов (ссылки созданных объектов добавляются в массив СозданныеОбъекты):
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Реализация {{Идентификатор}}
КонецЕсли;
КонецПроцедуры
ПечатнаяФорма — если процедура Печать уже есть
Добавь блок перед КонецПроцедуры:
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "{{Идентификатор}}");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = Сформировать{{Идентификатор}}(МассивОбъектов, ОбъектыПечати);
ПечатнаяФорма.СинонимМакета = НСтр("ru = '{{Представление}}'");
КонецЕсли;
ПечатнаяФорма — если процедуры Печать нет
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "{{Идентификатор}}");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = Сформировать{{Идентификатор}}(МассивОбъектов, ОбъектыПечати);
ПечатнаяФорма.СинонимМакета = НСтр("ru = '{{Представление}}'");
КонецЕсли;
КонецПроцедуры
ВызовКлиентскогоМетода
Добавляется в модуль основной формы (Forms/<FormName>/Ext/Form/Module.bsl). Имя и сигнатура зависят от вида обработки.
ДополнительнаяОбработка, ДополнительныйОтчет:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Реализация {{Идентификатор}}
КонецЕсли;
КонецПроцедуры
ЗаполнениеОбъекта, Отчет:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Реализация {{Идентификатор}}
КонецЕсли;
КонецПроцедуры
СозданиеСвязанныхОбъектов:
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив, СозданныеОбъекты) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Реализация {{Идентификатор}}
КонецЕсли;
КонецПроцедуры
ПечатнаяФорма (процедура называется Печать, не ВыполнитьКоманду):
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Реализация {{Идентификатор}}
КонецЕсли;
КонецПроцедуры
Если процедура уже есть — добавь ветку ИначеЕсли.
ЗагрузкаДанныхИзФайла
В модуль объекта добавляются три экспортные процедуры. Если какая-то из них уже есть — добавь в неё ветку ИначеЕсли.
Процедура ОпределитьПараметрыЗагрузкиДанныхИзФайла(ИдентификаторКоманды, ПараметрыЗагрузки) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// ПараметрыЗагрузки.ИмяМакетаСШаблоном = "ЗагрузкаДанныхИзФайла";
// ПараметрыЗагрузки.ОбязательныеКолонки.Добавить("<ИмяКолонки>");
КонецЕсли;
КонецПроцедуры
Процедура СопоставитьЗагружаемыеДанныеИзФайла(ИдентификаторКоманды, ЗагружаемыеДанные) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Заполнить колонку СопоставленныйОбъект по данным из файла
КонецЕсли;
КонецПроцедуры
Процедура ЗагрузитьИзФайла(ИдентификаторКоманды, ЗагружаемыеДанные, ПараметрыЗагрузки, Отказ) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Загрузка; для каждой строки заполнить РезультатСопоставленияСтроки
// ("Создан", "Обновлен", "Пропущен") и при ошибке ОписаниеОшибки
КонецЕсли;
КонецПроцедуры
Колонки загружаемых данных берутся из макета обработки ЗагрузкаДанныхИзФайла (имя макета можно переопределить через ПараметрыЗагрузки.ИмяМакетаСШаблоном). Если макета нет — предложи создать его через /template-add.
Инструкции
- Найди и прочитай
ObjectModule.bslчерез Glob:src/{{ProcessorName}}/Ext/ObjectModule.bsl - Убедись что
СведенияОВнешнейОбработке()существует. Если нет — предложи вызвать/epf-bsp-init - Определи вид обработки из существующего кода (найди строку с
ВидОбработки...()) - Вставь блок команды перед
Возврат ПараметрыРегистрации - Добавь обработчик по шаблону для типа команды и вида обработки из шага 3:
- Для серверных обработчиков и ЗагрузкаДанныхИзФайла — в
ObjectModule.bsl, областьПрограммныйИнтерфейс - Для клиентских обработчиков — в модуль основной формы (найти через Glob:
src/{{ProcessorName}}/Forms/*/Ext/Form/Module.bsl)
- Для серверных обработчиков и ЗагрузкаДанныхИзФайла — в
- Если обработчик (
ВыполнитьКоманду/Печать/ процедуры загрузки) уже есть — добавь ветку, не создавай дубль процедуры - Используй табы для отступов
Пример
Пользователь: /epf-bsp-add-command МояОбработка ЗаказПокупателя серверный "Заказ покупателя"
В СведенияОВнешнейОбработке() перед Возврат добавится:
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Заказ покупателя'");
НоваяКоманда.Идентификатор = "ЗаказПокупателя";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
НоваяКоманда.ПоказыватьОповещение = Ложь;
И в существующую процедуру ВыполнитьКоманду добавится блок обработки.