Handlers

Материал из RunaWFE
Перейти к навигации Перейти к поиску

Руководство по работе с обработчиками

Версия 4.6.0

© 2015-2023, ООО "Процессные технологии"


Введение

  • В этом документе описаны только 16 наиболее употребительных обработчиков из 54 поддерживаемых в RunaWFE. Но область применения остальных вполне понятна из мнемоники их названий. Помимо этого интерфейс конфигурации каждого обработчика раскрывает способ обращения к нему и не позволяет совершить многих ошибок.
  • Обработчики могут быть привязаны как к узлам-сценария, так и к переходам (которые в виде сплошной линии). При необходимости привязки обработчика к переходу надо в выпадающем меню "Вид" поставить галку в строчке "Показать обработчики". В палитре элементов нотации появится значок "шетерёнки", последовательно используя который можно привязать любое количество обработчиков к любому переходу. Если для процесса снять галку "Показать обработчики", то исчезнет как элемент палитры, так и иконки обработчиков на переходах. Но фактически заданные обработчки останутся и сохранят свою функциональность.
Обработчики, описанные в этом документе
Обработчик Описание
1 ActorNameActionHandler Получение переменных имени сотрудника
2 AddObjectToListActionHandler Добавить объект в список
3 AddReadProcessPermissionsHandler Добавить права на чтение процесса
4 AssingSwimlaneActionHandler Назначить роль
5 BotInvokerActionHandler Вызвать бот станцию
6 CreateCalendarHandler Создать переменную даты
7 CreateOptionActionHandler Создать опцию для выбора
8 DocxHandler Word: Формирование документа DOCX, используя шаблон
9 EscalationActionHandler Эскалация
10 ExcelReadHandler Excel: Прочесть данные из файла
11 ExcelSaveHandler Excel: Сохранить данные в файл
12 FormulaActionHandler Выполнить формулу
13 GroovyActionHandler Выполнить код Groovy
14 RemoveObjectFromListActionHandler Удалить объект из списка
15 SendEmailActionHandler Отправить email
16 SQLActionHandler Выполнить запросы SQL
Обработчики, в этом документе не описанные
Обработчик Описание
17 CheckSignPdfHandler Проверить подпись в PDF-файле
18 CheckSmsStatusActionHandler Проверить статус SMS
19 ClearVariableActionHandler Обнулить переменную
20 ConvertGroupsToUsersHandler Развернуть группы (преобразовать в пользователей)
21 ConvertMapKeysToListActionHandler Перевести ключи карты в список
22 ConvertMapsToListsHandler Перевести значения карт в списки
23 ConvertMapValuesToListActionHandler Перевести значения карты в список
24 DebugHandler Дебаг (выводит текст)
25 DoNothingTaskHandler Ничего не делать
26 EmailTasksNotifierActionHandler Уведомление о невыполненных заданиях
27 EndAsyncTasksHandler Завершить асинхронные задания
28 ExcelFormulaHandler Excel: Выполнить формулы
29 ExecutorsListFromGroupHandler Получить исписок исполнителей группы
30 ExternalStorageHandler Внешнее хранилище данных
31 GetExecutorInfoHandler Получить информацию об исполнителе
32 GetExecutorByRelationHandler Получить исполнителя по отношению
33 GetExecutorsByRelationHandler Получить список исполнителей по отношению
34 GetObjectFromListActionHandler Получить элемент списка
35 GetObjectFromMapActionHandler Получить элемент карты
36 GetTaskPerformerHandler Получить исполнителя задания
37 JavaScriptActionHandler Выполнить код JavaScript
38 ListAgrregateFunctionActionHandler Агрегатная функция над списком
39 LoadFileVariableFromFileSystemHandler Загрузить файл из файловой системы
40 MapAgrregateFunctionActionHandler Агрегатная функция над картой
41 MergeDocxHandler Word: Копирование нескольких документов DOCX в один
42 MergeMapsActionHandler Объединить карты
43 ModifyProcessPermissionsHandler Изменить разрешения процесса
44 PutObjectToMapActionHandler Положить элемент в карту
45 RemoveObjectFromMapActionHandler Удалить объект из карты
46 ReportHandler Создать отчёт
47 SaveFileToFileSystemHandler Выгрузить файл в файловую систему
48 SendSmsActionHandler Отправить SMS
49 SetDateVariableHandler Установить переменную даты
50 SetObjectToListActionHandler Установить элемент списка
51 SignPdfHandler Подписать PDF-файл
52 SortListActionHandler Сортировка списка
53 StopProcessHandler Остановить процесс
54 TargetProcessSetDateVariableHandler Установить переменную даты в другом БП


