|
Детекторы в ДО 2.1 | ☑ | ||
---|---|---|---|---|
0
Momus
29.03.23
✎
15:35
|
Не совсем разобрался как написать свой детектор. Нашел в сети какие-то бестолковые и примитивные примеры (особенно "понравился" урок https://www.youtube.com/watch?v=O1njJXbMU1A ). С помощью детектора хочу сделать аналог "Создание внутреннего документа" для определенных документов.
Для части документов необходимо было добавить доп. реквизиты, которые затем используются в бизнес-процессе. Т.е. помимо типовых автоподстановок, я добавил свои, завязанные на значениях доп. реквизитов. Некоторые из этих доп. реквизитов необязательны к заполнению, поэтому при старте бизнес-процесса нужно часть задач убрать. К сожалению, ДО не может запустить процесс, если, например, одна из задач не имеет исполнителя, даже если она никогда перейдет к исполнителю, например, по условию маршрутизации. Чтобы как-то выйти из этой ситуации, я создал обработчик при создании внутреннего документа, который запускает процесс по шаблону: убирает все задачи из шаблона, у которых не указан исполнитель, который в свою очередь тянется из значения доп. реквизита. Так вот, я бы хотел разделить создание "правильных" внутренних документов (их бизнес-процессы не привязаны к доп. реквизитам), от моих. |
|||
1
Donkey_hot
29.03.23
✎
15:38
|
(0) А нужно ли тут отдельное событие? Почему просто не проанализировать вид созданного документа в обработчике типового события "создание внутреннего документа"?
|
|||
2
Momus
29.03.23
✎
15:42
|
(1) так и делаю сейчас. Есть подозрение, что моя доработка вызывает блокировки, поэтому я хотел бы разделить обработку событий
|
|||
3
Donkey_hot
29.03.23
✎
15:48
|
(2) Насколько помню, есть регистр Произошедшие бизнес-события. Можете аналиизровать в нем. Если типовое событие уже произошло и обработано для вашего документа, детектировать свое. Но я бы смотрел в сторону отсечения ненужных задач на уровне шаблона, условной маршрутизацией (у Вас же КОРП?)
|
|||
4
Momus
29.03.23
✎
15:51
|
(3) Цель детектора - создание события. Затем это событие фиксируется в регистре произошедших бизнес-событий.
|
|||
5
Momus
29.03.23
✎
15:52
|
не создание, а детектирование :) Главное то, что сначала идет детектор, потом событие, затем обработка этого события
|
|||
6
Momus
29.03.23
✎
15:58
|
(1) хотя можно на событие "Создание внутреннего документа" можно повесить обработчик, в котором я проанализирую вид документа, а затем зарегистрирую новое событие "Создание неправильного внутреннего документа", в котором уже буду редактировать бизнес-процесс. Кривая схема с удалением задачи без исполнителя порождает еще одну кривую схему, приведенную мной выше :(
|
|||
7
Momus
29.03.23
✎
16:08
|
похоже единственный толк от детектора - это посмотреть сколько активных пользователей, как во всех примерах в сети :)
|
|||
8
Donkey_hot
29.03.23
✎
16:19
|
(4) Спасибо, что просветили. Предложение было в следующем: в детекторе анализировать факт возникновения ТИПОВОГО события, и если оно уже произошло и обработано, то фиксировать ВАШЕ событие ("создание документа - повторная обработка"). А дальше делайте с ним что хотите в обработчиках.
|
|||
9
RomaH
naïve
30.03.23
✎
08:52
|
Процедура СоздатьСобытиеОкончанияСрокаДействияПриказа(Результат,ПараметрыВозврата) Экспорт
Результат = Ложь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ВнутренниеДокументы.Ссылка КАК Ссылка, | ВнутренниеДокументы.ДатаНачалаДействия КАК ДатаНачалаДействия, | ВнутренниеДокументы.ДатаОкончанияДействия КАК ДатаОкончанияДействия, | ВнутренниеДокументы.ДатаРегистрации КАК ДатаРегистрации, | ВнутренниеДокументы.Ответственный КАК Ответственный |ИЗ | Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроизошедшиеБизнесСобытия КАК ПроизошедшиеБизнесСобытия | ПО ВнутренниеДокументы.Ссылка = ПроизошедшиеБизнесСобытия.Источник | И (ПроизошедшиеБизнесСобытия.ВидСобытия = &ВидСобытия) |ГДЕ | НЕ ВнутренниеДокументы.НеДействует | И ВнутренниеДокументы.ПериодДействияДокумента = &ПериодДействияДокумента | И ВнутренниеДокументы.ВидДокумента = &ВидДокумента | И НАЧАЛОПЕРИОДА(ВнутренниеДокументы.ДатаОкончанияДействия, ДЕНЬ) = НАЧАЛОПЕРИОДА(&ДатаОкончанияДействия, ДЕНЬ) | И ПроизошедшиеБизнесСобытия.Идентификатор ЕСТЬ NULL | |УПОРЯДОЧИТЬ ПО | ДатаОкончанияДействия УБЫВ"; Запрос.УстановитьПараметр("ВидДокумента", Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Приказ", Истина)); Запрос.УстановитьПараметр("ВидСобытия", Справочники.ВидыБизнесСобытий.НайтиПоНаименованию("Окончание срока действия приказа", Истина)); Запрос.УстановитьПараметр("ДатаОкончанияДействия", ТекущаяДата()); Запрос.УстановитьПараметр("ПериодДействияДокумента", Перечисления.ПериодДействияДокумента.Срочный); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Если Выборка.Следующий() Тогда Результат = Истина; ПараметрыВозврата.Вставить("Источник",Выборка.Ссылка); ПараметрыВозврата.Вставить("Автор",Выборка.Ответственный); КонецЕсли; КонецПроцедуры например - регистрация события |
|||
10
RomaH
naïve
30.03.23
✎
08:58
|
код самих обработчиков выношу в ОМ расширения, дабы потом можно было найти что и как работает, а из обработчиков только вызываю эти процедуры
|
|||
11
Momus
30.03.23
✎
09:00
|
(9) тоже привязываетесь к штатному событию, как советовали в (8). Теперь понятно как работают детекторы, спасибо
|
|||
12
Momus
30.03.23
✎
09:01
|
(3) в ответ на "Но я бы смотрел в сторону отсечения ненужных задач на уровне шаблона, условной маршрутизацией (у Вас же КОРП?)" - К сожалению, ДО не может запустить процесс, если, например, одна из задач не имеет исполнителя, даже если она никогда перейдет к исполнителю, например, по условию маршрутизации.
|
|||
13
RomaH
naïve
30.03.23
✎
09:01
|
нет - это свой детектор
|
|||
14
Momus
30.03.23
✎
09:04
|
(13) свой, который привязывается к типовому событию "Окончание срока действия приказа"
|
|||
15
RomaH
naïve
30.03.23
✎
09:06
|
(14) нет
все события обработчики и детекторы свои - созданные в пользовательском режиме |
|||
16
Momus
30.03.23
✎
09:06
|
Это хорошее решение, просто раньше я предполагал, что свои события можно как-то создавать без привязки к типовым
|
|||
17
Momus
30.03.23
✎
09:07
|
(15) как тогда создается событие "Окончание срока действия приказа"?
|
|||
18
RomaH
naïve
30.03.23
✎
09:10
|
блин, событие - это запись в РС Произошедшие бизнес-события
что и делает вышеуказанный код |
|||
19
Momus
30.03.23
✎
09:11
|
(18) а это что?
Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПроизошедшиеБизнесСобытия КАК ПроизошедшиеБизнесСобытия ПО ВнутренниеДокументы.Ссылка = ПроизошедшиеБизнесСобытия.Источник И (ПроизошедшиеБизнесСобытия.ВидСобытия = &ВидСобытия) |
|||
20
RomaH
naïve
30.03.23
✎
09:13
|
это что бы исключить уже зарегистрированные события - без этого соединения у меня на один и тот же док будет создаваться запись РС каждую минуту
|
|||
21
Momus
30.03.23
✎
09:13
|
вы в детекторе привязываетесь к событию "Окончание срока действия приказа". Если "Окончание срока действия приказа" - это не типовое событие, то мне интересно как вы его детектируете
|
|||
22
Momus
30.03.23
✎
09:13
|
(20) понял
|
|||
23
RomaH
naïve
30.03.23
✎
09:14
|
это не событие - это Вид события
детектирую вышеуказанным кодом - код запускается регламентным заданием типовым |
|||
24
Momus
30.03.23
✎
09:16
|
(23) понятно, что вид) под событием понимаю запись в регистре с определенным видом события. В любом случае теперь я понял, что делает ваш запрос)
|
|||
25
RomaH
naïve
30.03.23
✎
09:17
|
начните с создания нового детектора (там же вид события)
вот этот код разместить в обработчике и оно начнет регистрировать события потом прикрутите обработчик события |
|||
26
Momus
30.03.23
✎
09:20
|
(25) Все понятно после (20). Я не обратил внимание на " И ПроизошедшиеБизнесСобытия.Идентификатор ЕСТЬ NULL", потому и не понял :)
|
|||
27
Rokford
30.03.23
✎
10:12
|
О! Только что увидел тему...
Детекторы использую, например, чтобы определять наступление нужной даты месяца (каждый четвертый вторник месяца, либо наступление последнего рабочего дня месяца) для рассылки ежемесячных задач (планы отделов, отчеты, сдача табелей и т.п.). Еще один пример (это для себя :) - появление ожидающих маршрутизации комплексных процессов (когда пользователи не по плану работают с документом, процесс может встать из-за ошибки и об этом могут долго не вспоминать). |
|||
28
Rokford
30.03.23
✎
10:24
|
(0) По поводу незаполненных доп реквизитов можно проще решить задачу. (не нужно удалять задачу).
У нас тоже есть похожие схемы. 1. Перед задачей, которая необязательно должна быть выполнена (которую, как я понял ты удаляешь) поставь условие на заполненность этого реквизита (это довольно легко настраивается конструктором). 2. Изначально в шаблоне для такой задачи ставлю исполнителем АвтораДокумента (он всегда есть и заполнен). 3. В самом начале старта процесса перед всеми задачами есть программный блок, который при заполнении доп.реквизита (у нас это согласующий) меняет исполнителя задачи (с автора на заполненного согласующего). и все отлично работает. |
|||
29
Momus
30.03.23
✎
11:28
|
(28) Изначально я примерно так и поступал) Только вместо автора документа создал роль без исполнителей. В обработчике подменял исполнителя на значение доп. реквизита. И это все нормально работало, пока не появились необязательные реквизиты) После моего анализа, я возможно вернусь к изначальному варианту в итоге)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |