"Отложенные" события в Event-driven архитектуре

Добрый день!

У меня довольно базовый вопрос: при использовании “событийной” модели интеграции различных систем, как можно корректно реализовать следующий сценарий:

Мы хотим, чтобы при приеме на работу сотрудника, запись о нем автоматически попадала в другие системы. Допустим, прием на работу сотрудника фиксируется в ЗУП.
Информация об этом сотруднике должна попадать в СЭД Директум в виде записи справочника “Работники”.

Есть одно НО: информация о приеме сотрудника вводится за несколько дней до даты трудоустройства. Соответственно, привязаться с событию “проведение документа Прием на работу” мы не можем. Есть требование, чтобы запись в Директуме появлялась только тогда, когда работник реально принят.
Как поступать в таком случае?

С уважением,
Дмитрий

Имхо, при событийной надо изобрести событие зупе “Вот теперь точно точно принят”

В таком случае желательно, чтобы в системе было явное событие “вот теперь принят”.

Если такое отсутствует, то можно его реализовать через “регламент”, который будет мониторить дату реального приема и создаст событие, когда эта дата наступит.

Но обычно возможны различные исключения (в смысле, жизнь такая) и я бы рекомендовал окончательное принятие решения оставить за кем-то ответственным (с оповещением о необходимости утверждения).

Фактически есть как минимум 2 подхода

Отражающий реальность

  • первое событие "есть.потенциальный.сотрудник[Вася] -> очередь.черновиков.сотрудников[КтоХочетПодписаться]

  • второе событие "с.сотрудником.заключен.трудовой.договор[Вася] -> очередь.подписок.систем.предоставляющих.доступ

  • третье “сотрудник.подписал.соглашение.о.неразглашении.коммерческой.информации”

Вот третье событие и является кстати основанием для предоставления доступа к корпоративным системам, а не формальный приказ о приеме на работе…

На наших проектах я привязываюсь к нему и уже от него делаю всякие СКУД, AD и Документоборот.

Игры с датами

у нас есть заголовок сообщения, а в нем есть возможность задавать ключи, тогда так

точка обмена - сотрудник.будет.принят.на.работу[ДатаПриема, Вася] -> очередь.приемов.на.работу[<подписчики>]

тогда будет примерно так

Сообщение = КлиентОчередиСообщений.ПолучитьСообщение("очередь.приемов.на.работу");

Если Сообщение.Заголовки.ДатаПриема = текущаяДата Тогда
  ПринятьНаРаботу(Сообщение);
Иначе
  КлиентОчередиСообщений.ОтказатьсяИПоставитьВКонецОчереди(Сообщение)
КонецЕсли;

Во втором случае начинаются проблемы

  • первое - что делать если Вася ушел в запой и не подписал финальный договор
  • второе - что делать если Вася пришел на работу подписывать трудовой договор и отказался
  • третье - а в каком часом поясе считать эту самую дату приема

Поэтому я бы делал через 2 события

  • хотим принять чувака
  • подписались точно - предоставляйте доступ

И никаких отложенных событий…

В ЗУП есть понятие кандидат.

Т.е. понятие “хотим принять чувака” - это оно.

2 Симпатий