fix(epf-bsp-add-command): типы команд и сигнатуры обработчиков по контракту БСП

- убран несуществующий ТипКомандыСценарийВБезопасномРежиме(), добавлен
  ТипКомандыЗагрузкаДанныхИзФайла() с шаблонами трёх процедур загрузки;
  список типов помечен исчерпывающим, указана применимость к видам
- СозданиеСвязанныхОбъектов: серверный ВыполнитьКоманду с СозданныеОбъекты
  (4 параметра) — также в epf-bsp-init
- клиентские обработчики: Печать для печатных форм, вариант для создания
  связанных объектов

Refs #82

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ANXwbMUhuRFSCsq2RgmTTm
This commit is contained in:
Nick Shirokov
2026-09-24 19:56:38 +03:00
co-authored by Claude Opus 5.5
parent 43c8f50592
commit 16345eb83d
2 changed files with 115 additions and 19 deletions
+102 -18
View File
@@ -33,13 +33,15 @@ allowed-tools:
Пользователь может указать тип в свободной форме:
| Пользователь пишет | ТипКоманды |
|---------------------------------------|-----------------------------------------------------|
| открыть форму, форма | `ТипКомандыОткрытиеФормы()` |
| клиентский метод, на клиенте | `ТипКомандыВызовКлиентскогоМетода()` |
| серверный метод, на сервере | `ТипКомандыВызовСерверногоМетода()` |
| заполнение формы, заполнить форму | `ТипКомандыЗаполнениеФормы()` |
| сценарий, безопасный режим | `ТипКомандыСценарийВБезопасномРежиме()` |
| Пользователь пишет | ТипКоманды | Доступен для вида обработки |
|---------------------------------------|-------------------------------------------|-----------------------------|
| открыть форму, форма | `ТипКомандыОткрытиеФормы()` | любого |
| клиентский метод, на клиенте | `ТипКомандыВызовКлиентскогоМетода()` | любого |
| серверный метод, на сервере | `ТипКомандыВызовСерверногоМетода()` | любого |
| заполнение формы, заполнить форму | `ТипКомандыЗаполнениеФормы()` | ЗаполнениеОбъекта |
| загрузка из файла, импорт из файла | `ТипКомандыЗагрузкаДанныхИзФайла()` | ДополнительнаяОбработка; в конфигурации должна быть подсистема «Загрузка данных из файла» |
Других типов команд в БСП нет. Если запрошенный тип не подходит ни под одну строку — спроси пользователя, не придумывай метод. Если тип недоступен для вида обработки — сообщи об этом и не добавляй команду.
Если пользователь не указал тип — определи по виду обработки из существующего кода `СведенияОВнешнейОбработке()`:
@@ -74,7 +76,13 @@ allowed-tools:
## Шаблоны обработчиков
### ВызовСерверногоМетода — если обработчик уже есть
Шаблон выбирается по паре «тип команды × вид обработки».
### ОткрытиеФормы
Обработчик не нужен: открывается основная форма обработки, идентификатор команды приходит в `Параметры.ИдентификаторКоманды`.
### ВызовСерверногоМетода, ЗаполнениеФормы — если обработчик уже есть
Если процедура `ВыполнитьКоманду` уже существует в модуле объекта, добавь ветку перед `КонецЕсли`:
@@ -83,9 +91,11 @@ allowed-tools:
// TODO: Реализация {{Идентификатор}}
```
### ВызовСерверногоМетода — если обработчика нет
### ВызовСерверногоМетода, ЗаполнениеФормы — если обработчика нет
Для глобальных обработок (без `ОбъектыНазначения`):
Процедура добавляется в модуль объекта. Сигнатура зависит от вида обработки.
ДополнительнаяОбработка, ДополнительныйОтчет (без `ОбъектыНазначения`):
```bsl
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
@@ -97,7 +107,7 @@ allowed-tools:
КонецПроцедуры
```
Для назначаемых обработок (с `ОбъектыНазначения`):
ЗаполнениеОбъекта, Отчет:
```bsl
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполненияКоманды) Экспорт
@@ -109,6 +119,20 @@ allowed-tools:
КонецПроцедуры
```
Для команды типа ЗаполнениеФормы обработчик тот же: `ОбъектыНазначения` = `Неопределено`, заполняемая форма передаётся в `ПараметрыВыполненияКоманды.ЭтаФорма`.
СозданиеСвязанныхОбъектов (ссылки созданных объектов добавляются в массив `СозданныеОбъекты`):
```bsl
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполненияКоманды) Экспорт
Если ИдентификаторКоманды = "{{Идентификатор}}" Тогда
// TODO: Реализация {{Идентификатор}}
КонецЕсли;
КонецПроцедуры
```
### ПечатнаяФорма — если процедура Печать уже есть
Добавь блок перед `КонецПроцедуры`:
@@ -137,9 +161,9 @@ allowed-tools:
### ВызовКлиентскогоМетода
Добавляется в **модуль формы** (`Forms/<FormName>/Ext/Form/Module.bsl`):
Добавляется в **модуль основной формы** (`Forms/<FormName>/Ext/Form/Module.bsl`). Имя и сигнатура зависят от вида обработки.
Для глобальных обработок:
ДополнительнаяОбработка, ДополнительныйОтчет:
```bsl
&НаКлиенте
@@ -152,7 +176,7 @@ allowed-tools:
КонецПроцедуры
```
Для назначаемых обработок:
ЗаполнениеОбъекта, Отчет:
```bsl
&НаКлиенте
@@ -165,18 +189,78 @@ allowed-tools:
КонецПроцедуры
```
СозданиеСвязанныхОбъектов:
```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. Добавь обработчик:
- Для серверных обработчиков — в `ObjectModule.bsl`, область `ПрограммныйИнтерфейс`
- Для клиентских обработчиков — в модуль формы (найти через Glob: `src/{{ProcessorName}}/Forms/*/Ext/Form/Module.bsl`)
6. Если обработчик (`ВыполнитьКоманду` / `Печать`) уже есть — добавь ветку, не создавай дубль процедуры
5. Добавь обработчик по шаблону для типа команды и вида обработки из шага 3:
- Для серверных обработчиков и ЗагрузкаДанныхИзФайла — в `ObjectModule.bsl`, область `ПрограммныйИнтерфейс`
- Для клиентских обработчиков — в модуль основной формы (найти через Glob: `src/{{ProcessorName}}/Forms/*/Ext/Form/Module.bsl`)
6. Если обработчик (`ВыполнитьКоманду` / `Печать` / процедуры загрузки) уже есть — добавь ветку, не создавай дубль процедуры
7. Используй табы для отступов
## Пример
+13 -1
View File
@@ -108,7 +108,7 @@ allowed-tools:
Для видов с типом команды `ВызовСерверногоМетода` добавь соответствующую процедуру-обработчик в ту же область `ПрограммныйИнтерфейс`, после `СведенияОВнешнейОбработке`.
### Для ЗаполнениеОбъекта / СозданиеСвязанныхОбъектов
### Для ЗаполнениеОбъекта
```bsl
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполненияКоманды) Экспорт
@@ -118,6 +118,18 @@ allowed-tools:
КонецПроцедуры
```
### Для СозданиеСвязанныхОбъектов
Ссылки созданных объектов добавляются в массив `СозданныеОбъекты`:
```bsl
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, СозданныеОбъекты, ПараметрыВыполненияКоманды) Экспорт
// TODO: Реализация
КонецПроцедуры
```
### Для ПечатнаяФорма
```bsl