# GroovyActionHandler

Данный ActionHandler используется для пересчета значений переменных бизнес процесса.

Пример конфигурации:

My_date = new java.util.Date();
My_rnd = new java.util.Random(1000).nextInt();
My_time = java.lang.System.currentTimeMillis();
int n = Integer.parseInt(multNumber);
String[] array = new String[n];
for (int i=0; i < n; i++) {
    array[i] = "book "+i;
};
multArray = array;

Измененные в процессе исполнения скрипта переменные изменят свое значение в БП. Будут изменены лишь переменные, определенные в процессе!

Конфигурацией является корректный код Groovy (подробнее), который по синтаксису идентичен Java.

Замечание: В версии RunaWFE 4.3.0 в обработчике Groovy была добавлена возможность присваивания роли переменных формата Список(Исполнитель), Список(Пользователь), Список(Группа). В этом случае роль инициализируется временной группой, содержащей исполнителей из переменной соответствующего списка.

Роль1 = list;

Удаление временных групп выполняется с учетом значений параметров timertask.period.millis.remove.temp.groups, timertask.start.millis.remove.temp.groups.

Также доступна возможность копирования списка исполнителей и в переменную формата "Исполнитель".


# FormulaActionHandler

FormulaActionHandler – универсальный ActionHandler, предназначенный для изменения значений переменных бизнес процесса. Для показа работы данного обработчика был разработан демо процесс ExecuteFormulaDemo. Обработчики располагаются в узлах-сценария. При наведении курсора мыши на узел-сценария будет показан обработчик, используемый в его конфигурации. Для редактирования формул необходимо выбрать пункт «Конфигурация» в свойствах обработчика:

GpdActionHandler ru4.png


Появится окно, в котором надо задать формулы вида: 'имя модифицируемой переменной' = выражение:

GpdActionHandler ru5.png


В выражении могут использоваться операции: +, -, *, /, <, <=, ==, !=, >, >=, &, |, ^.

Наибольший приоритет (4) у умножения и деления. Приоритет 3 у операций сложения и вычитания. Приоритет 2 у операций сравнения. Наименьшим приоритетом обладают булевы операции «&» (and), «|» (or) и «^» (xor).


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


Помимо переменных могут использоваться непосредственные значения форматов Long, Double, Boolean, String, Date и функции.


Пример присваивания значений переменным

