В 1С ДО необходимо автоматически запускать составной процесс утверждения и регистрации после положительного завершения процесса согласования.
Использовать согласование в том же составном процессе не получается, т.к. согласование должно быть настраиваемым (пользователем).
Есть идея создать свое бизнес-событие, типа "Документ согласован" и в "Правилах автозапуска процессов" прицепить к нему запуск нужного составного процесса.
Вот только как правильно описать детектор этого нового бизнес-события? Не могу найти никаких примеров...
Вот у меня был такой детектор на принятие задачи к исполнению:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗадачаИсполнителя.Ссылка
|
|ИЗ
| Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя
| ГДЕ
| (НЕ ЗадачаИсполнителя.Ссылка В
| (ВЫБРАТЬ
| ЗадачаИсполнителя.Ссылка
| ИЗ Задача.ЗадачаИсполнителя КАК ЗадачаИсполнителя ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПроизошедшиеБизнесСобытия КАК ПроизошедшиеБизнесСобытия
| ПО
| ЗадачаИсполнителя.Ссылка = ПроизошедшиеБизнесСобытия.Источник
| ГДЕ
| ПроизошедшиеБизнесСобытия.ВидСобытия = &ВидСобытия
| И ПроизошедшиеБизнесСобытия.ПометкаУдаления = &ПометкаУдаления))
| И ЗадачаИсполнителя.Выполнена = &Выполнена
| И ЗадачаИсполнителя.ПринятаКИсполнению = &ПринятаКИсполнению
| И ЗадачаИсполнителя.Дата МЕЖДУ &ДатаНач И &ДатаКон";
Запрос.УстановитьПараметр("ВидСобытия", Справочники.ВидыБизнесСобытий.НайтиПоНаименованию("Принятие к исполнению"));
Запрос.УстановитьПараметр("Выполнена",Ложь);
Запрос.УстановитьПараметр("ПринятаКИсполнению",Истина);
Запрос.УстановитьПараметр("ДатаНач",ТекущаяДата()-7*24*3600);
Запрос.УстановитьПараметр("ДатаКон",ТекущаяДата());
Запрос.УстановитьПараметр("ПометкаУдаления",Ложь);
Рез = Запрос.Выполнить();
Если НЕ Рез.Пустой() Тогда
Выб = рез.Выбрать();
Пока Выб.Следующий() Цикл
БизнесСобытияВызовСервера.ЗарегистрироватьСобытие(Выб.Ссылка,Справочники.ВидыБизнесСобытий.НайтиПоНаименованию("Принятие к исполнению"));
КонецЦикла;
КонецЕсли;
Показать
Запрос выбирает задачи, принятые к исполнению за неделю назад от текущей даты, исключая те, по которым бизнес-событие уже было зарегистрировано и регистрирует соответствующее событие. Был создан вид бизнес-события в справочнике "Виды бизнес-событий".
(2) Вы не могли бы посмотреть, пожалуйста, в чем у меня ошибка:
1. Создала свое БС "Документ согласован" (скрин1)
2. Создала детектор для этого БС по Вашему образцу (скрин2):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Согласование.Ссылка
|
|ИЗ
| БизнесПроцесс.Согласование Как Согласование
| ГДЕ
| (НЕ Согласование.Ссылка В
| (ВЫБРАТЬ
| Согласование.Ссылка
| ИЗ БизнесПроцесс.Согласование КАК Согласование ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПроизошедшиеБизнесСобытия КАК ПроизошедшиеБизнесСобытия
| ПО
| Согласование.Ссылка = ПроизошедшиеБизнесСобытия.Источник
| ГДЕ
| ПроизошедшиеБизнесСобытия.ВидСобытия = &ВидСобытия
| И ПроизошедшиеБизнесСобытия.ПометкаУдаления = &ПометкаУдаления))
| И Согласование.РезультатСогласования = &РезультатСогл
| И Согласование.Дата МЕЖДУ &ДатаНач И &ДатаКон";
Запрос.УстановитьПараметр("ВидСобытия", Справочники.ВидыБизнесСобытий.НайтиПоНаименованию("Завершение процесса"));
Запрос.УстановитьПараметр("РезультатСогл", Перечисления.РезультатыСогласования.Согласовано);
Запрос.УстановитьПараметр("ДатаНач", ТекущаяДата()-3*3600);
Запрос.УстановитьПараметр("ДатаКон", ТекущаяДата());
Запрос.УстановитьПараметр("ПометкаУдаления", Ложь);
Рез = Запрос.Выполнить();
Если НЕ Рез.Пустой() Тогда
Выб = Рез.Выбрать();
Пока Выб.Следующий() Цикл
//Результат = Истина;
БизнесСобытияВызовСервера.ЗарегистрироватьСобытие(Выб.Ссылка,Справочники.ВидыБизнесСобытий.НайтиПоНаименованию("Документ согласован"));
КонецЦикла;
//Иначе
// Результат = Ложь;
КонецЕсли;
Показать
БС НЕ регистрируется :(
Кстати, в описании к детекторам есть такое:
//Пример обработки
//Если СобытиеПроизошло Тогда
//Результат = Истина;
//Иначе
//Результат = Ложь;
//КонецЕсли;
(4) Смотрите, ваш код рабочий (у меня), заменил только Запрос.УстановитьПараметр("ВидСобытия", Справочники.ВидыБизнесСобытий.НайтиПоНаименованию("Завершение процесса")); Вместо "Завершение процесса" - "Документ согласован". Запрос построен таким образом, что если по документу уже было зарегистрировано это событие, то повторно событие не обрабатывается. "Завершение процесса" естественно в журнале уже есть, поэтому детектор стопорился. Если сделать "результат = истина", то событие в журнал криво записывается - можете попробовать.
Можно сделать так, как предлагает Skromnyi, тогда нужно код обработки события рисовать.
(6) Да, действительно, спасибо за исправление. Теперь БС регистрируется, ура!
Вот только "Правило автозапуска процесса" почему-то ничего не запускает...
Может я неправильно понимаю принцип этого механизма? Я считала, что он должен запускать указанный Шаблон процесса с Источником события в качестве предмета, если зарегистрировано указанное в Правиле Бизнес-событие с Источником события в качестве источника события )
(11)У меня, к стати, тоже не получилось(( Событие есть, детектор срабатывает, а автозапуска не происходит, но у меня в ЖР ошибки - дескать тип документа не тот (хотя тот), не победил (на скорую). У себя (для другой задачи) сделал запуск процесса доп. обработчиком.