Power Automate проект для Отдела Финансов: задачи и их решения

Наконец закончили проект для отдела финансов, который делали «на общественных началах» вместе с директором по логистике (это она, если что, но я никак не могу принять новомодного окончания -ка для обозначения должностей, занимаемых женщинами).

Проект, в сущности, довольно простой. Реализован с использованием Microsoft Forms, SharePoint Online, Power Automate и, конечно, Teams (куда же сегодня без него).

Бизнес-процесс следующий:

Аккаунт-менеджер оформляет заявку на заключение договора с клиентом в Microsoft Forms. Далее, в Power Automate срабатывает триггер в потоке, реагирующий на заполнение формы. Данные формы передаются на рассмотрение менеджерам разных уровней через механизм Approve, интегрированный с Teams. Одновременно создаётся запись в списке в SharePoint Online, с указанием текущего статуса сделки. В случае, если менеджер одобряет сделку, она передаётся на рассмотрение следующему менеджеру и так далее, пока не одобрят все участники процесса. При всеобщем одобрении инициатор запроса получает уведомление о том, что он может брать запрос в работу и заключать договор с клиентом. Если кто-то из менеджеров отказывает, запрос в целом получает статус «Отказано» и инициатор получает почтой уведомление о том, что ему необходимо связаться с менеджером, не утвердившим запрос, и ответить на комментарии, которые дал данный менеджер.

Всё просто. Кажется, что этот поток можно было бы сделать и силами бизнес-заказчика, ведь мы решили использовать Power Platform. Но, оказалось, что для заказчика всё это не так просто, как может показаться на первый взгляд, что у него нет времени на освоение платформы и т.д. и т.п. Кроме того, в процессе разработки возникло множество вопросов, решение которых в Power Automate не выглядело столь уж очевидным. Поэтому пришлось приложить к этому свою руку мне. ))

Сначала сделали очень простой поток в корпоративной среде по умолчанию. Проверили логику работы. Всё показалось корректным и можно было бы запускать в эксплуатацию бизнес-пользователями. Но, мы не ищем лёгких путей. Встал вопрос о том, что нужно бы сделать всё «по уму» и реализовать CI/CD для данного процесса с добавлением сред (Development, Test и Production). И вот тут появились интересные задачки, которые нужно было решить.

  • Как сделать так, чтобы в разных средах триггер срабатывал при заполнении разных форм? Т.е. для каждой среды — своя форма для заполнения. В простом варианте триггер отслеживает форму по ID, автоматом прописываемом в потоке при выборе формы в процессе создания потока. То же и с полями формы, которые Power Platform берет из формы в виде ID и которые для разных форм, соответственно, тоже разные. Для решения этой задачи пришлось создать переменные среды, в которых прописать уникальные ID для формы и для её полей, а в потоке в качестве ID использовать значения этих переменных. Конечно, не очень красиво, но, достаточно прописать эти значения один раз и можно пользоваться ими постоянно.
  • Когда мы прочитали данные формы, как обращаться к полям, если они, опять же, читаются по ID, а в разных средах эти ID будут разными? Решение — создать новый массив, в котором поля будут иметь читаемые (желательно, понятные для человека), одинаковые для всех сред имена, а значения будут взяты из полей формы.
  • Как запараллелить процессы утверждения? Количество менеджеров, которые одобряют заявку, может доходить до пяти. Это не проблема, так как процессы будут более-менее одинаковыми, меняется только имя менеджера и его идентификатор. Когда утверждение проходит по цепочке, тоже не проблема. Просто создаём запросы на утверждение последовательно. Но, бывает ситуация, когда одобрения должны делаться параллельно. Как быть в этом случае? Тут нам на помощь приходят бренчи или параллельные ветки. Когда возникает подобная ситуация, просто создаём не новое действие, а новую ветку:

А в неё уже можем добавить действия, которые нам будут нужны. В итоге получаем такую картинку

  • Как сделать напоминания менеджерам, если они не утвердили заявку в течение заданного времени? Возможно, что письмо с уведомлением о том, что заявка ожидает утверждения, будет потеряно или проигнорировано руководителем и заявка «зависнет» в ожидании. Чтобы напомнить о необходимости отреагировать на заявку, для всех утверждений сделали параллельные ветки, в которых проверяется статус некоторой переменной, которая изменяется после реакции на заявку. Если значение переменной изменилось за прошедший период (повторяем проверку каждые восемь часов, пока что-то не будет предпринято менеджером), двигаемся дальше. Если же переменная неизменна, отправляем письмо тому менеджеру, от которого не было реакции, и просим рассмотреть заявку.