variable1 = 2
variable2 = 3.1415926535
variable3 = true
variable4 = «string»
variable5 = « \» » (для использования символа кавычки требуется поставить перед ней '\' )
variable6 = 01.09.2008
variable7 = '01.09.08 18:00' (здесь требуется заключить дату в одинарные кавычки, так как она содержит пробелы)
variable8 = round_up(2.564367, 3) (variable8 = 2.565)
variable9 = number_to_string_ru(102, «F», «спичка», «спички», «спичек») (variable9 = «сто две спички»)
"текущая дата" = current_date()
"время" = current_time()
"дата и время" = current_date_time()


Функции, поддерживаемые в RunaWFE

RunaWFE поддерживает 22 функции. Некоторые из них могут иметь несколько форматов вызова. Формат вызова функции определяется количеством используемых аргументов.

Полный перечень функций
Функциональность
CreateSubListByIndexes(list, indexes) Возвращает список, содержащий элементы списка list, позиции которых содержатся в списке indexes
current_date() Возвращает системную дату
current_date_time() Возвращает системную дату и время
current_time() Возвращает системное время
date(d1) Округляет дату до целого числа дней, отбрасывая время
DeleteListElementsByIndexes(list, indexes) Возвращает копию списка list с удалёнными из неё элементами, номера позиций которых содержатся в списке indexes
FIO_case_ru(fio, caseNumber, mode) Выбирает соответствующие контексту склонения для существительных
get_process_id() Возвращает номер текущего экземпляра процесса
GetListMatchedIndexes(list, argument) Список индексов элементов списка list1, которые одновременно присутствуют в элементе argument
GetListMismatchedIndexes(list1, list2) Список индексов элементов списка list1, отсутствующих в списке list2
GetSize(container) Возвращает целое число, соответствующее количеству элементов в списке или карте
hours_round_up(n1) Округляет время, заданное в минутах, до часов в верхнюю сторону
isExecutorInGroup(group, executor) Выясняет принадлежность исполнителя к группе
ListToString(list[, simbol]) Соединяет список в одну строку
number_to_string_ru(n1[, s2, s3, s4, s5]) Переводит число в строку на русском языке
number_to_short_string_ru(n1, s2, s3, s4, s5) Выбирает соответствующую числу форму зависимого слова
random() Возвращает случайное вещественное число от 0 до 1
round(n1[, n2]) Округляет число в ближайшую сторону либо до целого, либо оставляя n2 знаков после запятой
round_down(n1[, n2]) Округляет число в меньшую сторону либо до целого, либо оставляя n2 знаков после запятой
round_up(n1[, n2]) Округляет число в большую сторону либо до целого, либо оставляя n2 знаков после запятой
time(d1) Отбрасывает дни, оставляя только время
ToList(argument1[, argumentN]) Возвращает список из аргументов

Функции общего применения

  • date(дата) - округляет дату до целого числа дней, отбрасывая время
  • time(дата) - отбрасывает дни, оставляя только время
  • hours_round_up(число) - округляет время, заданное в минутах, до часов в верхнюю сторону; и аргумент, и переменная для хранения результата должны быть числовыми
  • round(число) или round(число, количество знаков после запятой) - округляет число в ближайшую сторону, оставляя фиксированное количество знаков после запятой
  • round_up(число) или round_up(число, количество знаков после запятой) - округляет число в большую сторону
  • round_down(число) или round_down(число, количество знаков после запятой) - округляет число в меньшую сторону
  • number_to_string_ru(число) - переводит число в строку на русском языке
  • number_to_string_ru(число, s2, s3, s4, s5) - переводит число с зависимым словом в строку на русском языке
  • number_to_short_string_ru(число, s2, s3, s4, s5) - выбирает соответствующую числу форму зависимого слова
  • get_process_id() - возвращает номер текущего экземпляра процесса
  • random() - возвращает псевдослучайное число с плавающей запятой из диапазона [0, 1), то есть от 0 (включительно) до 1 (но не включая 1), которое затем можно отмасштабировать до нужного диапазона.

Где:

s2 — 'M' или 'F' — мужской/женский род зависимого слова
s3, s4, s5 — зависимое слово в трех формах (например:день, дня, дней).

Функция для работы с ФИО

Функция FIO_case_ru() позволяет выбирать соответствующие контексту склонения для фамилии, имени и отчества, а также для сопутствующих им слов.

  • FIO_case_ru(String fio, int caseNumber, String mode)

Где:

fio - фамилия, имя и отчество в именительном падеже через пробел
caseNumber - номер падежа (от 1 до 6)
mode - строка форматирования. 

Правила использования символов форматирования:

  • Символы F, I и O заменяются на фамилию, имя или отчество в соответствующем падеже
  • Символы f, i и o заменяются на первую букву фамилии, имени или отчества и дополняются точкой
  • Все другие символы транслируются в выходную строку без изменений.


Примеры использования:

FIO_case_ru("Иванов Иван Иванович", 1, "F I O :)")    //Иванов Иван Иванович :) 
FIO_case_ru("Иванова Ира Ивановна", 2, "F I o")       //Ивановой Иры И. 
FIO_case_ru("Иванов Иван Иванович", 3, "F i O")       //Иванову И. Ивановичу 
FIO_case_ru("Иванова Ира Ивановна", 4, "F i o")       //Иванову И. И. 
FIO_case_ru("Иванов Иван Иванович", 5, "f I O")       //И. Иваном Ивановичем 
FIO_case_ru("Иванова Ира Ивановна", 6, "о I o")       //о Ире И. 
FIO_case_ru("Апырвапыркина Фыва Няковна", 5, "F I O") //Апырвапыркиной Фывой Няковной. 


Если функция неправильно склоняет какие-либо имена и фамилии, можно добавить исключение. Для этого воспользуйтесь механизмом расширения - создайте конфигурационный файл nameCaseConf.xml и расположите его в директории ..\standalone\wfe.custom (если директория wfe.custom не существует, то создать). Например, для Windows версии RunaWFE, файл должен быть помещен в C:\Program Files\RunaWFE\Simulation\standalone\wfe.custom\.


Формат файла:

<?xml version=”1.0”>
<nameCaseConf>
 <family value = “фамилия в именительном падеже”>
   <rule case = “номер падежа”>правильный вариант фамилии</rule>
   <rule case = “номер падежа”>правильный вариант фамилии</rule>
     …
 </family>
 <family value = “фамилия в именительном падеже”>
   …
 </family>
 <name value = “имя в именительном падеже”>
   <rule case = “номер падежа”>правильный вариант имени</rule>
     …
 </name>
 <parent value = “отчество в именительном падеже”>
   <rule case = “номер падежа”>правильный вариант отчества</rule>
     …
 </name>
 …
</nameCaseConf>


Пример файла конфигурации:

<?xml version="1.0" encoding="UTF-8"?>
<nameCaseConf>
  <!-- <name value="Николай">
  </name> -->
  <family value="Кримза">
    <rule case="2">Кримзы</rule>
    <rule case="3">Кримзе</rule>
    <rule case="4">Кримзу</rule>
    <rule case="5">Кримзой</rule>
    <rule case="6">Кримзе</rule>
  </family>
  <!-- <parent value="Петрович">
  </parent> -->
</nameCaseConf>


В версии RunaWFE 4.3.0 в обработчик ExecuteFormula была добавлена возможность склонения на основе файла с данными. Создайте файл mappingConf.xml и расположите его в директории ..\standalone\wfe.custom (если директория wfe.custom не существует, то создать). Например, для Windows версии RunaWFE, файл должен быть помещен в C:\Program Files\RunaWFE\Simulation\standalone\wfe.custom\}.

