Доброго времени суток!
Нигде не встречал, чтобы клиенты создавали свои Activity (Действия) для бизнес-процессов. Думаю, что это связано с отсутствием соответствующей документации.
В данной статье постараюсь пошагово описать процесс создания своего Activity на примере действия, которое будет писать в лог БП или текстовый файл, произвольные значения из шаблона бизнес-процесса.
[spoiler]
1. Создаём структуру файлов будущего Activity.

Хочу сразу отметить, что название папки с Activity должно совпадать с именем файла, в котором находится класс с Activity, в данном случае файл называется write2logactivity.php
Описание будущего действия находится в файле .description.php, его содержимое:
В визуальном редакторе получаем своё действие:

Далее программируем форму настроек действия. Код формы находится в файле properties_dialog.php:
В результате на экране получим:

В зависимости от положения галочки "Писать файл", вывод мы получим или в логе БП:

либо в файле:

Теперь несколько моментов, на которые надо обратить внимание разработчикам.
2. Формирование переменных для диалога настроек, в т.ч. и текущие настройки, а данном случае вся информация будет доступна в массиве $arCurrentValues:
3. Сохранение настроек, сделанных в диалоге настройки действия:
4. Выполняем проверку полученных значений, если требуется выводим ошибку:
Вот в общем и всё, труднее было начать, чем сделать.
Исходный код разработанного Activity можно скачать тутwrite2logactivity.zip (cp1251)
Спасибо за внимание.
Нигде не встречал, чтобы клиенты создавали свои Activity (Действия) для бизнес-процессов. Думаю, что это связано с отсутствием соответствующей документации.
В данной статье постараюсь пошагово описать процесс создания своего Activity на примере действия, которое будет писать в лог БП или текстовый файл, произвольные значения из шаблона бизнес-процесса.
[spoiler]
1. Создаём структуру файлов будущего Activity.

Хочу сразу отметить, что название папки с Activity должно совпадать с именем файла, в котором находится класс с Activity, в данном случае файл называется write2logactivity.php
Описание будущего действия находится в файле .description.php, его содержимое:
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); $arActivityDescription = array( "NAME" => GetMessage("BPDDA_DESCR_NAME"), "DESCRIPTION" => GetMessage("BPDDA_DESCR_DESCR"), "TYPE" => "activity", // Тип - действие "CLASS" => "Write2LogActivity", //Класс с Activity "JSCLASS" => "BizProcActivity", //Стандартная JS библиотека, которая будет рисовать Activity "CATEGORY" => array( "ID" => "other", // Activity будет располагаться в категории "Прочее" ), ); ?> |

Далее программируем форму настроек действия. Код формы находится в файле properties_dialog.php:
................................................................................................................ <script> <? foreach ($arCurrentValues["MapFields"] as $fieldKey => $documentFieldValue) { ?> AddCondition('<?= CUtil::JSEscape($fieldKey) ?>', '<?= CUtil::JSEscape($documentFieldValue) ?>'); <? } if (count($arCurrentValues) <= 0) { ?>AddCondition("", "");<? } ?> var check = '<?= $arCurrentValues["write2file"];?>'; if (check == "Y") { document.getElementById("write2file").checked = "checked"; Write2File(); } </script> ................................................................................................................ |
В результате на экране получим:

В зависимости от положения галочки "Писать файл", вывод мы получим или в логе БП:

либо в файле:

Теперь несколько моментов, на которые надо обратить внимание разработчикам.
- Файл write2logactivity.php:
class CBPWrite2LogActivity extends CBPActivity { public function __construct($name) { parent::__construct($name); $this->arProperties = array( "Title" => "", "MapFields" => null, "write2file" => null, "path2file"=> null ); } |
public static function GetPropertiesDialog($documentType, $activityName, $arWorkflowTemplate, $arWorkflowParameters, $arWorkflowVariables, $arCurrentValues = null, $formName = "") { $runtime = CBPRuntime::GetRuntime(); if (!is_array($arCurrentValues)) { $arCurrentValues = array(); $arCurrentActivity = &CBPWorkflowTemplateLoader::FindActivityByName($arWorkflowTemplate, $activityName); ............................... } $runtime = CBPRuntime::GetRuntime(); return $runtime->ExecuteResourceFile( __FILE__, "properties_dialog.php", array( "arCurrentValues" => $arCurrentValues, "formName" => $formName, ) ); } |
public static function GetPropertiesDialogValues($documentType, $activityName, &$arWorkflowTemplate, &$arWorkflowParameters, &$arWorkflowVariables, $arCurrentValues, &$arErrors) { $runtime = CBPRuntime::GetRuntime(); $arProperties = array("MapFields" => array()); //Получили массив значений $arCurrentValues if (is_array($arCurrentValues) && count($arCurrentValues)>0) { ........................ $arProperties ["write2file"] = $arCurrentValues["write2file"] == "Y" ? "Y" : "N"; $arProperties ["path2file"] = $arCurrentValues["path2file"]; } //Получаем переменные текущего действия по ссылке и заменяем их $arCurrentActivity = &CBPWorkflowTemplateLoader::FindActivityByName($arWorkflowTemplate, $activityName); $arCurrentActivity["Properties"] = $arProperties; return true; } |
public static function ValidateProperties($arTestProperties = array(), CBPWorkflowTemplateUser $user = null) { $arErrors = array(); $path = ""; if ($arTestProperties["path2file"]) { $path = $_SERVER["DOCUMENT_ROOT"].$arTestProperties["path2file"]; if (!file_exists($path) && !is_writable(GetDirPath($path))) $arErrors[] = array("code" => "DirNotWritable", "parameter" => "path2file", "message" => GetMessage("DIR_NOT_WRITABLE")); if (file_exists($path) && !!is_writable(GetDirPath($path))) $arErrors[] = array("code" => "FileNotWritable", "parameter" => "path2file", "message" => GetMessage("FILE_NOT_WRITABLE")); } return array_merge($arErrors, parent::ValidateProperties($arTestProperties, $user)); } |
Вот в общем и всё, труднее было начать, чем сделать.
Исходный код разработанного Activity можно скачать тут
Спасибо за внимание.