Handlers: различия между версиями
| Nvasiliev (обсуждение | вклад) | |||
| (не показано 127 промежуточных версий 2 участников) | |||
| Строка 3: | Строка 3: | ||
| {{Licensing}} | {{Licensing}} | ||
| == Введение == | |||
| * В этом документе описаны только 16 наиболее употребительных обработчиков из 54 поддерживаемых в RunaWFE. Но область применения остальных вполне понятна из мнемоники их названий. Помимо этого интерфейс конфигурации каждого обработчика раскрывает способ обращения к нему и не позволяет совершить многих ошибок.  | |||
| * Обработчики могут быть привязаны как к узлам-сценария, так и к переходам (которые в виде сплошной линии). При необходимости привязки обработчика к переходу надо в выпадающем меню "Вид" поставить галку в строчке "Показать обработчики". В палитре элементов нотации появится значок "шетерёнки", последовательно используя который можно привязать любое количество обработчиков к любому переходу. Если для процесса снять галку "Показать обработчики", то исчезнет как элемент палитры, так и иконки обработчиков на переходах. Но фактически заданные обработчки останутся и сохранят свою функциональность.  | |||
| {| class="wikitable" | |||
| |+ Обработчики, описанные в этом документе | |||
| |- | |||
| ! № !! Обработчик !! Описание | |||
| |- | |||
| | 1 || [[#ActorNameActionHandler|ActorNameActionHandler]] || Получение переменных имени сотрудника | |||
| |- | |||
| | 2 || [[#AddObjectToList|AddObjectToListActionHandler]] || Добавить объект в список | |||
| |- | |||
| | 3 || [[#AddReadProcessPermissionsHandler|AddReadProcessPermissionsHandler]] || Добавить права на чтение процесса | |||
| |- | |||
| | 4 || [[#AssignSwimlane|AssingSwimlaneActionHandler]] || Назначить роль | |||
| |- | |||
| | 5 || [[#BotInvoker|BotInvokerActionHandler]] || Вызвать бот станцию | |||
| |- | |||
| | 6 || [[#CreateCalendarHandler|CreateCalendarHandler]] || Создать переменную даты | |||
| |- | |||
| | 7 || [[#CreateOption|CreateOptionActionHandler]] || Создать опцию для выбора | |||
| |- | |||
| | 8 || [[#DocxHandler|DocxHandler]] || Word: Формирование документа DOCX, используя шаблон | |||
| |- | |||
| | 9 || [[#Escalation|EscalationActionHandler]] || Эскалация | |||
| |- | |||
| | 10 || [[#ExcelReadHandler|ExcelReadHandler]] || Excel: Прочесть данные из файла | |||
| |- | |||
| | 11 || [[#ExcelSaveHandler|ExcelSaveHandler]] || Excel: Сохранить данные в файл | |||
| |- | |||
| | 12 || [[#Formula|FormulaActionHandler]] || Выполнить формулу | |||
| |- | |||
| | 13 || [[#Groovy|GroovyActionHandler]] || Выполнить код Groovy | |||
| |- | |||
| | 14 || [[#RemoveObjectFromList|RemoveObjectFromListActionHandler]] || Удалить объект из списка | |||
| |- | |||
| | 15 || [[#SendEmailActionHandler|SendEmailActionHandler]] || Отправить email | |||
| |- | |||
| | 16 || [[#SQLActionHandler|SQLActionHandler]] || Выполнить запросы SQL | |||
| |} | |||
| {| class="wikitable" | |||
| |+ Обработчики, в этом документе не описанные | |||
| |- | |||
| ! № !! Обработчик !! Описание | |||
| |- | |||
| | 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 || Установить переменную даты в другом БП | |||
| |} | |||
| <BR> | |||
| == {{Title|Groovy|GroovyActionHandler}} == | == {{Title|Groovy|GroovyActionHandler}} == | ||
| Данный  | Данный ActionHandler используется для пересчета значений переменных бизнес процесса. | ||
| Пример конфигурации: | Пример конфигурации: | ||
| Строка 37: | Строка 163: | ||
| <BR> | <BR> | ||
| == {{Title|Formula| | == {{Title|Formula|FormulaActionHandler}} == | ||
| FormulaActionHandler – универсальный ActionHandler, предназначенный для изменения значений переменных бизнес процесса. Для показа работы данного обработчика был разработан демо процесс ExecuteFormulaDemo. Обработчики располагаются в узлах-сценария. При наведении курсора мыши на узел-сценария будет показан обработчик, используемый в его конфигурации. Для редактирования формул необходимо выбрать пункт «Конфигурация» в свойствах обработчика: | |||
| [[Image:GpdActionHandler_ru4.png]] | [[Image:GpdActionHandler_ru4.png]] | ||
| Появится окно, в котором надо задать формулы вида : '''имя модифицируемой переменной' = выражение'': | Появится окно, в котором надо задать формулы вида: '''имя модифицируемой переменной' = выражение'': | ||
| [[Image:GpdActionHandler_ru5.png]] | [[Image:GpdActionHandler_ru5.png]] | ||
| Строка 57: | Строка 183: | ||
| Помимо переменных могут использоваться непосредственные значения форматов Long, Double, Boolean, String, Date и функции. | Помимо переменных могут использоваться непосредственные значения форматов Long, Double, Boolean, String, Date и функции. | ||
| Пример присваивания значений переменным | ===Пример присваивания значений переменным=== | ||
|   ''variable1 = 2'' |   ''variable1 = 2'' | ||
|   ''variable2 = 3.1415926535'' |   ''variable2 = 3.1415926535'' | ||
| Строка 92: | Строка 199: | ||
|   "дата и время" = current_date_time() |   "дата и время" = current_date_time() | ||
| ===Функции, поддерживаемые в RunaWFE=== | |||
| RunaWFE поддерживает 22 функции. Некоторые из них могут иметь несколько форматов вызова. Формат вызова функции определяется количеством используемых аргументов.  | |||
| {| class="wikitable" | |||
| |+ Полный перечень функций | |||
| |- | |||
| !  !! Функциональность | |||
| |- | |||
| | 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_case_ru(String fio, int caseNumber, String mode) | ||
| Где: | Где: | ||
| Строка 102: | Строка 281: | ||
| Правила использования символов форматирования:   | Правила использования символов форматирования:   | ||
| * Символы F, I и O заменяются на фамилию, имя или отчество в соответствующем падеже   | * Символы F, I и O заменяются на фамилию, имя или отчество в соответствующем падеже   | ||
| * Символы f, i и o заменяются на первую букву фамилии, имени или отчества   | * Символы f, i и o заменяются на первую букву фамилии, имени или отчества и дополняются точкой  | ||
| * Все другие символы транслируются в выходную строку без изменений.   | * Все другие символы транслируются в выходную строку без изменений.   | ||
| Строка 176: | Строка 355: | ||
| ===Функции для работы со списками===   | ===Функции для работы со списками===   | ||
| * ListToString(list1) соединяет список в одну строку | * ListToString(list1) - соединяет список в одну строку; можно указать опциональный 2-й аргумент - разделитель подстрок; если разделитель подстрок не задан, то разделителем по умолчанию буде пробел   | ||
| * GetListMatchedIndexes(Список1, Аргумент2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, во втором аргументе (может быть списком или объектом другого простого формата) существует совпадающий с ним элемент в любой позиции   | * GetListMatchedIndexes(Список1, Аргумент2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, во втором аргументе (может быть списком или объектом другого простого формата) существует совпадающий с ним элемент в любой позиции   | ||
| * GetListMismatchedIndexes(Список1, Список2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, в списке Список2 не существует совпадающего с ним элемента   | * GetListMismatchedIndexes(Список1, Список2) возвращает список СписокПозиций, содержащий целые числа, представляющие собой номера позиций в Список1 таких, что для каждого элемента из Список1, позиция которого содержится в списке СписокПозиций, в списке Список2 не существует совпадающего с ним элемента   | ||
| Строка 243: | Строка 422: | ||
| Пример задания конфигурации в процессе [[Файл:sqlProcedureTest.par]]: | Пример задания конфигурации в процессе [[Файл:sqlProcedureTest.par]]: | ||
| [[Файл: | [[Файл:SqlExecuteStoredProcedure.png|900px|центр]] | ||
| <BR> | <BR> | ||
| Строка 251: | Строка 430: | ||
| Позволяет (пере)определить роль в любом месте процесса по заданной конфигурации. | Позволяет (пере)определить роль в любом месте процесса по заданной конфигурации. | ||
| [[Файл:AssignSwimlaneActionHandler.png|центр]] | |||
| Интерфейс инициализатора имеет такой же вид, как и на вкладке редактирования ролей. | |||
| <BR> | <BR> | ||
| <BR> | <BR> | ||
| == {{Title| | == {{Title|SendEmailActionHandler|SendEmailActionHandler}} == | ||
| Позволяет послать сообщение по 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 пакетов по ссылке. | ||
| Начиная с версии 4.2 осуществляется гарантированная доставка сообщений с помощью JMS. | '''Замечание:''' Начиная с версии 4.2, осуществляется гарантированная доставка сообщений с помощью JMS. | ||
| <BR> | <BR> | ||
| Строка 336: | Строка 518: | ||
|   Дата создания		    		${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):   | ||
| Строка 389: | Строка 571: | ||
| * '''Копировать''': копирование конфигурации в буфер обмена (как Ctrl-C) | * '''Копировать''': копирование конфигурации в буфер обмена (как Ctrl-C) | ||
| * '''Ок''':  сохранение конфигурации | * '''Ок''':  сохранение конфигурации | ||
| * '''Отмена''' редактирования | * '''Отмена''' редактирования. | ||
| <BR> | |||
| === {{Title|SendEmailGmailExample|Пример использования smtp.gmail.com в качестве сервера исходящей почты}} === | === {{Title|SendEmailGmailExample|Пример использования smtp.gmail.com в качестве сервера исходящей почты}} === | ||
| Строка 410: | Строка 592: | ||
|      <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"/> | ||
| Строка 429: | Строка 611: | ||
| Откройте сформированный '''mail-smtp.cer''' и удалите  | Откройте сформированный '''mail-smtp.cer''' и удалите всё, что до -----BEGIN CERTIFICATE----- и после -----END CERTIFICATE-----, сохраните изменения. | ||
| [[Image:EmailActionHandler_openssl2.png]] | [[Image: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 |   C:\Program Files (x86)\Java\jdk1.7.0_01>keytool -import -alias smtp.gmail.com -file mail-smtp.cer -keystore .\jre\lib\security\jssecacerts | ||
| Строка 444: | Строка 627: | ||
| Будет выполнен импорт сертификата в хранилище ключей,  | Будет выполнен импорт сертификата в хранилище ключей, потребуется перезапуск приложения. | ||
| <BR> | |||
| =={{Title|ActorNameActionHandler|ActorNameActionHandler (!)}}== | |||
| '''Замечание:''' ActorNameActionHandler к использованию не рекомендуется и в данное время недоступен через интерфейсы DS, Симулятора и Runa-WEB{{Since|4.0.0}}. Используйте обработчик GetExecutorInfoHandler.  | |||
| ActorNameActionHandler позволяет добавить в переменные процесса логин или полное имя сотрудника по коду или по логину. | |||
| Для настройки параметров обработчика используется форма. | Для настройки параметров обработчика используется форма. | ||
| Строка 458: | Строка 644: | ||
| * name - логин сотрудника | * name - логин сотрудника | ||
| * full name - полное имя сотрудника | * full name - полное имя сотрудника.  | ||
| И указать название переменной, в которую будет записан результат работы обработчика. | И указать название переменной, в которую будет записан результат работы обработчика. | ||
| <BR> | |||
| == {{Title|BotInvoker|BotInvokerActionHandler}} == | == {{Title|BotInvoker|BotInvokerActionHandler}} == | ||
| Строка 486: | Строка 674: | ||
| == {{Title|ExcelWordHandlers|Обработчики Excel/Word}} ==   | == {{Title|ExcelWordHandlers|Обработчики Excel/Word}} ==   | ||
| Сюда входят обработчики, предназначенные для работы с  | Сюда входят обработчики, предназначенные для работы с '''XLSX''' и '''DOCX''' файлами. Данные обработчики построены на основе библиотеки Apache POI.   | ||
| Apache POI — это библиотека на языке Java для чтения и записи документов,таких как Excel, PowerPoint и Word.   | Apache POI — это библиотека на языке Java для чтения и записи документов,таких как '''Excel''', '''PowerPoint''' и '''Word'''.   | ||
| Для чтения данных из  | Для чтения данных из '''XLSX'''-файлов используется обработчик '''office.excel.handler.ExcelReadHandler''', для  записи -  '''office.excel.handler.ExcelSaveHandler'''. Для работы с файлами '''DOCX''' используется обработчик '''office.doc.DocxHandler'''.  | ||
| === <span id="ExcelReadHandler"></span>ExcelReadHandler === | |||
| Класс: '''office.excel.handler.ExcelReadHandler'''. | |||
| Позволяет выполнять чтение данных из '''XLSX''' файлов. | |||
| Позволяет выполнять чтение данных из  | |||
| Для настройки параметров обработчика используется следующая форма: | Для настройки параметров обработчика используется следующая форма: | ||
| [[Image:excel_read_pic1_1.png]] | [[Image:excel_read_pic1_1.png]] | ||
| “Входной файл” – здесь задается полный путь к файлу | '''“Входной файл”''' – здесь задается полный путь к файлу либо файловая переменная, указывающая на данный файл, например: | ||
| [[Image:excel_read_pic2.png]] | [[Image:excel_read_pic2.png]] | ||
| Строка 508: | Строка 696: | ||
| “Добавить ячейку” – добавляет параметры для чтения данных из отдельной ячейки: | '''“Добавить ячейку”''' – добавляет параметры для чтения данных из отдельной ячейки: | ||
| 1) “Переменная” – в которую будет считано значение из ячейки   | 1) “Переменная” – в которую будет считано значение из ячейки   | ||
| Строка 517: | Строка 705: | ||
| “Добавить горизонтально”/ “Добавить вертикально” – добавляет параметры для чтения массивов данных по горизонтали и вертикали соответственно: | '''“Добавить горизонтально”/ “Добавить вертикально”''' – добавляет параметры для чтения массивов данных по горизонтали и вертикали соответственно: | ||
| 1) “Переменная” – переменная массив формата "Список", в который будет считаны данные | 1) “Переменная” – переменная массив формата "Список", в который будет считаны данные | ||
| Строка 547: | Строка 735: | ||
| [[Image:excel_read_pic8_1.png]] | [[Image:excel_read_pic8_1.png]] | ||
| ===  | === <span id="ExcelSaveHandler"></span>ExcelSaveHandler === | ||
| Используется для записи данных в файл  | Класс: '''office.excel.handler.ExcelSaveHandler'''. | ||
| Используется для записи данных в файл '''XLSX''', имеет форму для конфигурирования параметров: | |||
| [[Image:excel_save_pic1.png]] | [[Image:excel_save_pic1.png]] | ||
| Строка 555: | Строка 745: | ||
| Описание параметров: | Описание параметров: | ||
| “Входной файл” – представляет собой шаблон документа, на основе которого будет создан выходной файл. Данный параметр можно задать как с помощью файловой переменной или полного пути к файлу, так и создать шаблон непосредственно в бизнес-процессе или импортировать шаблон в бизнес-процесс. | '''“Входной файл”''' – представляет собой шаблон документа, на основе которого будет создан выходной файл. Данный параметр можно задать как с помощью файловой переменной или полного пути к файлу, так и создать шаблон непосредственно в бизнес-процессе или же импортировать шаблон в бизнес-процесс. | ||
| Например, если шаблон имеет следующий вид: | Например, если шаблон имеет следующий вид: | ||
| Строка 565: | Строка 755: | ||
| [[Image:excel_save_pic3.png]] | [[Image:excel_save_pic3.png]] | ||
| “Выходной файл” – результирующий файл, в который будут записаны данные. Здесь отдельно задается имя файла и путь, но можно также использовать файловую переменную, например: | '''“Выходной файл”''' – результирующий файл, в который будут записаны данные. Здесь отдельно задается имя файла и путь, но можно также использовать файловую переменную, например: | ||
| [[Image:excel_save_pic4.png]] | [[Image:excel_save_pic4.png]] | ||
| “Добавить ячейку”, “Добавить горизонтально”, “Добавить вертикально” –  | Ссылки '''“Добавить ячейку”''', '''“Добавить горизонтально”''', '''“Добавить вертикально”''' – добавляют параметры для записи переменной в отдельную ячейку, массива в область по горизонтали и массива в область по вертикали соответственно. Параметры и возможные значения такие же как и в конфигураторе для обработчика excel.handlers.ReadHandler.   | ||
| Например: | Например: | ||
| Строка 577: | Строка 767: | ||
| [[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 | ||
| Строка 592: | Строка 782: | ||
| [[Image:excel_save_pic9.png]] | [[Image:excel_save_pic9.png]] | ||
| ===  | === <span id="DocxHandler"></span>DocxHandler === | ||
| Класс: '''office.doc.DocxHandler'''. | |||
| [[DocxTemplateHandler|'''Описание синтаксиса шаблонов''']] | Данный обработчик предназначен для работы с файлами '''DOCX''' на основе шаблона (подробнее смотрите [[DocxTemplateHandler|'''Описание синтаксиса шаблонов''']]). | ||
| Конфигуратор обработчика имеет следующий вид: | Конфигуратор обработчика имеет следующий вид: | ||
| Строка 602: | Строка 792: | ||
| [[Image:docx_descr_pic1_1.png]] | [[Image:docx_descr_pic1_1.png]] | ||
| * “Входной файл” – файл шаблона, на основе которого формируется выходной  | * '''“Входной файл”''' – файл шаблона, на основе которого формируется выходной '''DOCX'''-файл. Задается с помощью файловой переменной или полного пути к файлу. Также существует возможность создать/импортировать файл шаблона непосредственно в бизнес-процесс   | ||
| * '''“Выходной файл”''' – здесь вводится “Имя файла” и “Каталог”, в котором необходимо создать '''DOCX'''-файл. Но также, как и в случае входного файла, можно использовать и файловую переменную  | |||
| * '''“Выдавать ошибку в случае несоответствия шаблона”''' – при установке данного параметра будет производится проверка входного файла (шаблона) на соответствие с конфигурацией. В случае отсутствия каких-либо переменных или несоответствия имен в ходе выполнения данного обработчика – будет выдаваться ошибка и выходной файл сформирован не будет. | |||
| <BR> | |||
| == {{Title|CreateCalendarHandler|CreateCalendarHandler (!)}} ==  | |||
| '''Замечание:''' CreateCalendarHandler к использованию не рекомендуется и в данное время недоступен через интерфейсы DS, Симулятора и Runa-WEB.  | |||
| CreateCalendarHandler - создать переменную даты. | |||
| Класс: '''ru.runa.wfe.extension.handler.var.CreateCalendarHandler'''. | |||
| Класс: '''ru.runa.wfe.extension.handler.var.CreateCalendarHandler''' | |||
| Проводит операции с переменной  | Проводит операции с переменной формата Дата и Время: установление или добавление времени. | ||
| В конфигурации в качестве числа можно указать целочисленную переменную в формате ${переменная}. | В конфигурации в качестве числа можно указать целочисленную переменную в формате ${переменная}. | ||
| Для операции добавления разрешается использовать рабочее время с учетом [[BusinessCalendar|бизнес-календаря]]. | Для операции добавления разрешается использовать рабочее время с учетом [[BusinessCalendar|бизнес-календаря]]. | ||
| Строка 617: | Строка 813: | ||
| <BR> | <BR> | ||
| == {{Title|AddReadProcessPermissionsHandler| | == {{Title|AddReadProcessPermissionsHandler|AddReadProcessPermissionsHandler}} == | ||
| AddReadProcessPermissionsHandler - добавить права на чтение процесса.  | |||
| Класс: '''ru.runa.wfe.extension.handler.process.AddReadProcessPermissionsHandler''' . | Класс: '''ru.runa.wfe.extension.handler.process.AddReadProcessPermissionsHandler''' . | ||
| Строка 632: | Строка 830: | ||
| | Исполнители | | Исполнители | ||
| | Один или несколько исполнителей (организованные в списке) | | Один или несколько исполнителей (организованные в списке) | ||
| | В случае если полномочия уже имеются - ничего не происходит. | | В случае, если полномочия уже имеются - ничего не происходит. | ||
| В случае если переменная не проинициализирована - ничего не происходит. | В случае, если переменная не проинициализирована - ничего не происходит. | ||
| |} | |} | ||
| <BR> | <BR> | ||
| == {{Title|TelegramBot|TelegramBot}} == | |||
| === Конфигурация на сервере === | |||
| На сервере в /standalone/wfe.custom/ надо добавить telegram.config.xml, в котором будет указан токен бота. | |||
| Боту нужно выдать права администратора. | |||
| Пример конфигурации | |||
|   <configuration> | |||
|     <token>7303998425:AAEgFieQE-bOQt1aj-GKD0WA3JXk00s0sv4</token> | |||
|   </configuration> | |||
| === SendTelegramMessageActionHandler / Отправление сообщений в телеграм === | |||
| Входные параметры | |||
|  * ник или название чата | |||
|  * сообщение | |||
|  * список кнопок для возможного ответа (при необхдодимости получения ответа, см. ниже) | |||
| Выходной параметр | |||
|  * идентификатор сообщения | |||
| === GetTelegramClickedButtonTextActionHandler / Получить нажатую кнопку пользователем в телеграм === | |||
| Входные параметры | |||
|  * ник или название чата | |||
|  * идентификатор сообщения | |||
|  * интервал между проверками (кликнута ли кнопка) | |||
|  * максимльное количество проверок | |||
| Выходной параметр | |||
|  * текст кнопки | |||
| === GetTelegramButtonClicksByMessageActionHandler / Получить нажатые пользователями кнопки сообщения в группе телеграм === | |||
| Входные параметры | |||
|  * название группы | |||
|  * идентификатор сообщения | |||
|  * срок ожидания | |||
| Выходной параметр | |||
|  * список нажатых кнопок сообщения с авторами | |||
| <!-- | |||
| 1) По обработчику GroovyActionHandler: | |||
|    a) Пока его не трогаем. Ждём, когда разработчики наведут в нём порядок. | |||
|    b) Из описания не понятно, как использовать этот обработчик | |||
|    c) Замечание и последний абзац двусмысленны и не понятно, какой смысл они несут | |||
|    d) Я создал простейший процесс с узлом-сценарием, поместил в обработчик приведённый в разделе скрипт, запустил процесс в Симуляторе. Выдана ошибка. Мб, лучше предоставить обучаемому работающий скрипт? Пусть человек увидит один из вариантов исправной работы. Иначе как он разберётся с его использованием? | |||
|    e) Необходимо снабдить раздел подробным описанием работы обработчика на приведённом примере. Иначе в данном объёме описание почти бесполезно. Раздел ExecuteFormulaActionHandler имеет пространное описание неплохого качества. Прекрасный пример для подражания! | |||
|    f) Необходима ссылка на документ, объясняющий как отыскать и интерпретировать ошибку при выполнении. | |||
| 2) Для обработчика FormulaActionHandler функции общего применения я проверил: 3 ошибки описаны в тикете rm3800. Необходимо проверить остальные функции. | |||
| 3) Для обработчика SQLActionHandler необходимо все примеры прогнать на реальном SQL-сервере. Этот обработчик следует описать особенно подробно, потому что обработка данных является очень распространённой и часто обширной задачей в организациях.  | |||
| 4) Обработчик ActorNameActionHandler в DS и на сервисах отсутствует! | |||
| 5) Обработчик CreateCalendarHandler в DS и на сервисах отсутствует! | |||
| 6) Необходимо проверить работоспособность всех обработчиков.  | |||
| 7) Всего обработчиков на 20.01.2025 - 51. Описано только 15. Необходимо описать все.  | |||
| --> | |||
| [[Категория:Документация]] | [[Категория:Документация]] | ||
Текущая версия на 06:52, 25 марта 2025
Руководство по работе с обработчиками
Версия 4.6.0
© 2015-2025, ООО "Процессные технологии"
Введение
- В этом документе описаны только 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. Обработчики располагаются в узлах-сценария. При наведении курсора мыши на узел-сценария будет показан обработчик, используемый в его конфигурации. Для редактирования формул необходимо выбрать пункт «Конфигурация» в свойствах обработчика:
Появится окно, в котором надо задать формулы вида: 'имя модифицируемой переменной' = выражение:
В выражении могут использоваться операции: +, -, *, /, <, <=, ==, !=, >, >=, &, |, ^. 
Наибольший приоритет (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-запроса
Диалог конфигурации для данного обработчика выглядит следующим образом:
В версии 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:
# AssignSwimlaneActionHandler
Позволяет (пере)определить роль в любом месте процесса по заданной конфигурации.
Интерфейс инициализатора имеет такой же вид, как и на вкладке редактирования ролей.
# SendEmailActionHandler
Позволяет послать сообщение по e-mail. Сообщением может быть форма задания, если обработчик установлен на узле, а не на переходе. Альтернативным вариантом отправки сообщения является использование бота SendEmailTaskHandler. Формат файла конфигурации для него не отличается от формата конфигурации для SendEmailActionHandler (за исключением контекстной мета-информации).
Для создания конфигурации SendEmailActionHandler используется специальный конфигуратор. Для того, чтобы открыть конфигуратор, необходимо привязать обработчик, выбрав класс ru.runa.wfe.extension.handler.SendEmailActionHandler из списка доступных обработчиков, и начать редактирование конфигурации. Текст файла конфигурации в формате xml можно посмотреть на вкладке "XML" диалогового окна конфигуратора. Для отправки сообщения используется [1], таблицы параметров внутри API пакетов по ссылке.
Замечание: Начиная с версии 4.2, осуществляется гарантированная доставка сообщений с помощью JMS.
Общие настройки
- Не продолжать выполнение процесса при ошибке отправки. При ошибке обработки конфигурации выполнение процесса не проходит дальше (транзакция откатывается к предыдущей точке).
- Файл базовых настроек, расположенный на сервере. Здесь можно указать путь к файлу (относительно jboss/standalone/wfe.custom/), который содержит базовые настройки (расположенные на вкладках Соединение с сервером и Реквизиты сообщения) в таком же формате. Это облегчает конфигурирование нескольких обработчиков (общие параметры). Эти параметры имеют меньший приоритет перед заданными в конфигураторе (если заданы).
Настройки соединения с сервером
На этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}:
- Протокол отправки: протокол работы с сервером
- Адрес сервера: IP адрес или название узла почтового сервера
- Порт сервера: Порт почтового сервера
- Использовать аутентификацию: Исходящий почтовый сервер требует проверки подлинности пользователя
- Режим трассировки: если включить - в логи пишется информация о взаимодействии с почтовым сервером
- Дополнительные параметры соединения можно задать, исходя из всех возможных в javamail.
Настройки реквизитов сообщения
На этой вкладке допускается использование переменных в полях формы в виде ${скриптовоеНазваниеПеременной}.
Также можно указать email исполнителя с помощью метода: ${GetExecutorEmails(Согласователь)}, где Согласователь может быть пользователем или группой, в т.ч. ролью.
- Заголовок: заголовок сообщения
- Кому: email-адрес для отправки сообщения
- Копия: email-адрес для отправки копии.
Дополнительные параметры сообщения можно задать, исходя из всех возможных в javamail.
Настройки тела сообщения
- Использовать форму узла-действия: Чек-бокс доступен, если обработчик находится в узле, в этом узле определена форма и эта форма имеет тип FTL (freemarker)
- Вставить переменную: Ссылка для облегчения вставки значения переменной в текст сообщения. В тексте формы можно использовать полноценный синтаксис freemarker (можно его скопировать из FTL-формы), можно делать inline-вложения рисунков в письме
- Прикрепленные файлы: позволяет добавлять аттачменты к письму из переменных формата Файл.
# Что можно использовать в теле сообщения
В теле сообщения можно использовать все переменные БП по скриптовому названию.
В теле сообщения обработчика также доступны контекстные переменные
Интерактивная форма (${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
Здесь отображается конфигурация как она есть в реальности.
Кнопки
- Отправить тестовое письмо: отправка письма в соответствии с указанными параметрами, непосредственно из Среды разработки. Обратите внимание, что при задании настроек соединения в Файле базовых настроек тестовое сообщение отправлено не будет.
- Копировать: копирование конфигурации в буфер обмена (как Ctrl-C)
- Ок: сохранение конфигурации
- Отмена редактирования.
# Пример использования smtp.gmail.com в качестве сервера исходящей почты
Заполните параметры обработчика как показано на рисунке ниже:
Использование 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
Откройте сформированный mail-smtp.cer и удалите всё, что до -----BEGIN CERTIFICATE----- и после -----END CERTIFICATE-----, сохраните изменения.
Скопируйте полученный сертификат в 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
Будет выполнен импорт сертификата в хранилище ключей, потребуется перезапуск приложения.
# ActorNameActionHandler (!)
Замечание: ActorNameActionHandler к использованию не рекомендуется и в данное время недоступен через интерфейсы DS, Симулятора и Runa-WEB4.0.0+. Используйте обработчик GetExecutorInfoHandler.
ActorNameActionHandler позволяет добавить в переменные процесса логин или полное имя сотрудника по коду или по логину. Для настройки параметров обработчика используется форма.
Необходимо указать переменную с кодом сотрудника или переменную с логином сотрудника в качестве входящих данных для обработчика. Затем выбрать формат исходящих данных:
- 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 файлов. Для настройки параметров обработчика используется следующая форма:
“Входной файл” – здесь задается полный путь к файлу либо файловая переменная, указывающая на данный файл, например:
“Добавить ячейку” – добавляет параметры для чтения данных из отдельной ячейки:
1) “Переменная” – в которую будет считано значение из ячейки
2) “Страница” – имя или номер страницы, на которой расположена ячейка
3) “Столбец/Строка” – адрес ячейки (нумерация с 1 до 999999999).
“Добавить горизонтально”/ “Добавить вертикально” – добавляет параметры для чтения массивов данных по горизонтали и вертикали соответственно:
1) “Переменная” – переменная массив формата "Список", в который будет считаны данные
2) “Страница” – так же как и в случае отдельной ячейки, данный параметр задает имя или номер (нумерация с 1) страницы, на которой расположены считываемые данные
3) “Начальный столбец”/“Строка”, “Столбец/Начальная строка” – адрес ячейки, начиная с которой необходимо считывать массив данных (по горизонтали – строка, по вертикали - столбец), нумерация также начинается с “1”.
Например:
Обработчик будет выполнять чтение файла “ввод.xls”, находящегося по адресу \\SRV\nfsshared\ .
Будет считано значение в переменную “Ячейка1” из отдельной ячейки, находящейся на странице с именем “Лист5” по адресу столбец 2, строка 1.
Будет считан массив “список1”, в который попадут значения из строки 3, начиная со столбца 1. Страница задана по номеру – 1.
Будет считан массив “список2”, в который попадут значения из столбца 7, начиная со строки 4. Страница – “Sheet1”.
Также конфигурацию обработчика можно задать и в виде xml, например:
ExcelSaveHandler
Класс: office.excel.handler.ExcelSaveHandler.
Используется для записи данных в файл XLSX, имеет форму для конфигурирования параметров:
Описание параметров:
“Входной файл” – представляет собой шаблон документа, на основе которого будет создан выходной файл. Данный параметр можно задать как с помощью файловой переменной или полного пути к файлу, так и создать шаблон непосредственно в бизнес-процессе или же импортировать шаблон в бизнес-процесс.
Например, если шаблон имеет следующий вид:
то результат будет содержать:
“Выходной файл” – результирующий файл, в который будут записаны данные. Здесь отдельно задается имя файла и путь, но можно также использовать файловую переменную, например:
Ссылки “Добавить ячейку”, “Добавить горизонтально”, “Добавить вертикально” – добавляют параметры для записи переменной в отдельную ячейку, массива в область по горизонтали и массива в область по вертикали соответственно. Параметры и возможные значения такие же как и в конфигураторе для обработчика excel.handlers.ReadHandler.
Например:
В качестве входного файла (шаблона) задан файл c:/in/sample.xls, на основе его будет создан выходной файл c:/out/Result.xls, на страницу Sheet1 которого запишутся:
- переменная “Ячейка1” по адресу столбец 1: строка 1
- массив “список1” (столбец 2: начальная строка 1):
- массив “список2” (начальный столбец 3: строка 1)
DocxHandler
Класс: office.doc.DocxHandler.
Данный обработчик предназначен для работы с файлами DOCX на основе шаблона (подробнее смотрите Описание синтаксиса шаблонов).
Конфигуратор обработчика имеет следующий вид:
- “Входной файл” – файл шаблона, на основе которого формируется выходной DOCX-файл. Задается с помощью файловой переменной или полного пути к файлу. Также существует возможность создать/импортировать файл шаблона непосредственно в бизнес-процесс
- “Выходной файл” – здесь вводится “Имя файла” и “Каталог”, в котором необходимо создать DOCX-файл. Но также, как и в случае входного файла, можно использовать и файловую переменную
- “Выдавать ошибку в случае несоответствия шаблона” – при установке данного параметра будет производится проверка входного файла (шаблона) на соответствие с конфигурацией. В случае отсутствия каких-либо переменных или несоответствия имен в ходе выполнения данного обработчика – будет выдаваться ошибка и выходной файл сформирован не будет.
# CreateCalendarHandler (!)
Замечание: CreateCalendarHandler к использованию не рекомендуется и в данное время недоступен через интерфейсы DS, Симулятора и Runa-WEB.
CreateCalendarHandler - создать переменную даты.
Класс: ru.runa.wfe.extension.handler.var.CreateCalendarHandler.
Проводит операции с переменной формата Дата и Время: установление или добавление времени. В конфигурации в качестве числа можно указать целочисленную переменную в формате ${переменная}. Для операции добавления разрешается использовать рабочее время с учетом бизнес-календаря.
# AddReadProcessPermissionsHandler
AddReadProcessPermissionsHandler - добавить права на чтение процесса.
Класс: ru.runa.wfe.extension.handler.process.AddReadProcessPermissionsHandler .
Добавляет полномочия на чтение текущего экземпляра процесса указанным исполнителям.
Параметры
| Название | Тип | Примечание | 
| Исполнители | Один или несколько исполнителей (организованные в списке) | В случае, если полномочия уже имеются - ничего не происходит. В случае, если переменная не проинициализирована - ничего не происходит. | 
# TelegramBot
Конфигурация на сервере
На сервере в /standalone/wfe.custom/ надо добавить telegram.config.xml, в котором будет указан токен бота.
Боту нужно выдать права администратора.
Пример конфигурации
<configuration> <token>7303998425:AAEgFieQE-bOQt1aj-GKD0WA3JXk00s0sv4</token> </configuration>
SendTelegramMessageActionHandler / Отправление сообщений в телеграм
Входные параметры
* ник или название чата * сообщение * список кнопок для возможного ответа (при необхдодимости получения ответа, см. ниже)
Выходной параметр
* идентификатор сообщения
GetTelegramClickedButtonTextActionHandler / Получить нажатую кнопку пользователем в телеграм
Входные параметры
* ник или название чата * идентификатор сообщения * интервал между проверками (кликнута ли кнопка) * максимльное количество проверок
Выходной параметр
* текст кнопки
GetTelegramButtonClicksByMessageActionHandler / Получить нажатые пользователями кнопки сообщения в группе телеграм
Входные параметры
* название группы * идентификатор сообщения * срок ожидания
Выходной параметр
* список нажатых кнопок сообщения с авторами
