Формат файла mappingConf.xml:

<?xml version="1.0" encoding="UTF-8"?>
<mappingConf>
  <rule title="должность в дательном падеже">
    <item input="Бухгалтер" output="Бухгалтеру" />
    <item input="Ведущий геофизик" output="Ведущему геофизику" />
    <item input="Геодезист 1 категории" output="Геодезисту 1 категории" />
    <item input="Главный специалист по геологии" output="Главному специалисту по геологии" />
  </rule>
</mappingConf>

После этого в конфигурации обработчика можно будет использовать следующую конструкцию для склонения:

some_variable = mapping("Бухгалтер", "должность в дательном падеже")

Функции для работы со списками

  • ListToString(list1) - соединяет список в одну строку; можно указать опциональный 2-й аргумент - разделитель подстрок; если разделитель подстрок не задан, то разделителем по умолчанию буде пробел
  • GetListMatchedIndexes(Список1, Аргумент2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, во втором аргументе (может быть списком или объектом другого простого формата) существует совпадающий с ним элемент в любой позиции
  • GetListMismatchedIndexes(Список1, Список2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, в списке Список2 не существует совпадающего с ним элемента
  • CreateSubListByIndexes(Список1, СписокПозиций2) возвращает список СписокПоПозициям, содержащий элементы списка Список1, позиции которых содержатся в списке СписокПозиций2
  • DeleteListElementsByIndexes(Список1, СписокПозиций2) возвращает копию списка Список1 с удалёнными из неё элементами, номера позиций которых содержатся в списке СписокПозиций2
  • ToList(аргументы...) возвращает список из аргументов
  • GetSize(container) возвращает целое число, соответствующее количеству элементов в списке или карте.


# SQLActionHandler

Используется для взаимодействия с БД.

С помощью этого обработчика можно создать запрос, выполняющий чтение из БД в переменные БП, или, наоборот, запись в БД значений переменных БП. В одном обработчике возможно выполнить несколько запросов.

Формирование SQL-запроса

Диалог конфигурации для данного обработчика выглядит следующим образом:

Process-editor User guide ru 49d2.png


В версии RunaWFE 4.4.1 была добавлена возможность использования не только JNDI-источника данных:

  • "Источник данных (JNDI Name)" – имя источника данных, зарегистрированного на сервере (для WildFly, как правило, используется с префиксом java:/)
  • "Переменная с JNDI-именем" – переменная, содержащая JNDI-имя источника, зарегистрированного на сервере
  • "Имя источника данных" – здесь доступен выбор из определенных в DevStudio источников данных (см. "Источники данных")
  • "Переменная с именем" – переменная, содержащая имя источника данных.

SQL-запрос – собственно сам запрос (в формате java.sql.PreparedStatement).

В версии RunaWFE 4.4.1 писать SQL запрос стало значительно удобнее – запрос теперь может занимать более одной строки; также была введена подсветка синтаксиса SQL.

Синтаксис запроса включает текст запроса, в котором места параметров отмечаются знаками "?", количество и порядок которых должно соответствовать числу и порядку следования параметров в секции "Параметры запроса". Если это запрос типа SELECT, то он должен явно перечислять столбцы, значения которых будут присвоены переменным, перечисленным в секции "Результаты запроса".

Можно использовать запрос как значение переменной. Для этого нужно указать строку запроса в конфигураторе в виде ${query}, где query – переменная формата "Строка", содержащая сформированный в процессе запрос.

# Выполнение хранимой процедуры MSSQL

Пример создания таблицы и заполнение её данными:

CREATE TABLE dbo.tests (session_id INT NOT NULL, group_id INT NOT NULL) ON [PRIMARY]
GO
INSERT INTO dbo.tests VALUES (1, 10)
INSERT INTO dbo.tests VALUES (2, 20)
INSERT INTO dbo.tests VALUES (3, 30)
GO

Пример создания хранимой процедуры:

CREATE PROCEDURE dbo.test @session_id INT, @group_id INT OUTPUT
AS
SET NOCOUNT ON
SELECT TOP 1 @group_id = group_id FROM dbo.tests WHERE session_id = @session_id
IF(@@ROWCOUNT != 1)
BEGIN
 RETURN -1
END
RETURN 1
GO

Пример вызова процедуры из Management Studio:

DECLARE @resultCode INT, @groupId INT
EXEC @resultCode = dbo.test @session_id = 1, @group_id = @groupId OUTPUT
SELECT @resultCode, @groupId

Пример задания конфигурации в процессе Файл:SqlProcedureTest.par:

SqlExecuteStoredProcedure.png



# AssignSwimlaneActionHandler

Позволяет (пере)определить роль в любом месте процесса по заданной конфигурации.

AssignSwimlaneActionHandler.png

Интерфейс инициализатора имеет такой же вид, как и на вкладке редактирования ролей.


# SendEmailActionHandler

Позволяет послать сообщение по e-mail. Сообщением может быть форма задания, если обработчик установлен на узле, а не на переходе. Альтернативным вариантом отправки сообщения является использование бота SendEmailTaskHandler. Формат файла конфигурации для него не отличается от формата конфигурации для SendEmailActionHandler (за исключением контекстной мета-информации).

Для создания конфигурации SendEmailActionHandler используется специальный конфигуратор. Для того, чтобы открыть конфигуратор, необходимо привязать обработчик, выбрав класс ru.runa.wfe.extension.handler.SendEmailActionHandler из списка доступных обработчиков, и начать редактирование конфигурации. Текст файла конфигурации в формате xml можно посмотреть на вкладке "XML" диалогового окна конфигуратора. Для отправки сообщения используется [1], таблицы параметров внутри API пакетов по ссылке.

Замечание: Начиная с версии 4.2, осуществляется гарантированная доставка сообщений с помощью JMS.


Общие настройки

  • Не продолжать выполнение процесса при ошибке отправки. При ошибке обработки конфигурации выполнение процесса не проходит дальше (транзакция откатывается к предыдущей точке).
  • Файл базовых настроек, расположенный на сервере. Здесь можно указать путь к файлу (относительно jboss/standalone/wfe.custom/), который содержит базовые настройки (расположенные на вкладках Соединение с сервером и Реквизиты сообщения) в таком же формате. Это облегчает конфигурирование нескольких обработчиков (общие параметры). Эти параметры имеют меньший приоритет перед заданными в конфигураторе (если заданы).

GpdActionHandler ru6.png


Настройки соединения с сервером

На этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}:

  • Протокол отправки: протокол работы с сервером
  • Адрес сервера: IP адрес или название узла почтового сервера
  • Порт сервера: Порт почтового сервера
  • Использовать аутентификацию: Исходящий почтовый сервер требует проверки подлинности пользователя
  • Режим трассировки: если включить - в логи пишется информация о взаимодействии с почтовым сервером
  • Дополнительные параметры соединения можно задать, исходя из всех возможных в javamail.

GpdActionHandler ru7.png


Настройки реквизитов сообщения

На этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}.

