PowerApps на личном опыте

Меня зовут Андрей Браун, и я являюсь руководителем группы внедрения решений на SharePoint Server и SharePoint Online в компании i-Sys Labs, одним из направлений которой, является автоматизация бизнес процессов на платформе SharePoint. Совсем недавно мне удалось поучаствовать в проекте автоматизации процессов на SharePoint Online и получить некоторый опыт работы с продуктом PowerApps, и я решил поделиться изученным.
СТАТЬЯ БЛОГА

Доброго времени суток! Меня зовут Андрей Браун, и я являюсь руководителем группы внедрения решений на SharePoint Server и SharePoint Online в компании i-Sys Labs, одним из направлений которой, является автоматизация бизнес процессов на платформе SharePoint. Совсем недавно мне удалось поучаствовать в проекте автоматизации процессов на SharePoint Online и получить некоторый опыт работы с продуктом PowerApps, и я решил поделиться изученным. Так как мой опыт, в основном, заключается в реализации систем электронного документооборота, то поставленная мне задача была очень близка к тому, чем я занимаюсь.

Итак, исходная поставленная задача от заказчика - «Реализовать модуль Конструктор маршрутов согласования документов». Звучит немного непонятно, поэтому вкратце объясню суть данного модуля. Необходимо сделать такую систему, которая позволит пользователю конструировать маршрут согласования и исполнения для своего документа самому, руками, либо выбирая из заранее предустановленных маршрутов в справочнике. Причем маршруты могут быть последовательными, параллельными или комбинированными.
Решение должно быть облачное, так как заказчик использует Office 365. Вот такой набор исходных данных.

В качестве основной платформы был выбран SharePoint Online. С его помощью можно легко и быстро создать всю необходимую структуру данных, настроить права доступа и не заботиться об инфраструктурных проблемах.

Далее встал вопрос о разработке форм для взаимодействия с пользователями. Как ни крути, но базовый SharePoint не предоставляет каких-то механизмов для гибкой настройки логики форм. Хотелось использовать удобный и функциональный редактор, в котором не пришлось бы писать весь код обработки в виде JS. И чтобы были уже готовые шаблоны управления данными. В on-premise мы решаем эту задачу с помощью нашей платформы DocTrix Platform, однако ее еще нет под SharePoint Online и нужно было искать альтернативные инструменты, позволяющие без привлечения разработчиков и с минимальными лицензионными затратами решить задачу. В итоге выбор был сделан в пользу PowerApps от Microsoft, которая представляет собой дизайнер форм и приложений с довольно обширным набором возможностей для настройки. Подписка на него у Заказчика уже была и предварительный анализ возможностей показал, что поставленную задачу решить можно. О PowerApps будет ниже.

В качестве платформы для реализации бизнес-процессов был выбран продукт SYSTEMZ Flow для Office 365, разработанный нашей компанией (или сокращенно ZFlow). Изначально совместно с Заказчиком рассматривали возможность использования Microsoft Flow, однако его функциональности не хватило для реализации необходимой логики. Об этом будет во второй части статьи.

Немного о концепции реализуемой системы. В моем представлении это виделось так:
Пользователь открывает форму создания элемента списка. На форме создания пользователь заполняет реквизиты, добавляет вложения, а также выбирает из справочника тип документа. В справочнике типов документов, для каждого типа, заранее определяется таблица маршрутов, с согласующими для каждого этапа. После выбора типа документа, происходит автоматическое заполнение таблицы маршрута согласования с копированием согласующих и этапов из справочника. Затем у пользователя есть возможность внести изменения в маршрут. После сохранения карточки документа происходит автоматический запуск рабочего процесса. Рабочий процесс обрабатывает очереди из таблицы маршрутов и назначает соответствующие задачи на участников. После завершения задач, рабочий процесс анализирует результаты и переводит документ в соответствующий статус. Вроде все относительно просто и логично.

Было создано несколько списков SharePoint со всеми необходимыми столбцами, и, после этого, началась работа по настройке форм с помощью PowerApps. Так как на форме должно быть много реквизитов и таблиц, то я решил разбить их по вкладкам, как можно увидеть на скриншотах ниже. Сразу скажу, что над красотой интерфейса я не особо старался, так как была задача обеспечить, в первую очередь, функциональность системы. Визуальные навороты я решил отложить на потом.

На вкладке «General» я расположил реквизиты Status, Initiator, Initiator Department, Title, Document Type и Description. Реквизиты Initiator и Initiator Department заполнялись автоматически, на основании профиля пользователя.

На вкладке «Attachments» расположил поле для добавления вложений:

На вкладке «Approval Routes» была расположена таблица с маршрутом согласования а также кнопки «Create Route», «Edit Route» и «Delete Route», для выполнения действий над очередями:

Например, при нажатии на кнопку «Create Route», отображаются реквизиты для создания новой очереди в данной таблице:

«Edit Route», соответственно, открывает реквизиты для редактирования очереди, ну а «Delete Route», что логично, удаляет выбранную очередь из таблицы.

На вкладке «Tasks» расположилась таблица, которая должна содержать задачи, созданные в рамках рабочего процесса:

После заполнения основных реквизитов форма выглядит следующим образом:



После нажатия кнопки Save, происходит сохранение элемента и автоматический запуск рабочего процесса ZFlow.

Опыт работы с PowerApps оставил весьма смешанные впечатления. С одной стороны, это действительно очень мощный инструмент, который позволяет настраивать формы практически в любом виде, в котором необходимо, плюс можно даже реализовать определенную логику на самой форме с помощью кнопок и событий. С другой стороны, настраивается это все не так удобно и легко, как хотелось бы, когда, казалось бы, те вещи, которые должны были бы настраиваться автоматически, по смыслу, в результате требуют ручной настройки. Тут напрашивается аналогия с конструктором автомобиля, например, у тебя куча деталей и проводов, все удобно разложено, сгруппировано. Можно связать детали простыми проводами и все будет работать. Только вот если отходить от стандартных шаблонов, то нужно будет делать все вручную. Скажем, у тебя есть педаль тормоза и колеса. И по умолчанию у тебя тормозить будет только одно колесо. Чтобы тормозили все колеса, нужно для каждого колеса прописать событие, которое должно происходить при нажатии на педаль тормоза. А еще, неплохо бы, чтобы на спидометре уменьшалась при этом скорость. Для этого тоже надо поведение прописать. Прописали? А обороты почему-то не падают. А потому что не прописано событие на тахометр. Кстати, кончился бензин. А не отображается эта информация, потому что датчик бензобака не связан с дисплеем отображения уровня топлива. Поставили машину на сигнализацию, но двери не закрылись? Это все потому что не прописано событие. Прописано событие, ставишь на сигнализацию, закрываются двери, но включаются фары. Потому что это событие конфликтует с другим событием, описанным ранее.

Впрочем, через некоторое время, когда привыкаешь к этим особенностям и принимаешь правила игры, PowerApps раскрывается с другой стороны – как удобный инструмент, где можно настроить практически любое поведение элементов управления, которое необходимо. И начинаешь этим наслаждаться. Все элементы управления, панели и действия очень удобно расположены и сгруппированы:


Добавленные поля и кнопки легко выравниваются по отношению к другим элементам на странице. Можно выделять несколько элементов и прописывать им одинаковое поведение для нескольких свойств сразу.

Впрочем, различные глюки и проблемы тоже присутствуют, вот несколько из них:

  1. После публикации формы, она не сразу применяется к списку SharePoint. Может потребоваться несколько обновлений страницы браузера с очисткой кэша. Нередко бывают случаи, когда вместо новой формы применяется какая-нибудь предыдущая версия, поэтому рекомендую заводить какой-нибудь служебный реквизит на форме и перед каждой публикацией писать туда некий номер, чтобы отслеживать версию сразу на форме. Сэкономит много времени и нервов.

  2. При описании функций часто «слетает» валидация и ошибки не подсвечиваются. Из-за этого очень часто бывает ситуация, когда не отрабатывает определенная вами логика, а почему – непонятно, так как ошибок нет. Помогает переоткрытие дизайнера PowerApps, обновление источников данных и тому подобные вещи.

  3. Не советую доверять встроенному механизму предварительного просмотра приложения. Очень часто он не инициализирует переменные и всё работает не так как ты планировал. При этом поиск ошибок ни к чему не приводит, так как все сделано корректно. Проверка работы непосредственно в списке SharePoint, после публикации формы, более надежна.

  4. Нужно быть очень осторожным с механизмами отмены сделанных изменений и возврата (аналог Undo и Redo). Довольно часто были случаи, когда отменить изменения получилось, а вернуть назад – почему-то нет.

  5. Описание логики поведения, с непривычки, может отпугнуть. Простые вещи делаются без особых проблем, но стоит перейти к немного более сложным задачам, и всё становится уже не так просто и очевидно, как кажется на первый взгляд. Например, ниже представлен небольшой фрагмент кода из PowerApps, который обновляет имеющийся в коллекции элемент:


А здесь описана логика завершения задачи и сброс значений служебных переменных:

