Рабочие процессы (Portal Flows)
Portal Flows — визуальная автоматизация списков: вы собираете схему из блоков (нод) на холсте, публикуете процесс, и портал сам запускает его при событии, по расписанию или вручную.
Документ рассчитан на администратора и владельца списка. Технические имена нод (латиницей) приведены в скобках — они нужны только если вы смотрите журнал или API.
Зачем это нужно
Заголовок раздела «Зачем это нужно»Типичные задачи без программирования:
- при создании заявки — выдать права автору и отправить письмо;
- при смене поля — запросить согласование у руководителя;
- каждый будний день в 9:00 — выбрать элементы и напомнить ответственным;
- вызвать внешний HTTP API и показать уведомление в портале.
Если нужна сложная логика на C# — смотрите Event Receivers. Flows закрывают большинство сценариев «если → то» в редакторе.
Что нужно заранее
Заголовок раздела «Что нужно заранее»- Лицензия с правом
korport.workflows(или trial). - Модуль «Рабочие процессы» установлен из каталога korport.ru.
- Служба workflows включена: Админка → Службы. По расписанию службы должен выполняться job обслуживания процессов.
- Для email и писем согласования: служба почты (
notifications) и SMTP. - Для ссылок Approve/Reject в письмах: публичный адрес портала (
PORTAL_PUBLIC_URL).
Где открыть
Заголовок раздела «Где открыть»| Задача | Куда зайти |
|---|---|
| Все процессы портала | Админка → Процессы |
| Процессы конкретного списка | Список → Настройки → Процессы |
| Задачи согласования (входящие) | Меню аккаунта → Задачи согласования |
| Уведомления в портале | Меню аккаунта → Уведомления |
Быстрый старт
Заголовок раздела «Быстрый старт»- Откройте Процессы списка (или Админка → Процессы → Создать).
- Выберите список и название. Можно начать с шаблона или с пустого холста.
- На холсте слева — палитра блоков. Перетащите триггер (например «Элемент создан»).
- Добавьте действие (например «Отправить email») и соедините выход триггера со входом действия линией.
- Выберите ноду → справа Свойства: подпись, получатели, текст.
- Сохранить — черновик. Опубликовать — процесс начинает реагировать на события.
- Проверьте на тестовом элементе; журнал — кнопка Запуски.
На холсте должен быть хотя бы один триггер. При публикации регистрируются все триггеры с холста.
Как устроен граф
Заголовок раздела «Как устроен граф»[ Триггер ] → [ Условие ] → [ Действие ] ↓ нет [ Другое действие ]| Понятие | Смысл |
|---|---|
| Вход (слева) | Сюда приходит управление из предыдущей ноды |
| Выход (справа) | Куда процесс пойдёт дальше; у веток несколько выходов |
| Контекст | Данные текущего запуска: элемент списка, кто вызвал событие, переменные |
| Переменные | Временные значения одного запуска; подставляются как {{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 обслуживания).
Условие (If / Else)
Заголовок раздела «Условие (If / Else)»Ветвление по правилам над полями элемента.
| Вход | один |
| Выходы | сверху — да, снизу — нет |
Правила объединяются связкой И / ИЛИ, можно группировать. Операторы: равно, не равно, пусто, не пусто, содержит, больше, меньше. Для полей «человек» и lookup значение выбирайте из поиска (сравнение по id).
Switch по полю
Заголовок раздела «Switch по полю»Несколько веток по значению одного поля (часто 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
Заголовок раздела «Try / Catch»Обработка ошибок шагов.
| Нода | Выходы |
|---|---|
| Try | сверху — тело, снизу — переход к обработке ошибки |
| Catch | один выход дальше |
Если шаг в теле упал — процесс не «падает» целиком, а идёт в Catch; текст ошибки доступен как {{vars.error.message}}.
У HTTP уже есть свои выходы «успех / ошибка» — Try для него не обязателен.
Остановить процесс
Заголовок раздела «Остановить процесс»Явно завершает запуск успешно. Дальше по этой ветке ничего не выполняется.
| Вход | один |
| Выход | нет |
Элемент и данные
Заголовок раздела «Элемент и данные»Изменить поля
Заголовок раздела «Изменить поля»Записывает значения в поля текущего элемента. В свойствах — JSON вида {"status":"Готово"} (ключи — внутренние имена полей).
| Вход / выход | по одному |
Создать элемент
Заголовок раздела «Создать элемент»Создаёт элемент в указанном списке. Нужны id списка и JSON полей. Созданный элемент обычно доступен в переменных для следующих шагов.
Копировать элемент
Заголовок раздела «Копировать элемент»Копия текущего элемента (в тот же или другой список), опционально с вложениями. Результат можно положить в переменную.
Переместить элемент
Заголовок раздела «Переместить элемент»Копия в целевой список + удаление исходного.
Удалить элемент
Заголовок раздела «Удалить элемент»Удаляет текущий элемент (в корзину, если она включена). Ставьте ближе к концу ветки.
Заметка в поле
Заголовок раздела «Заметка в поле»Добавляет строку с меткой времени в текстовое / многострочное поле (история). Можно дописывать в конец или в начало.
Копировать вложения
Заголовок раздела «Копировать вложения»Копирует файлы текущего элемента на другой (нужны целевой список и id элемента, часто из переменной после «Создать»).
Есть вложения?
Заголовок раздела «Есть вложения?»| Вход | один |
| Выходы | есть / нет |
Получить элементы списка
Заголовок раздела «Получить элементы списка»Читает элементы списка по простому фильтру и кладёт массив в переменную (по умолчанию items). Часто нужна после триггера «По расписанию».
Для каждого
Заголовок раздела «Для каждого»Обходит массив из переменной (например результат «Получить элементы»). Возможности цикла в текущей версии ограничены — проверяйте журнал запусков.
HTTP-запрос
Заголовок раздела «HTTP-запрос»Внешний вызов по HTTPS/HTTP.
| Вход | один |
| Выходы | успех / ошибка |
Настройки: метод, URL, заголовки (JSON), тело, таймаут, число повторов. Ответ пишется в переменную (по умолчанию httpResponse): код статуса, тело и т.д.
Уведомления
Заголовок раздела «Уведомления»Отправить email
Заголовок раздела «Отправить email»Письмо через 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}} есть у большинства списков; если поля нет — поправьте текст в редакторе. Для реакции на своё поле смените триггер на «Поле изменилось».
Сохранить, опубликовать, запуски
Заголовок раздела «Сохранить, опубликовать, запуски»- Сохранить — черновик на холсте, события ещё не слушает (или слушает предыдущую опубликованную версию).
- Опубликовать — фиксируется версия, регистрируются триггеры.
- Событие / расписание / ручной запуск → задание в очереди Worker.
- Задержка, согласование, «ждать условие» → статус ожидание, затем продолжение.
На странице Запуски видны статус (успешно, ошибка, ожидание…), тип триггера, шаги и сообщения об ошибках.
Обслуживание в фоне
Заголовок раздела «Обслуживание в фоне»Служба workflows по своему cron запускает обслуживание:
- напоминания и эскалация согласований;
- проверка «Ждать условие»;
- срабатывание триггеров «По расписанию».
Без включённой службы и cron эти функции не работают вовремя.
Частые вопросы
Заголовок раздела «Частые вопросы»Почему процесс не стартует?
Проверьте: опубликован ли, включён ли, есть ли entitlement, включена ли служба workflows, совпадает ли список и тип триггера. Смотрите журнал запусков.
Несколько процессов на одном событии
Каждый ставится в очередь отдельно; порядок между процессами не гарантирован.
Письма не уходят
Служба почты, SMTP, корректный адрес «Кому», плейсхолдеры person-полей.
Согласование «висит»
Проверьте срок, inbox /workflows/tasks, письмо со ссылками, job обслуживания и PORTAL_PUBLIC_URL.
См. также
Заголовок раздела «См. также»- Event Receivers — сценарии на C#, когда Flows недостаточно
- API почты
- Службы — включение workflows и почты
- Лицензии и тарифы