Также можно указать email исполнителя с помощью метода: ${GetExecutorEmails(Согласователь)}, где Согласователь может быть пользователем или группой, в т.ч. ролью.

  • Заголовок: заголовок сообщения
  • Кому: email-адрес для отправки сообщения
  • Копия: email-адрес для отправки копии.

Дополнительные параметры сообщения можно задать, исходя из всех возможных в javamail.

GpdActionHandler ru8.png


Настройки тела сообщения

  • Использовать форму узла-действия: Чек-бокс доступен, если обработчик находится в узле, в этом узле определена форма и эта форма имеет тип FTL (freemarker)
  • Вставить переменную: Ссылка для облегчения вставки значения переменной в текст сообщения. В тексте формы можно использовать полноценный синтаксис freemarker (можно его скопировать из FTL-формы), можно делать inline-вложения рисунков в письме
  • Прикрепленные файлы: позволяет добавлять аттачменты к письму из переменных формата Файл.

GpdActionHandler ru9.png

# Что можно использовать в теле сообщения

В теле сообщения можно использовать все переменные БП по скриптовому названию.

В теле сообщения обработчика также доступны контекстные переменные

Интерактивная форма (${interaction}, ru.runa.wfe.form.Interaction) - только если обработчик помещён на узле-действии:

Использовать проверку в браузере	${interaction.useJSValidation?string("да", "нет")}
Список обязательных переменных		${interaction.requiredVariableNames}
Код формы	 			${interaction.formData} (byte[])