В данной задаче возник вопрос, на который я пока не нашёл ответа. Сколько времени живёт переменная в потоке? Есть ли какой-то период, после которого отследить значение переменной невозможно? В документации по Power Automate ответа я пока не нашёл. Может кто-то подскажет в комментариях.

  • Ну и собственно, как реализовать CI/CD в Power Platform «малой кровью», чтобы не использовать Azure DevOps Services или GitHub? Как оказалось, это достаточно просто. Реализацию я описал в статье Добавить DevOps в Power Platform приложение? Легко! — Andrey’s blog (zyqandrey.blog).
  • Да, ещё один вопрос, который возник, это как быть с переменными среды в Managed средах? Можем ли мы менять их в своём managed решении? Как оказалось, не можем, но если очень хочется, то есть способ. О нём я тоже рассказал в упомянутой статье, но тут повторюсь. Оказывается, в решении Default, которое имеется во всех создаваемых нами средах, независимо от того, является ли среда managed или unmanaged, мы можем изменять значения переменных среды и эти изменения будут «видны» всем решениям, которые имеются в данной среде. В нашем случае мы, например, для managed среды Test или Production меняем переменные для значений ID формы и её полей, и триггер в нашем потоке будет срабатывать при заполнении «правильной» для него формы.

Вот, собственно, и весь проект. Как я сказал в начале, он довольно простой в смысле логики бизнес-процесса (если не считать, что в заявке имеется пять разных критериев, по которым запускается пять веток в каждой из которых одобрения должны делать менеджеры из десяти разных стран, двух вертикалей, и пяти департаментов). Но мы надеемся, что проект упростит жизнь АМов и сделает процесс утверждения заявок более прозрачным и простым.

Microsoft Power Platform — no code, low code или всё же нет?

Вопрос, конечно, риторический. Платформа, запущенная Microsoft несколько лет назад, оформилась, обросла «мясом», стала действительно достаточной для реализации вполне себе рабочих сценариев.

Но, что интересно, хотя Майкрософт декларирует, что это no code или low code платформа, т.е. что она позволяет создавать приложения или реализовывать сценарии без необходимости писать какой-либо код, компании публикуют вакансии для разработчиков (или инженеров) Power Platform. Если мы изучим требования к соискателям, то заметим, что несмотря на отсутствие требований к знанию языков программирования (хотя нет, всё же знание С# и .NET присутствует), сред разработки и прочей программистской тематики, подобный специалист явно не является рядовым пользователем O365, а знание Azure, методологии и практики DevOps, баз данных, SharePoint, ERP и BI систем будет большим плюсом, как и наличие диплома в Computer Science и/или  Information Systems.

Меня, как человека, немного знакомого с информационными технологиями, это наводит на мысль, что при такой квалификации инженер сможет сделать больше, чем накидать на канву drug-and-drop кнопок и задать им некоторые свойства.

Вообще, опыт работы с Microsoft Power Platform показывает, что понятие low code — это всё же маркетинговый ход. Обычные пользователи офисных продуктов, на которых рассчитана эта методология, честно говоря, побаиваются трогать что-либо, где есть циклы, многопоточные вычисления, условия, коннекторы и много чего, о чём они, возможно, слышали на уроках информатики в школе или на лекциях в универе, но постарались поскорее забыть, как только получили дипломы.

С другой стороны, подобный подход (отсутствие необходимости писать код, знать синтаксис языков программирования и прочие милые сердцу разработчика вещи) позволяет отдельным представителям отряда офисных работников, которые по ошибке или по глупости не пошли в своё время учиться на специальность «Compiter Science» в университете, сделать мечту реальностью и начать создавать мобильные и веб-приложения, бизнес-потоки и прочее своими руками. Да, поначалу это будет что-то простенькое, но со временем эти энтузиасты смогут стать реальными power users, а кого-то ждёт карьера Power Platform Engineer. Реальные примеры уже есть.

Нам же, крутым программерам, создающим свои решения с нуля, остаётся лишь свысока поглядывать на эти «детские шалости». Или уделить этому немного своего времени и сделать для коллег пару-тройку действительно крутых решений с использованием Power Apps, Power Automate, возможно, Azure ну и чего-нибудь ещё и показать, какую мощь даёт Power Platform на самом деле 😉