Перейти к содержимому

Рабочие процессы (Portal Flows)

Portal Flows — визуальная автоматизация списков: вы собираете схему из блоков (нод) на холсте, публикуете процесс, и портал сам запускает его при событии, по расписанию или вручную.

Документ рассчитан на администратора и владельца списка. Технические имена нод (латиницей) приведены в скобках — они нужны только если вы смотрите журнал или API.


Типичные задачи без программирования:

  • при создании заявки — выдать права автору и отправить письмо;
  • при смене поля — запросить согласование у руководителя;
  • каждый будний день в 9:00 — выбрать элементы и напомнить ответственным;
  • вызвать внешний HTTP API и показать уведомление в портале.

Если нужна сложная логика на C# — смотрите Event Receivers. Flows закрывают большинство сценариев «если → то» в редакторе.


  1. Лицензия с правом korport.workflows (или trial).
  2. Модуль «Рабочие процессы» установлен из каталога korport.ru.
  3. Служба workflows включена: Админка → Службы. По расписанию службы должен выполняться job обслуживания процессов.
  4. Для email и писем согласования: служба почты (notifications) и SMTP.
  5. Для ссылок Approve/Reject в письмах: публичный адрес портала (PORTAL_PUBLIC_URL).

ЗадачаКуда зайти
Все процессы порталаАдминка → Процессы
Процессы конкретного спискаСписок → НастройкиПроцессы
Задачи согласования (входящие)Меню аккаунта → Задачи согласования
Уведомления в порталеМеню аккаунта → Уведомления

  1. Откройте Процессы списка (или Админка → Процессы → Создать).
  2. Выберите список и название. Можно начать с шаблона или с пустого холста.
  3. На холсте слева — палитра блоков. Перетащите триггер (например «Элемент создан»).
  4. Добавьте действие (например «Отправить email») и соедините выход триггера со входом действия линией.
  5. Выберите ноду → справа Свойства: подпись, получатели, текст.
  6. Сохранить — черновик. Опубликовать — процесс начинает реагировать на события.
  7. Проверьте на тестовом элементе; журнал — кнопка Запуски.

На холсте должен быть хотя бы один триггер. При публикации регистрируются все триггеры с холста.


[ Триггер ] → [ Условие ] → [ Действие ]
↓ нет
[ Другое действие ]
ПонятиеСмысл
Вход (слева)Сюда приходит управление из предыдущей ноды
Выход (справа)Куда процесс пойдёт дальше; у веток несколько выходов
КонтекстДанные текущего запуска: элемент списка, кто вызвал событие, переменные
ПеременныеВременные значения одного запуска; подставляются как {{vars.имя}}

Порядок на одном списке: если на список повешено несколько опубликованных процессов, при событии каждый ставится в очередь отдельно. Порядок между ними не гарантирован — они не ждут друг друга. Нужна строгая последовательность шагов — соберите их в один процесс.


В согласовании, уведомлении и правах выбор получателя одинаковый:

ВариантКто получит
Автор элементаТот, кто создал элемент
ПользовательКонкретный человек (поиск по имени / логину)
ГруппаАктивные участники группы доступа
Поле «человек»Значение person-поля элемента (например «Ответственный»)

UUID вручную вводить не нужно — пользуйтесь поиском.


В теме письма, HTML, заметках и многих полях можно писать шаблоны:

ШаблонЧто подставится
{{item.fields.title}}Значение поля title (часто «Название»)
{{item.fields.имя_поля}}Любое поле по внутреннему имени
{{trigger.user.displayName}}Отображаемое имя пользователя, вызвавшего событие
{{trigger.user.email}}Его email
{{vars.имя}}Переменная, заданная ранее в процессе
{{vars.httpResponse.status}}Код ответа после HTTP-запроса
{{vars.error.message}}Текст ошибки в ветке Catch

Имена полей смотрите в настройках списка (внутреннее имя, не только заголовок в форме).


Ниже — все блоки палитры. Для каждой: зачем, вход / выходы, что настроить.

Триггер — точка старта. У триггера обычно один выход (вправо).