Задание (${task}, ru.runa.wfe.task.Task) - только если обработчик помещён на узле-действии:

ID					${task.id}
ID задания				${task.nodeId}
Название 				${task.name}
Описание 				${task.description}
Название роли    			${task.swimlane.name}
Исполнитель				${task.executor.label}
Дата создания		    		${task.createDate?datetime}
Срок выполнения (deadline)    		${task.deadlineDate?datetime}

Экземпляр процесса (${process}, ru.runa.wfe.execution.Process):

ID					${process.id}
Дата запуска				${process.startDate?datetime}
Дата завершения 			${process.endDate?datetime} (только для асинхронных заданий)
Иерархия подпроцессов			${process.hierarchyIds}

Определение процесса (${process.deployment}, ru.runa.wfe.definition.Deployment):

ID					${process.deployment.id}
Версия					${process.deployment.version}
Название				${process.deployment.name}
Описание				${process.deployment.description}
Категория				${process.deployment.category}
Загружено в систему			${process.deployment.createDate?datetime}
В теле сообщения бота также доступны контекстные переменные

Интерактивная форма (${interaction}, ru.runa.wfe.form.Interaction):

Использовать проверку в браузере	${interaction.useJSValidation?string("да", "нет")}
Список обязательных переменных		${interaction.requiredVariableNames}
Код формы	 			${interaction.formData} (byte[])

Задание (${task}, ru.runa.wfe.task.dto.WfTask):

ID					${task.id}
ID задания				${task.nodeId}
ID процесса				${task.processId}
ID определение процесса			${task.deploymentId}
Название определение процесса		${task.definitionName}
Название 				${task.name}
Описание 				${task.description}
Название роли    			${task.swimlaneName}
Исполнитель				${task.owner.label}
Дата создания		    		${task.creationDate?datetime}
Срок выполнения (deadline)    		${task.deadlineDate?datetime}
Срок выполнения на исходе (90%)		${task.deadlineWarningDate?datetime}

Настройки в XML

Здесь отображается конфигурация как она есть в реальности.

GpdActionHandler ru10.png


Кнопки

  • Отправить тестовое письмо: отправка письма в соответствии с указанными параметрами, непосредственно из Среды разработки. Обратите внимание, что при задании настроек соединения в Файле базовых настроек тестовое сообщение отправлено не будет.
  • Копировать: копирование конфигурации в буфер обмена (как Ctrl-C)
  • Ок: сохранение конфигурации
  • Отмена редактирования.


# Пример использования smtp.gmail.com в качестве сервера исходящей почты

Заполните параметры обработчика как показано на рисунке ниже:

EmailActionHandler gmail.png


Использование smtp.gmail.com:465 требует других настроек.

   <param name="mail.transport.protocol" value="smtps"/>
   <param name="mail.host" value="smtp.gmail.com"/>
   <param name="mail.smtps.port" value="465"/>
   <param name="mail.smtps.auth" value="true"/>
   <param name="mail.user" value="***@gmail.com"/>
   <param name="mail.password" value="***"/>
   <param name="mail.smtps.ssl.trust" value="smtp.gmail.com"/>

Если название компьютера содержит неподдерживаемые символы (например, кириллицу), то для отправки команд SMTP HELO, EHLO может помочь параметр.

<param name="mail.smtp.localhost" value="localhost"/>
<param name="mail.smtps.localhost" value="localhost"/>

# Установка сертификата в хранилище

Если вы не используете настройку {mail.smtp.ssl.trust, mail.smtps.ssl.trust} - то необходимо импортировать сертификат сервера в хранилище ключей для устранения ошибки

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Для получения сертификата используйте пакет OpenSSL:

openssl s_client -connect smtp.gmail.com:587 -starttls smtp > mail-smtp.cer


EmailActionHandler openssl1.png


Откройте сформированный mail-smtp.cer и удалите всё, что до -----BEGIN CERTIFICATE----- и после -----END CERTIFICATE-----, сохраните изменения.


EmailActionHandler openssl2.png


Скопируйте полученный сертификат в JAVA_HOME.

Перейдите в JAVA_HOME и выполните