Без тщательного изучения справочных материалов и серфинга в интернете по форумам, написать нечто подобное будет не так уж просто, хотя, может быть, для кого-то это не станет очень уж большой проблемой. Но тут я бы хотел отметить, что я не являюсь разработчиком под SharePoint, а больше занимался конфигурированием и решением задач без использования кода. Что касается технической информации, стоит отметить, что в интернете существует достаточное количество форумов по PowerApps, где люди делятся своим опытом по реализации тех или иных задач. 

Резюмируя, могу сказать, что работа с редактором форм PowerApps, оставила, в целом, положительные ощущения, но ряд проблем и не самый простой подход к реализации логики поведения несколько портит впечатление и заставляет иногда изобретать велосипеды, которые только перегружают ваш код. Этот опыт дает еще большее понимание ценности различных редакторов форм, с которыми мы работаем в SharePoint On-premise.

После реализации форм настала очередь создания рабочего процесса, который бы обрабатывал полученные очереди и двигал наш документ по жизненному циклу, назначая задачи, отправляя уведомления и переводя статусы. Одной из разработок нашей компании является дизайнер рабочих процессов ZFlow, который позволяет настраивать логику процессов в удобном редакторе, прямо в браузере, путем добавления и настройки блоков-действий. Так как я обладаю определенным опытом работы с данным дизайнером, я решил попробовать реализовать логику именно в нём. Как выяснилось позже, он отлично подошел для решения данной задачи.


По опыту работы с редактором ZFlow могу сказать, что это довольно мощный инструмент для реализации рабочих процессов различных уровней сложности. В нем есть очень много блоков-действий для выполнения различных операций. Из необходимых для решения поставленной задачи возможностей могу выделить следующие:

  1. Возможность вычисления срока выполнения задачи с учетом календаря рабочего времени
    Для этого используется календарь рабочей недели SharePoint, а также специальный список ZFlow Calendar, где можно отмечать выходные и рабочие дни, которые потом будут учитываться процессом при вычислении.

  2. Возможность строить запросы к любым спискам и библиотекам через действие Query List, получая нужную информацию в коллекции.

  3. Возможность создания конечного автомата состояний, с переходами между состояниями.

  4. Назначение задач с помощью действия Composite Task, в котором можно настроить
    напоминания о назначенных задачах, а также уведомления, в случае если задача просрочена.

  5. Возможность отключения блоков-действий. То есть можно добавить действие, настроить его и выключить. В этом случае рабочий процесс не будет его выполнять, хотя физически оно будет присутствовать в процессе. Очень полезно и удобно для отладки.

  6. Отдельная страница для просмотра всех имеющихся в рабочем процессе переменных, с возможностью перехода к блокам-действиям, где они используются.

  7. Возможность возобновления рабочего процесса после ошибки выполнения.

Но, также, как и в случае с PowerApps, у данного инструмента есть ряд ограничений, таких как:

  1. Если в ходе настройки рабочего процесса была допущена ошибка, то публикация процесса не выполнится, но какая именно была сделана ошибка, редактор не говорит. Благо можно сохранить процесс, чтобы не потерять изменения и потом уже разбираться, в чем проблема.

  2. Нет возможности посмотреть ход выполнения рабочего процесса в виде графической схемы. Поэтому если в ходе выполнения возникают какие-то ошибки, то обнаружить их становится не так уж и просто. Но опять же, можно делать записи в журнал истории, специальным действием рабочего процесса Write to History и по этим записям ориентироваться, где сейчас находится рабочий процесс.

  3. Есть возможность настроить запуск процесса при создании элемента или при редактировании элемента, но нет возможности задания условий запуска. Однако, это решается путем проверки условий в начале самого рабочего процесса и, если они не выполняются, то можно завершать рабочий процесс действием Terminate Current Workflow.

Плюсом также является то, что редактор постоянно развивается, появляются новые возможности, устраняются проблемы.

Так как PowerApps не позволяет настраивать формы элементов списка задач, то вся работа с задачами была вынесена на форму основного элемента, на вкладку «Tasks», и выглядела следующим образом:


При нажатии на одну из кнопок «Approve», «Approve with remarks» или «Reject» отображаются реквизиты для завершения задачи с выбранным результатом:


Перед нажатием на кнопку «Complete», которая вызывает завершение задачи, можно указать комментарии и добавить дополнительных согласующих, если это необходимо. Выбранные дополнительные согласующие будут добавлены новой очередью и процесс учтет это изменение в ходе назначения задач. Таким образом происходит работа с документом вплоть до полного согласования либо до отклонения одним из участников маршрута.

Подводя итоги, могу сказать, что с помощью инструментов PowerApps и ZFlow в связке с SharePoint Online можно настраивать логику различной степени сложности, благо возможностей у данных продуктов «выше крыши». Главное разобраться как это все работает и правильно применить полученные знания. Спасибо за внимание! Надеюсь, вам было интересно.