Найти в Дзене
Изучаем Битрикс24

Работа с активити "Запрос доп.информации (с отклонением)" в конструкторе бизнес-процессов Битрикс24

Сегодня я расскажу вам о тонкостях работы с активити "Запрос доп.информации (с отклонением)".

Но сначала краткая предыстория: одним из моих клиентов была поставлена задача "Организовать процесс внутреннего документооборота, используя стандартные возможности Битрикс24".

Реализация данного процесса - не сложная задача на смарт-процессах, но один момент, с которым я столкнулся, оказался весьма трудоемким.

Клиент попросил, чтобы при согласовании каждый пользователь имел возможность загружать скорректированные файлы в задание, сформированное как раз этим самым активити "Запрос доп.информации (с отклонением)". Причем, после процесса согласования должна была измениться стадия процесса: в случае успеха - процесс должен был перейти на стадию "Подготовка к подписанию", где инициатор вручную должен был объединить все комментарии в один финальный документ, а в случае отклонения - процесс должен был перейти на начальную стадию "Черновик".

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

Вроде тоже не сложная задача. В активити "Запрос доп.информации (с отклонением)" создается переменная с типом файл, чтобы туда согласующими лицами уже загружались скорректированные документы. Однако, вывести значение переменной в виде файла в таймлайн можно, но работать такая конструкция не будет. И вот почему!

Дело в том, что активити "Запрос доп.информации (с отклонением)" позволяет записать значение в переменную, которая очищается при завершении бизнес-процесса. А бизнес-процесс автоматически завершается при смене стадии. И получается, что даже если вывести значение переменной в таймлайн, то при переходе на другую стадию и клике на файл в таймлайне будет выдаваться ошибка Error2.

Один из путей решения, скажете вы, создать в смарт-процессе поля с таким же типом файл, куда и записывать значения из переменной активити.

Думаю, что если бы клиент был маленькой компанией человек на 5, то, конечно, так можно было сделать. Но клиент - очень крупная компания, состоящая из более чем 2000 человек. Поэтому в самом начале анализа этого процесса клиент дал следующие вводные:

1) Согласующие лица должен добавлять сам инициатор заявки на старте запуска бизнес-процесса, и это должно быть множественное поле.

2) Файлов, загружаемых согласующими лицами на соответствующем этапе , тоже может быть несколько.

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

Что вы теперь скажете? Стала задача интереснее?

Конечный процесс, который я реализовал, выглядит вот так:

Давайте по порядку:

1) Запускаем итератор по переменной. Он нужен для определения согласующих лиц и последовательной им отправки документа на согласования.

То есть мы создаем множественную переменную с типом Привязка к пользователю, и далее кладем туда значение из поля "Согласующие лица", которые как раз и заполняет инициатор.

2) Далее делим процесс на параллельные ветки: левая ветка - основной процесс, правая ветка - уведомления. Здесь останавливаться подробно не буду и просто напишу, что чтобы из центра уведомлений пользователь смог перейти по ссылке сразу на задание надо использовать комбинацию вида: "Согласование [url=https://{host}/company/personal/bizproc/{=A46493_8649_14635_89407:TaskId}/]по ссылке[/url].", где A46493_8649_14635_89407 - идентификатор действия активити "Запрос доп.информации (с отклонением)".

3) В левой ветке мы добавляем запись в таймлайн вида: Текущий согласующий: {=A14799_82769_77422_53930:Value > printable}, где A14799_82769_77422_53930 - идентификатор действия итератора.

4) Далее в той же левой ветке остановимся подробнее на активити "Запрос доп.информации (с отклонением)".

-2

В поле "Заполняют сотрудники" мы указываем {=A14799_82769_77422_53930:Value}, где A14799_82769_77422_53930 - идентификатор действия итератора. Именно там закладывается значение каждого согласующего лица.

Обращаю ваше внимание, что мы обязательно переводим в "Да" пункт "Сохранять значение в случае отказа". Этот пункт необходим, чтобы при отклонении информация в переменную все же попала, а не затерялась где-то по дороге.

-3

Далее мы создаем множественную переменную, в которую и будет осуществляться загрузка документов.

5) Теперь самое интересное. Реализация заключается в том, что мы будем сохранять загруженные документы не в поля, а на общий диск. Для этого создаем отдельный диск. С правами на этот общий диск - отдельная история, не описываемый в текущей статье, но самый простой способ - дать доступ на чтение всем сотрудникам. Хотя, конечно, можно заморочиться и выдавать права, использую php-активити в самом конструкторе бизнес-процесса.

6) Так как после активити "Запрос доп.информации (с отклонением)" ветка снова раздваивается на позитивный и негативный сценарий, то в обеих ветках надо добавить активити "Загрузить файл в хранилище Диска".

-4

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

7) Казалось бы, получить ссылку на размещенные в каталоге Диска файлы и вывести. Чего проще! Но увы, не все так просто) Дело в том, что если согласующее лицо загрузит несколько документов, а мы выведем ссылку сразу после 6 пункта, то при клике на активную ссылку в таймлайне будет загружаться только первый документ. Второй документ скачать из таймлайна мы не сможем.

Поэтому запускаем новый итератор.

Сначала создаем соответствующую множественную переменную с типом Файл, так как итератор можно запустить только по переменной. А потом мы кладем в эту переменную все файлы из каталога, которые были загружены из той самой переменной.

-5

{=A75574_81914_26486_2637:ObjectId} - здесь A75574_81914_26486_2637 - идентификатор действия активити Загрузить файл в хранилище Диска.

8) Далее в итераторе выбираем активити "Получение детальной информации об объекте Диска". Этим активити мы получаем url для загрузки каждого файла. Кстати, можно получать url и для просмотра каждого файла, но это дополнительные действия из таймлайна.

-6

Здесь {=A15449_7306_96436_86920:Value} - значение итератора.

9) На этом шаге мы создаем новую переменную с типом Текст и делаем следующее

-7

Особое внимание уделю следующей комбинации: [url={=A83010_3221_50027_94305:DownloadUrl}]{=A83010_3221_50027_94305:Name}[/url]. Здесь A83010_3221_50027_94305 - идентификатор действия Получение детальной информации об объекте Диска.

10) Теперь нам остается только вывести эту информацию в таймлайн.

-8

11) Тоже самое надо проделать и с правой веткой - негативным сценарием.

На этом все. Если кто-то знает более изящные способы реализации этой задачи без привлечения разработчика - пишите в комментариях.