C:\Program Files (x86)\Java\jdk1.7.0_01>keytool -import -alias smtp.gmail.com -file mail-smtp.cer -keystore .\jre\lib\security\jssecacerts


EmailActionHandler cert.png


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


# ActorNameActionHandler (!)

Замечание: ActorNameActionHandler к использованию не рекомендуется и в данное время недоступен через интерфейсы DS, Симулятора и Runa-WEB4.0.0+. Используйте обработчик GetExecutorInfoHandler.

ActorNameActionHandler позволяет добавить в переменные процесса логин или полное имя сотрудника по коду или по логину. Для настройки параметров обработчика используется форма.

Process-editor User guide ru 49e.png

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

  • name - логин сотрудника
  • full name - полное имя сотрудника.

И указать название переменной, в которую будет записан результат работы обработчика.


# BotInvokerActionHandler

Осуществляет одноразовую активацию бот-станции. Конфигурация содержит адрес сервера бот-станции. В случае не указания конфигурации делается вызов на локальной машине.

# EscalationActionHandler

Выполняет эскалацию (расширение круга исполнителей задачи). Конфигурация содержит полное название класса орг. функции, которая будет использоваться для получения новых исполнителей задачи.

# AddObjectToListActionHandler

Добавляет переменную в список.

# RemoveObjectFromListActionHandler

Удаляет переменную из списка.

# CreateOptionActionHandler

Создает опцию (ru.runa.wf.web.Option) (может быть использована в элементе формы множественный выбор).

# Обработчики Excel/Word

Сюда входят обработчики, предназначенные для работы с XLSX и DOCX файлами. Данные обработчики построены на основе библиотеки Apache POI.

Apache POI — это библиотека на языке Java для чтения и записи документов,таких как Excel, PowerPoint и Word.

Для чтения данных из XLSX-файлов используется обработчик office.excel.handler.ExcelReadHandler, для записи - office.excel.handler.ExcelSaveHandler. Для работы с файлами DOCX используется обработчик office.doc.DocxHandler.

ExcelReadHandler

Класс: office.excel.handler.ExcelReadHandler.

Позволяет выполнять чтение данных из XLSX файлов. Для настройки параметров обработчика используется следующая форма:

Excel read pic1 1.png

“Входной файл” – здесь задается полный путь к файлу либо файловая переменная, указывающая на данный файл, например:

Excel read pic2.png

Excel read pic3.png


“Добавить ячейку” – добавляет параметры для чтения данных из отдельной ячейки:

1) “Переменная” – в которую будет считано значение из ячейки

2) “Страница” – имя или номер страницы, на которой расположена ячейка

3) “Столбец/Строка” – адрес ячейки (нумерация с 1 до 999999999).


“Добавить горизонтально”/ “Добавить вертикально” – добавляет параметры для чтения массивов данных по горизонтали и вертикали соответственно:

1) “Переменная” – переменная массив формата "Список", в который будет считаны данные

2) “Страница” – так же как и в случае отдельной ячейки, данный параметр задает имя или номер (нумерация с 1) страницы, на которой расположены считываемые данные

3) “Начальный столбец”/“Строка”, “Столбец/Начальная строка” – адрес ячейки, начиная с которой необходимо считывать массив данных (по горизонтали – строка, по вертикали - столбец), нумерация также начинается с “1”.

Например:

Excel read pic4 1.png

Обработчик будет выполнять чтение файла “ввод.xls”, находящегося по адресу \\SRV\nfsshared\ .

Будет считано значение в переменную “Ячейка1” из отдельной ячейки, находящейся на странице с именем “Лист5” по адресу столбец 2, строка 1.

Excel read pic5.png

Будет считан массив “список1”, в который попадут значения из строки 3, начиная со столбца 1. Страница задана по номеру – 1.

Excel read pic6.png

Будет считан массив “список2”, в который попадут значения из столбца 7, начиная со строки 4. Страница – “Sheet1”.

Excel read pic7.png

Также конфигурацию обработчика можно задать и в виде xml, например:

Excel read pic8 1.png

ExcelSaveHandler

Класс: office.excel.handler.ExcelSaveHandler.

Используется для записи данных в файл XLSX, имеет форму для конфигурирования параметров:

Excel save pic1.png

Описание параметров:

“Входной файл” – представляет собой шаблон документа, на основе которого будет создан выходной файл. Данный параметр можно задать как с помощью файловой переменной или полного пути к файлу, так и создать шаблон непосредственно в бизнес-процессе или же импортировать шаблон в бизнес-процесс.

Например, если шаблон имеет следующий вид:

Excel save pic2.png

то результат будет содержать:

Excel save pic3.png