Запускается, когда в списке создали элемент. В контекст попадает новый элемент.
Типичная цепочка: создан → выдать права / письмо / уведомление.

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

Запуск при удалении. Удобно для уведомления или очистки связанных данных. Учтите: часть данных элемента после удаления может быть недоступна.

Старт, когда изменилось выбранное поле. В свойствах:

  • Поле — какое смотреть;
  • Было / Стало — необязательные фильтры (пусто = любое изменение этого поля).

Пример: поле «Статус» стало «Согласовано» → письмо автору.

Старт кнопкой Запустить в редакторе (или API). Удобно для отладки и разовых операций. Контекст элемента зависит от того, как вызвали запуск.

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

Важно: экземпляр стартует без элемента. Обычно дальше ставят Получить элементы и работают с выборкой. Расписание проверяет служба workflows (job обслуживания).


Ветвление по правилам над полями элемента.

Входодин
Выходысверху — да, снизу — нет

Правила объединяются связкой И / ИЛИ, можно группировать. Операторы: равно, не равно, пусто, не пусто, содержит, больше, меньше. Для полей «человек» и lookup значение выбирайте из поиска (сравнение по id).

Несколько веток по значению одного поля (часто choice).

Входодин
Выходыпо одному на каждый вариант + снизу иначе (если ничего не совпало)

В свойствах задайте поле и список значений (или подставьте варианты из choice-поля). Совпадение без учёта регистра. Порядок выходов сверху вниз = порядок вариантов.

Пишет значение в переменную запуска. Дальше — {{vars.имя}}. Значение может быть текстом или шаблоном с полями элемента.

Вход / выходпо одному

Считает выражение и кладёт результат в переменную.

Примеры выражений:

  • now() — текущее время
  • addDays(now(), 3) — плюс 3 дня
  • addMinutes(now(), 30)
  • concat("Заявка: ", item.fields.title)
  • number(...), round(...), length(...), lower / upper, coalesce(a, b)
  • арифметика: + - * /
Вход / выходпо одному

Пауза на N минут, затем процесс продолжается. Реализуется отложенным заданием Worker. Пока ждёт — статус запуска ожидание.

Вход / выходпо одному

Пауза, пока условие по полям элемента не станет истинным (элемент периодически перечитывается из БД). В свойствах — как у If/Else, плюс интервал опроса и максимальное ожидание (минуты). Если время вышло — запуск завершается с ошибкой.

Вход / выходпо одному

Параллельно запускает несколько веток сразу (имена веток — через запятую в свойствах). Каждую ветку нужно свести в Объединить.

НодаВыходы
Параллельнопо одному на каждую ветку
Объединитьодин выход после прихода всех веток

При ожидаемых входов = 0 число входов считается автоматически.
Ограничение: задержка или согласование в одной ветке ставит на паузу весь запуск.

Обработка ошибок шагов.

НодаВыходы
Tryсверху — тело, снизу — переход к обработке ошибки
Catchодин выход дальше

Если шаг в теле упал — процесс не «падает» целиком, а идёт в Catch; текст ошибки доступен как {{vars.error.message}}.
У HTTP уже есть свои выходы «успех / ошибка» — Try для него не обязателен.

Явно завершает запуск успешно. Дальше по этой ветке ничего не выполняется.

Входодин
Выходнет

Записывает значения в поля текущего элемента. В свойствах — JSON вида {"status":"Готово"} (ключи — внутренние имена полей).

Вход / выходпо одному

Создаёт элемент в указанном списке. Нужны id списка и JSON полей. Созданный элемент обычно доступен в переменных для следующих шагов.

Копия текущего элемента (в тот же или другой список), опционально с вложениями. Результат можно положить в переменную.

Копия в целевой список + удаление исходного.

Удаляет текущий элемент (в корзину, если она включена). Ставьте ближе к концу ветки.

Добавляет строку с меткой времени в текстовое / многострочное поле (история). Можно дописывать в конец или в начало.

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

Входодин
Выходыесть / нет

