Handlers: различия между версиями

Материал из RunaWFE
Перейти к навигации Перейти к поиску
 
(не показано 89 промежуточных версий этого же участника)
Строка 26: Строка 26:
Конфигурацией является корректный код Groovy ([[GroovySupport|подробнее]]), который по синтаксису идентичен Java.
Конфигурацией является корректный код Groovy ([[GroovySupport|подробнее]]), который по синтаксису идентичен Java.


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


Строка 33: Строка 33:
Удаление временных групп выполняется с учетом значений параметров [[ServerConfigurationGuide#timertask.period.millis.remove.temp.groups|timertask.period.millis.remove.temp.groups]], [[ServerConfigurationGuide#timertask.start.millis.remove.temp.groups|timertask.start.millis.remove.temp.groups]].  
Удаление временных групп выполняется с учетом значений параметров [[ServerConfigurationGuide#timertask.period.millis.remove.temp.groups|timertask.period.millis.remove.temp.groups]], [[ServerConfigurationGuide#timertask.start.millis.remove.temp.groups|timertask.start.millis.remove.temp.groups]].  


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


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


[[Image:GpdActionHandler_ru4.png]]
[[Image:GpdActionHandler_ru4.png]]




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


[[Image:GpdActionHandler_ru5.png]]
[[Image:GpdActionHandler_ru5.png]]
Строка 48: Строка 50:
<nowiki>В выражении могут использоваться операции: +, -, *, /, <, <=, ==, !=, >, >=, &, |, ^. </nowiki>
<nowiki>В выражении могут использоваться операции: +, -, *, /, <, <=, ==, !=, >, >=, &, |, ^. </nowiki>


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




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


Например, функции могут быть такими: date(дата), time(дата) и hours_round_up(число)


* date(дата) округляет дату до целого числа дней, отбрасывая время.
Помимо переменных могут использоваться непосредственные значения форматов Long, Double, Boolean, String, Date и функции.
* time(дата) отбрасывает дни, оставляя только время.
* hours_round_up(число) округляет время, заданное в минутах, до часов в верхнюю сторону.
* round(число) или round(число, количество знаков после запятой) округляет число, оставляю фиксированное количество знаков после запятой.
* round_up(число) или round_up(число, количество знаков после запятой) округляет число в верхнюю сторону.
* round_down(число) или round_down(число, количество знаков после запятой) округляет число в нижнюю сторону.
* number_to_string_ru(число) переводит число в строку на русском языке.
* number_to_string_ru(число, п2, п3, п4, п5) переводит число с зависимым словом в строку на русском языке.


п2 — 'M' или 'F' — мужской/женский род зависимого слова.
===Функции общего применения===
п3, п4, п5 — зависимое слово в трех формах (например:день, дня, дней).
Например, функции могут быть такими:  


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


Где:
п2 — 'M' или 'F' — мужской/женский род зависимого слова
п3, п4, п5 — зависимое слово в трех формах (например:день, дня, дней).


Например:
''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()
Функция для работы с ФИО:
Функция FIO_case_ru(String fio, int caseNumber, String mode)fio - фамилия, имя и отчество в именительно падеже через пробел


caseNumber - номер падежа (от 1 до 6)
Пример присваивания значений переменным:
''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()


mode - строка форматирования


Символы F, I и O заменяются на фамилию, имя или отчество в соответствующем падеже.
===Функция для работы с ФИО===
* FIO_case_ru(String fio, int caseNumber, String mode)
Где:
fio - фамилия, имя и отчество в именительном падеже через пробел
caseNumber - номер падежа (от 1 до 6)
mode - строка форматирования.  


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




Примеры использования:  
Примеры использования:  
 
FIO_case_ru("Иванов Иван Иванович", 1, "F I O :)")   //Иванов Иван Иванович :)  
 
FIO_case_ru("Иванова Ира Ивановна", 2, "F I o")       //Ивановой Иры И.  
FIO_case_ru("Иванов Иван Иванович", 1, "F I O :)") Иванов Иван Иванович :)  
FIO_case_ru("Иванов Иван Иванович", 3, "F i O")       //Иванову И. Ивановичу  
 
FIO_case_ru("Иванова Ира Ивановна", 4, "F i o")       //Иванову И. И.  
FIO_case_ru("Иванова Ира Ивановна", 2, "F I o") Ивановой Иры И.  
FIO_case_ru("Иванов Иван Иванович", 5, "f I O")       //И. Иваном Ивановичем  
 
FIO_case_ru("Иванова Ира Ивановна", 6, "о I o")       //о Ире И.  
FIO_case_ru("Иванов Иван Иванович", 3, "F i O") Иванову И. Ивановичу  
FIO_case_ru("Апырвапыркина Фыва Няковна", 5, "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") Апырвапыркиной Фывой Няковной




Строка 141: Строка 120:


Формат файла:
Формат файла:
  <?xml version=”1.0”>
  <?xml version=”1.0”>
  <nameCaseConf>
  <nameCaseConf>
Строка 157: Строка 134:
       …
       …
   </name>
   </name>
   <name value = “отчество в именительном падеже”>
   <parent value = “отчество в именительном падеже”>
     <rule case = “номер падежа”>правильный вариант отчества</rule>
     <rule case = “номер падежа”>правильный вариант отчества</rule>
       …
       …
Строка 166: Строка 143:


Пример файла конфигурации:
Пример файла конфигурации:
  <?xml version="1.0" encoding="UTF-8"?>
  <?xml version="1.0" encoding="UTF-8"?>
  <nameCaseConf>
  <nameCaseConf>
Строка 184: Строка 159:




В версии RunaWFE 4.3.0, в обработчик ExecuteFormula была добавлена возможность склонения на основе файла с данными. Создайте файл '''mappingConf.xml''' и расположите его в директории '''..\standalone\wfe.custom''' (если директория wfe.custom не существует, то создать). Например, для Windows версии RunaWFE, файл должен быть помещен в '''C:\Program Files\RunaWFE\Simulation\standalone\wfe.custom\'''}
В версии 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"?>
  <?xml version="1.0" encoding="UTF-8"?>
  <mappingConf>
  <mappingConf>
Строка 198: Строка 172:
  </mappingConf>
  </mappingConf>


После этого в конфигурации обработчика можно будет использовать следующую конструкцию для склонения
После этого в конфигурации обработчика можно будет использовать следующую конструкцию для склонения:
 
  some_variable = mapping("Бухгалтер", "должность в дательном падеже")
  some_variable = mapping("Бухгалтер", "должность в дательном падеже")


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


== {{Title|SQLActionHandler|SQLActionHandler}} ==
== {{Title|SQLActionHandler|SQLActionHandler}} ==
Используется для взаимодействия с БД.
Используется для взаимодействия с БД.


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


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


[[Image:Process-editor_User_guide_ru_49d2.png]]
[[Image:Process-editor_User_guide_ru_49d2.png]]




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


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


SQL запрос собственно сам запрос (в формате java.sql.PreparedStatement).
SQL-запрос собственно сам запрос (в формате java.sql.PreparedStatement).
{{Note|В версии RunaWFE 4.4.1 писать SQL запрос стало значительно удобнее - запрос теперь может располагаться не на одной строке, также была введена подсветка синтаксиса SQL}}
{{Note|В версии RunaWFE 4.4.1 писать SQL запрос стало значительно удобнее запрос теперь может занимать более одной строки; также была введена подсветка синтаксиса SQL}}


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


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


=== {{Title|SQLActionHandlerExecuteStoredProcedure|Выполнение хранимой процедуры MSSQL}} ===
=== {{Title|SQLActionHandlerExecuteStoredProcedure|Выполнение хранимой процедуры MSSQL}} ===


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


  CREATE TABLE dbo.tests (session_id INT NOT NULL, group_id INT NOT NULL) ON [PRIMARY]
  CREATE TABLE dbo.tests (session_id INT NOT NULL, group_id INT NOT NULL) ON [PRIMARY]
Строка 262: Строка 222:
  GO
  GO


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


  CREATE PROCEDURE dbo.test @session_id INT, @group_id INT OUTPUT
  CREATE PROCEDURE dbo.test @session_id INT, @group_id INT OUTPUT
Строка 275: Строка 235:
  GO
  GO


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


  DECLARE @resultCode INT, @groupId INT
  DECLARE @resultCode INT, @groupId INT
Строка 281: Строка 241:
  SELECT @resultCode, @groupId
  SELECT @resultCode, @groupId


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


[[Файл:sqlExecuteStoredProcedure.png]]
[[Файл:sqlExecuteStoredProcedure.png]]
<BR>
<BR>


== {{Title|AssignSwimlane|AssignSwimlaneActionHandler}} ==
== {{Title|AssignSwimlane|AssignSwimlaneActionHandler}} ==


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


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


Для создании конфигурации '''SendEmailActionHandler''' используется специальный конфигуратор. Для того, чтобы открыть конфигуратор необходимо создать обработчик, выбрав класс '''ru.runa.wfe.extension.handler.SendEmailActionHandler''' из списка доступных обработчиков и начать редактирование конфигурации. Текст файла конфигурации в формате xml можно посмотреть на вкладке "XML" диалогового окна конфигуратора. Для отправки сообщения используется [http://javamail.kenai.com/nonav/javadocs/ JavaMail], таблицы параметров внутри API пакетов по ссылке).
Для создании конфигурации '''SendEmailActionHandler''' используется специальный конфигуратор. Для того, чтобы открыть конфигуратор, необходимо создать обработчик, выбрав класс '''ru.runa.wfe.extension.handler.SendEmailActionHandler''' из списка доступных обработчиков, и начать редактирование конфигурации. Текст файла конфигурации в формате xml можно посмотреть на вкладке "XML" диалогового окна конфигуратора. Для отправки сообщения используется [http://javamail.kenai.com/nonav/javadocs/ JavaMail], таблицы параметров внутри API пакетов по ссылке.


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


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


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


[[Image:GpdActionHandler_ru6.png]]
[[Image:GpdActionHandler_ru6.png]]
<BR>


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


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


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


[[Image:GpdActionHandler_ru7.png]]
[[Image:GpdActionHandler_ru7.png]]
<BR>


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


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


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


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


[[Image:GpdActionHandler_ru8.png]]
[[Image:GpdActionHandler_ru8.png]]
<BR>


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


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


[[Image:GpdActionHandler_ru9.png]]
[[Image:GpdActionHandler_ru9.png]]
Строка 347: Строка 320:
===== В теле сообщения обработчика также доступны контекстные переменные =====
===== В теле сообщения обработчика также доступны контекстные переменные =====


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


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


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


  ID ${task.id}
  ID ${task.id}
Строка 363: Строка 336:
  Дата создания     ${task.createDate?datetime}
  Дата создания     ${task.createDate?datetime}
  Срок выполнения (deadline)    ${task.deadlineDate?datetime}
  Срок выполнения (deadline)    ${task.deadlineDate?datetime}
 
'''Экземпляр процесса''' (${process}, ru.runa.wfe.execution.Process)
'''Экземпляр процесса''' (${process}, ru.runa.wfe.execution.Process):


  ID ${process.id}
  ID ${process.id}
Строка 371: Строка 344:
  Иерархия подпроцессов ${process.hierarchyIds}
  Иерархия подпроцессов ${process.hierarchyIds}


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


  ID ${process.deployment.id}
  ID ${process.deployment.id}
Строка 382: Строка 355:
===== В теле сообщения бота также доступны контекстные переменные =====
===== В теле сообщения бота также доступны контекстные переменные =====


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


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


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


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


=== Настройки в XML ===
=== Настройки в XML ===
Строка 408: Строка 381:


[[Image:GpdActionHandler_ru10.png]]
[[Image:GpdActionHandler_ru10.png]]
<BR>


=== Кнопки ===
=== Кнопки ===
Строка 414: Строка 389:
* '''Копировать''': копирование конфигурации в буфер обмена (как Ctrl-C)
* '''Копировать''': копирование конфигурации в буфер обмена (как Ctrl-C)
* '''Ок''':  сохранение конфигурации
* '''Ок''':  сохранение конфигурации
* '''Отмена''' редактирования
* '''Отмена''' редактирования.
 


<BR>


=== {{Title|SendEmailGmailExample|Пример использования smtp.gmail.com в качестве сервера исходящей почты}} ===
=== {{Title|SendEmailGmailExample|Пример использования smtp.gmail.com в качестве сервера исходящей почты}} ===
Строка 435: Строка 410:
     <param name="mail.smtps.ssl.trust" value="smtp.gmail.com"/>
     <param name="mail.smtps.ssl.trust" value="smtp.gmail.com"/>


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


  <param name="mail.smtp.localhost" value="localhost"/>
  <param name="mail.smtp.localhost" value="localhost"/>
Строка 454: Строка 429:




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




[[Image:EmailActionHandler_openssl2.png]]
[[Image:EmailActionHandler_openssl2.png]]


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


Перейти в JAVA_HOME и выполните
Скопируйте полученный сертификат в 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
  C:\Program Files (x86)\Java\jdk1.7.0_01>keytool -import -alias smtp.gmail.com -file mail-smtp.cer -keystore .\jre\lib\security\jssecacerts
Строка 469: Строка 445:




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


=={{Title|ActorNameActionHandler|ActorNameActionHandler (не рекомендуется к использованию {{Since|4.0.0}}, используйте GetExecutorInfoHandler)}}==
=={{Title|ActorNameActionHandler|ActorNameActionHandler (не рекомендуется к использованию {{Since|4.0.0}}, используйте GetExecutorInfoHandler)}}==
Строка 483: Строка 461:
* name - логин сотрудника
* name - логин сотрудника


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


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


== {{Title|BotInvoker|BotInvokerActionHandler}} ==
== {{Title|BotInvoker|BotInvokerActionHandler}} ==
Строка 511: Строка 491:
== {{Title|ExcelWordHandlers|Обработчики Excel/Word}} ==  
== {{Title|ExcelWordHandlers|Обработчики Excel/Word}} ==  


Сюда входят обработчики, предназначенные для работы с xlsx и docx файлами. Данные обработчики построены на основе библиотеки Apache POI.  
Сюда входят обработчики, предназначенные для работы с '''XLSX''' и '''DOCX''' файлами. Данные обработчики построены на основе библиотеки Apache POI.  
 
Apache POI — это библиотека на языке Java для чтения и записи документов,таких как Excel, PowerPoint и Word.
 
Для чтения данных из xlsx файлов используется обработчик office.excel.handler.ExcelReadHandler, для  записи -  office.excel.handler.ExcelSaveHandler. Для работы с файлами DOCX используется обработчик office.doc.DocxHandler


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


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


=== excel.handler.ExcelReadHandler ===
=== excel.handler.ExcelReadHandler ===


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


[[Image:excel_read_pic1_1.png]]
[[Image:excel_read_pic1_1.png]]


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


[[Image:excel_read_pic2.png]]
[[Image:excel_read_pic2.png]]
Строка 533: Строка 511:




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


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




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


1) “Переменная” – переменная массив формата "Список", в который будет считаны данные
1) “Переменная” – переменная массив формата "Список", в который будет считаны данные
Строка 574: Строка 552:
=== excel.handler.ExcelSaveHandler ===
=== excel.handler.ExcelSaveHandler ===


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


[[Image:excel_save_pic1.png]]
[[Image:excel_save_pic1.png]]
Строка 580: Строка 558:
Описание параметров:
Описание параметров:


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


Например, если шаблон имеет следующий вид:
Например, если шаблон имеет следующий вид:
Строка 590: Строка 568:
[[Image:excel_save_pic3.png]]
[[Image:excel_save_pic3.png]]


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


[[Image:excel_save_pic4.png]]
[[Image:excel_save_pic4.png]]


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


Например:
Например:
Строка 602: Строка 580:
[[Image:excel_save_pic6_1.png]]
[[Image:excel_save_pic6_1.png]]


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


* переменная “Ячейка1” по адресу столбец 1: строка 1
* переменная “Ячейка1” по адресу столбец 1: строка 1
Строка 619: Строка 597:
=== doc.DocxHandler ===
=== doc.DocxHandler ===


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


Конфигуратор обработчика имеет следующий вид:
Конфигуратор обработчика имеет следующий вид:
Строка 627: Строка 603:
[[Image:docx_descr_pic1_1.png]]
[[Image:docx_descr_pic1_1.png]]


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


* “Выходной файл” – здесь вводится “Имя файла”, и “Каталог” в котором необходимо создать docx файл. Но также как и в случае входного файла, можно использовать и файловую переменную  
* '''“Выходной файл”''' – здесь вводится “Имя файла” и “Каталог”, в котором необходимо создать '''DOCX'''-файл. Но также, как и в случае входного файла, можно использовать и файловую переменную  


* “Выдавать ошибку в случае несоответствия шаблона” – при установке данного параметра, будет производится проверка входного файла (шаблона) на соответствие с конфигурацией, в случае отсутствия каких либо переменных или несоответствия имен, в ходе выполнения данного обработчика – будет выдаваться ошибка, и выходной файл сформирован не будет.
* '''“Выдавать ошибку в случае несоответствия шаблона”''' – при установке данного параметра будет производится проверка входного файла (шаблона) на соответствие с конфигурацией. В случае отсутствия каких-либо переменных или несоответствия имен в ходе выполнения данного обработчика – будет выдаваться ошибка и выходной файл сформирован не будет.
 
<BR>


== {{Title|CreateCalendarHandler|Создать переменную даты}} ==  
== {{Title|CreateCalendarHandler|Создать переменную даты}} ==  
Класс: '''ru.runa.wfe.extension.handler.var.CreateCalendarHandler'''
Класс: '''ru.runa.wfe.extension.handler.var.CreateCalendarHandler'''


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


== {{Title|AddReadProcessPermissionsHandler|Добавить права на чтение процесса}} ==
== {{Title|AddReadProcessPermissionsHandler|Добавить права на чтение процесса}} ==
Класс: '''ru.runa.wfe.extension.handler.process.AddReadProcessPermissionsHandler'''
Класс: '''ru.runa.wfe.extension.handler.process.AddReadProcessPermissionsHandler''' .


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


{| class="prettytable" border="1"  
{| class="prettytable" border="1"  
| '''название'''
| '''Название'''
| '''тип'''
| '''Тип'''
| '''примечание'''
| '''Примечание'''


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


|}
|}
<BR>


[[Категория:Документация]]
[[Категория:Документация]]


 
== Замечания (Николай Васильев) ==
== Замечания ==
# По обработчику GroovyActionHandler: <BR> 1) Из описания не понятно, как использовать этот обработчик <BR> 2) Замечание и последний абзац двусмысленны и не понятно, какой смысл они несут <BR> 3) Я создал простейший процесс с узлом-сценарием, поместил в обработчик приведённый в разделе скрипт, запустил процесс в Симуляторе. Выдана ошибка. Мб, лучше предоставить обучаемому работающий скрипт? Пусть человек увидит один из вариантов исправной работы. Иначе как он разберётся с его использованием? <BR> 4) Необходимо снабдить раздел подробным описанием работы обработчика на приведённом примере. Иначе в данном объёме описание почти бесполезно. Раздел ExecuteFormulaActionHandler имеет пространное описание неплохого качества. Пректрасный пример для подражания! <BR> 5) Необходима ссылка на документ, объясняющий как отыскать и интерпретировать ошибку при выполнении.
# По обработчику GroovyActionHandler: <BR> 1) Из описания не понятно, как использовать этот обработчик <BR>2) Замечание и последний абзац двусмысленны и не понятно, какой смысл они несут <BR>3) Я создал простейший процесс с узлом-сценарием, поместил в обработчик приведённый в разделе скрипт, запустил процесс в симуляторе. Выдана ошибка. Мб, лучше предоставить обучаемому работающий скрипт? Пусть человек увидит один из вариантов исправной работы. Иначе как он разберётся с его использованием? 4) Необходимо снабдить раздел подробным описанием работы обработчика на приведённом примере. Иначе в данном объёме описание почти бесполезно. Раздел ExecuteFormulaActionHandler имеет пространное описание неплохого качества. Пректрасный пример для подражания! 5) Необходима ссылка на документ, объясняющий как отыскать и интерпретировать ошибку при выполнении.
# Для обработчика ExecuteFormulaActionHandler после фразы "Например, функции могут быть такими:" желательно также дать ссылку на документ с каталогом используемых функций.

Текущая версия на 20:22, 24 октября 2024

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

Версия 4.6.0

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


# GroovyActionHandler

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

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

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.

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


# ExecuteFormulaActionHandler

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

GpdActionHandler ru4.png


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

GpdActionHandler ru5.png


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

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


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


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

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

Например, функции могут быть такими:

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

Где:

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


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

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()


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

  • 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

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


# SendEmailActionHandler

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

Для создании конфигурации SendEmailActionHandler используется специальный конфигуратор. Для того, чтобы открыть конфигуратор, необходимо создать обработчик, выбрав класс ru.runa.wfe.extension.handler.SendEmailActionHandler из списка доступных обработчиков, и начать редактирование конфигурации. Текст файла конфигурации в формате xml можно посмотреть на вкладке "XML" диалогового окна конфигуратора. Для отправки сообщения используется JavaMail, таблицы параметров внутри 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 (не рекомендуется к использованию 4.0.0+, используйте GetExecutorInfoHandler)

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

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.

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

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

doc.DocxHandler

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

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

Docx descr pic1 1.png

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


# Создать переменную даты

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

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


# Добавить права на чтение процесса

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

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

Параметры

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

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


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

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