“Выходной файл” – результирующий файл, в который будут записаны данные. Здесь отдельно задается имя файла и путь, но можно также использовать файловую переменную, например:

Excel save pic4.png

Ссылки “Добавить ячейку”, “Добавить горизонтально”, “Добавить вертикально” – добавляют параметры для записи переменной в отдельную ячейку, массива в область по горизонтали и массива в область по вертикали соответственно. Параметры и возможные значения такие же как и в конфигураторе для обработчика excel.handlers.ReadHandler.

Например:

Excel save pic5 1.png

Excel save pic6 1.png

В качестве входного файла (шаблона) задан файл c:/in/sample.xls, на основе его будет создан выходной файл c:/out/Result.xls, на страницу Sheet1 которого запишутся:

  • переменная “Ячейка1” по адресу столбец 1: строка 1

Excel save pic7.png

  • массив “список1” (столбец 2: начальная строка 1):

Excel save pic8.png


  • массив “список2” (начальный столбец 3: строка 1)

Excel save pic9.png

DocxHandler

Класс: office.doc.DocxHandler.

Данный обработчик предназначен для работы с файлами DOCX на основе шаблона (подробнее смотрите Описание синтаксиса шаблонов).

Конфигуратор обработчика имеет следующий вид:

Docx descr pic1 1.png

  • “Входной файл” – файл шаблона, на основе которого формируется выходной DOCX-файл. Задается с помощью файловой переменной или полного пути к файлу. Также существует возможность создать/импортировать файл шаблона непосредственно в бизнес-процесс
  • “Выходной файл” – здесь вводится “Имя файла” и “Каталог”, в котором необходимо создать DOCX-файл. Но также, как и в случае входного файла, можно использовать и файловую переменную
  • “Выдавать ошибку в случае несоответствия шаблона” – при установке данного параметра будет производится проверка входного файла (шаблона) на соответствие с конфигурацией. В случае отсутствия каких-либо переменных или несоответствия имен в ходе выполнения данного обработчика – будет выдаваться ошибка и выходной файл сформирован не будет.


# CreateCalendarHandler (!)

Замечание: CreateCalendarHandler к использованию не рекомендуется и в данное время недоступен через интерфейсы DS, Симулятора и Runa-WEB.

CreateCalendarHandler - создать переменную даты.

Класс: ru.runa.wfe.extension.handler.var.CreateCalendarHandler.

Проводит операции с переменной формата Дата и Время: установление или добавление времени. В конфигурации в качестве числа можно указать целочисленную переменную в формате ${переменная}. Для операции добавления разрешается использовать рабочее время с учетом бизнес-календаря.


# AddReadProcessPermissionsHandler

AddReadProcessPermissionsHandler - добавить права на чтение процесса.

Класс: ru.runa.wfe.extension.handler.process.AddReadProcessPermissionsHandler .

Добавляет полномочия на чтение текущего экземпляра процесса указанным исполнителям.

Параметры

Название Тип Примечание
Исполнители Один или несколько исполнителей (организованные в списке) В случае, если полномочия уже имеются - ничего не происходит.

В случае, если переменная не проинициализирована - ничего не происходит.


Замечания (Николай Васильев)

  1. По обработчику GroovyActionHandler:
    1) Пока его не трогаем. Ждём, когда разработчики наведут в нём порядок.
    2) Из описания не понятно, как использовать этот обработчик
    3) Замечание и последний абзац двусмысленны и не понятно, какой смысл они несут
    4) Я создал простейший процесс с узлом-сценарием, поместил в обработчик приведённый в разделе скрипт, запустил процесс в Симуляторе. Выдана ошибка. Мб, лучше предоставить обучаемому работающий скрипт? Пусть человек увидит один из вариантов исправной работы. Иначе как он разберётся с его использованием?
    5) Необходимо снабдить раздел подробным описанием работы обработчика на приведённом примере. Иначе в данном объёме описание почти бесполезно. Раздел ExecuteFormulaActionHandler имеет пространное описание неплохого качества. Пректрасный пример для подражания!
    6) Необходима ссылка на документ, объясняющий как отыскать и интерпретировать ошибку при выполнении.
  2. Для обработчика FormulaActionHandler функции общего применения я проверил: 3 ошибки описаны в тикете rm3800. Необходимо проверить остальные функции.
  3. Для обработчика SQLActionHandler необходимо все примеры прогнать на реальном SQL-сервере.
  4. Обработчик ActorNameActionHandler в DS и на сервисах отсутствует!
  5. Обработчик CreateCalendarHandler в DS и на сервисах отсутствует!