Читает элементы списка по простому фильтру и кладёт массив в переменную (по умолчанию items). Часто нужна после триггера «По расписанию».

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

Внешний вызов по HTTPS/HTTP.

Входодин
Выходыуспех / ошибка

Настройки: метод, URL, заголовки (JSON), тело, таймаут, число повторов. Ответ пишется в переменную (по умолчанию httpResponse): код статуса, тело и т.д.


Письмо через SMTP портала. Кому — адрес или шаблон с person-полем. Тема и HTML — с плейсхолдерами. Нужна настроенная служба почты.

Вход / выходпо одному

Сообщение в колокольчик / страницу «Уведомления» (это не email). Получатель — автор, пользователь, группа или person-поле; заголовок, текст, необязательная ссылка.


Право на элемент или список: просмотр, добавление, изменение, удаление. Кому — автор / пользователь / группа / person-поле.

Снимает право с выбранного субъекта.

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

Пишет сообщение в журнал шагов запуска — удобно для отладки без внешних эффектов. Текст может содержать плейсхолдеры.


Ставит процесс на паузу и создаёт задачи согласующим. Можно ответить в inbox портала или по ссылке из письма.

Входодин
Выходысверху — одобрено, снизу — отклонено
ПолитикаПоведение
Достаточно одного ответаПервый Approve или Reject решает; остальные задачи отменяются
Нужны ответы от всехВсе должны одобрить; любой Reject отклоняет весь запрос

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

Напоминания и эскалацию выполняет job обслуживания службы workflows.


ЦельПример схемы
Письмо при созданииЭлемент создан → Отправить email
Права авторуЭлемент создан → Выдать право (автор, изменение)
Только при смене статусаПоле изменилось → Условие / Switch → действия
Согласование правкиЭлемент изменён → Согласование → (одобрено) Email / (отклонено) Журнал
Напоминание по расписаниюПо расписанию → Получить элементы → Для каждого → Уведомление / Email
Внешний сервис(любой триггер) → HTTP → (успех) Уведомление → (ошибка) Журнал
Ждём поле… → Ждать условие → дальше по процессу
Ошибка не роняет процессTry → рискованные шаги → Catch → Email админу

Шаблоны универсальные — не завязаны на поля вроде «статус» или «исполнитель» конкретного списка «Задачи».

ШаблонСхема
Email автору при созданиисоздан → email инициатору
Email при измененииизменён → email
Права авторусоздан → выдать право на редактирование
Согласование при измененииизменён → согласование → email / журнал
Уведомление в портале при созданиисоздан → in-app автору
HTTP + уведомлениевручную → HTTP → уведомление / журнал

Плейсхолдер {{item.fields.title}} есть у большинства списков; если поля нет — поправьте текст в редакторе. Для реакции на своё поле смените триггер на «Поле изменилось».


  1. Сохранить — черновик на холсте, события ещё не слушает (или слушает предыдущую опубликованную версию).
  2. Опубликовать — фиксируется версия, регистрируются триггеры.
  3. Событие / расписание / ручной запуск → задание в очереди Worker.
  4. Задержка, согласование, «ждать условие» → статус ожидание, затем продолжение.

На странице Запуски видны статус (успешно, ошибка, ожидание…), тип триггера, шаги и сообщения об ошибках.


Служба workflows по своему cron запускает обслуживание:

  1. напоминания и эскалация согласований;
  2. проверка «Ждать условие»;
  3. срабатывание триггеров «По расписанию».

Без включённой службы и cron эти функции не работают вовремя.


Почему процесс не стартует?
Проверьте: опубликован ли, включён ли, есть ли entitlement, включена ли служба workflows, совпадает ли список и тип триггера. Смотрите журнал запусков.

Несколько процессов на одном событии
Каждый ставится в очередь отдельно; порядок между процессами не гарантирован.

Письма не уходят
Служба почты, SMTP, корректный адрес «Кому», плейсхолдеры person-полей.

Согласование «висит»
Проверьте срок, inbox /workflows/tasks, письмо со ссылками, job обслуживания и PORTAL_PUBLIC_URL.