этот блог посвящен задачам, с которыми сталкиваюсь в своей профессиональной деятельности.
Поиск по этому блогу
Себе на память: программный запуск бизнес-процесса в корпортале Битрикс24
Для элемента CRM:
CBPDocument::StartWorkflow(
4,
array(«bizproc»,»CBPVirtualDocument»,$LidID),
array(),
$arErrorsTmp
);
Для бизнес-процесса, не привзянного к CRM
$documentId = CBPVirtualDocument::CreateDocument(
0,
array(
«IBLOCK_ID» => 27,
«NAME» => «Create Notification»,
«CREATED_BY» => «user_».$GLOBALS[«USER»]->GetID(),
)
);
$wfId = CBPDocument::StartWorkflow(
27,
array(«bizproc», «CBPVirtualDocument», $documentId),
array_merge(array(), array(«TargetUser» => «user_».intval($GLOBALS[«USER»]->GetID()))),
$arErrorsTmp
);
Поделиться
- Получить ссылку
- Электронная почта
- Другие приложения
Ярлыки
Поделиться
- Получить ссылку
- Электронная почта
- Другие приложения
Комментарии
А нет такого же рецепта, но для новых БП (которые в живой ленте)?
Оно будет работать и в них (в коробке, конечно).
Работать то работает, но в ленте не появляется.
Александр, а какой тип инфоблока у вас? Процессы? Бизнес-процессы (БП)? Списки (унив.)? Или что-то подвязанное к CRM?
В корпортале (коробка) на текущий момент БП, подвязанные к CRM, в Живой Ленте не отображаются. хотя на днях презентована такая возможность для будущего. Если тип Процессы, то нужно галочку поставить «Отображать в живой ленте». и попробовать без программирования вначале отобразить тестовый БП в ленте 🙂 Хотя это как раз не сложно. сложности с другим. Думаю, во фрагменте приведенного в блоге кода
$wfId = CBPDocument::StartWorkflow(
xx,
array(«bizproc», «CBPVirtualDocument», $documentId),
array_merge(array(), array(«TargetUser» => «user_».intval($GLOBALS[«USER»]->GetID()))),
$arErrorsTmp
);
для случая не-CRM и при использовании типа «Процессы» нужно вместо bizproc написать что-то иное. ну и вместо xx вписать не номер инфоблока 27, а именно номер шаблончика БП, подвязанного к этому инфоблоку (они вовсе не равны с номером самого БП)
Почти три часа искал решение(нашел у Вас) но хочется понять в чем ошибка(мистическая). Я скопировал в инструментах -> в окно «php-код» код из учебника.
заменив аргументы на свои, причем я подумал что модуль в котором запускается БП (у меня над сделкой в СРМ) это первый аргумент второго массива «crm» , второй аргумент обозначение сущности над которой выполняется БП.
if(CModule::IncludeModule(«bizproc»))<
CBPDocument::StartWorkflow(
119,
array(«crm»,»DEAL»,876),
array(),
$arErrors
);
>
print_r($arErrors);
Этот код сработал, БП запустился, я стал эксперементировать с параметрами. И с раза 5-го код перестал работать с выбросом ошибки
Array
(
[0] => Array
(
[code] => 10002
[message] => Аргумент ‘documentId’ не определен
[file] => /home/bitrix/www/bitrix/modules/bizproc/classes/general/helper.php [804]
)
)
И только с array(«bizproc»,»CBPVirtualDocument»,876) сработало
что за «bizproc»,»CBPVirtualDocument». в чем подвох? )))
мне не успокоиться))
Вот выдержка из оф. документации:
Откройте диалог настроек параметров действия с помощью иконки и введите код:
CBPDocument::StartWorkflow(
6,
array(«bizproc»,»CIBlockDocument»,),
array(«Voters»=>array(«user_1»)),
$arErrors
);
Где:
Первый параметр — это ID запускаемого шаблона бизнес процесса. В нашем случае это 6, что соответствует Двухэтапному утверждению.
Примечание: ID одних и тех же бизнес процессов могут отличаться для разных установок продукта. Всегда внимательно проверяйте данный параметр.
Второй параметр — это код документа, для которого создается бизнес-процесс. Он задается в виде массива, элементами которого являются соответственно название модуля, класс документа и код документа в модуле.
Примечание: шаблон запускаемого бизнес-процесса должен соответствовать типу указываемого документа. В данном примере бизнес-процесс запускается для того же элемента информационных блоков, над которым работает запускающий бизнес-процесс.
Сорри, Виталий. Мне сейчас некогда вникать — много работы.
Для лидов во втором параметре в функцию CBPDocument::StartWorkflow() необходимо передавать массив array(«crm»,»CCrmDocumentLead»,»LEAD_».intval($id))
Для других сущностей с параметрами можно ознакомиться в таблице БД b_bp_workflow_template
Анонимный написал(а)…
Добрый день.
А как передать файл в параметр бизнес-процесса типа Файл?
добрый день! просьба помочь с автозапуском БП в инфоблоке.
в ручном режиме работает.
расписал здесь: http://dev.1c-bitrix.ru/community/forums/forum23/topic98135/
Анонимный написал(а)…
>> Александр Урилов пишет.
А нет такого же рецепта, но для новых БП (которые в живой ленте)?
А Вы не пробовали отметить галочку Показать в живой ленте (для бизнес процесса) или установить этот параметр через код
Этот комментарий был удален автором.
Здравствуйте, Юлия! Читаю частенько ваш блог очень полезная информация, продолжайте в том же духе! Недавно возникла задача запустить БП по при создании элемента списка (список создавал робот и стандартный запуск не отрабатывал), при использовании вашего кода БП запускался, НО лог о запуске не создавался, стал копать и нашел как сделать с логом. Ниже полный код
// ID БП
$bp_id = 43;
$arErrorsTmp = array();
$arWorkflowParameters = array();
// Запуск БП по элементам списка (инфоблока)
CBPDocument::StartWorkflow(
$bp_id,
array(
‘lists’,
‘Bitrix\Lists\BizprocDocumentLists’,
$arFields[‘ID’],//ID Элемента инфоблока
),
array_merge($arWorkflowParameters, array(
CBPDocument::PARAM_TAGRET_USER => «user_».intval($GLOBALS[«USER»]->GetID()),
CBPDocument::PARAM_DOCUMENT_EVENT_TYPE => CBPDocumentEventType::Manual
)),
$arErrorsTmp
);
Добавьте пожалуйста этот код в вашу статью. Спасибо.
Анонимный написал(а)…
Эдуард,
когда добавляю
CBPDocument::PARAM_DOCUMENT_EVENT_TYPE => CBPDocumentEventType::Manual
у меня выдает
[10002] The argument ‘documentId’ is undefined.
Анонимный написал(а)…
Этот код сработал, БП запустился, я стал эксперементировать с параметрами. И с раза 5-го код перестал работать с выбросом ошибки
Array
(
[0] => Array
(
[code] => 10002
[message] => Аргумент ‘documentId’ не определен
[file] => /home/bitrix/www/bitrix/modules/bizproc/classes/general/helper.php [804]
)
)
И только с array(«bizproc»,»CBPVirtualDocument»,876) сработало
что за «bizproc»,»CBPVirtualDocument». в чем подвох? )))
Надо конвертировать стринговый ID в int функцией intval
Источник: bedrosova.blogspot.com
Как мы настраивали миграции для бизнес-процессов в Битрикс24
Для автоматизации своих операций бизнес часто использует Битрикс24. В этой статье рассказываем о некоторых возможных проблемах при изменении бизнес-процессов и о том, как мы их решали.
Битрикс24 – одна из распространенных систем CRM. В нее входит визуальный конструктор (дизайнер) для выстраивания схем бизнес-процессов. Важно помнить, что при редактировании этих процессов возможны сложности – особенно на крупных действующих проектах, где любые изменения сначала проверяют на локальном и тестовом серверах. В таких случаях при переносе на продакшн мы используем механизм миграции бизнес-процессов (далее – БП).
Небольшие компании, как правило, могут обойтись без миграции и просто приостановить на 2-3 дня тот или иной бизнес-процесс. Крупный бизнес обычно не может себе этого позволить, поэтому использует тестовые сервера и деплоинг.
Битрикс24 о том, как работает шаблон бизнес-процесса
Работа с миграцией имеет свои особенности. В частности, ее осложняет большое количество задействованных объектов и ID. Кроме того, в том же Битрикс24 миграция бизнес-процессов как таковая не предусмотрена – зачастую эту задачу решают посредством импорта и экспорта, и здесь могут быть различные нестыковки. Рассмотрим, какие проблемы возможны при этом с точки зрения разработки.
Проблема поиска шаблона бизнес-процесса
При создании бизнес-процесса можно присвоить шаблону только название (имя), а не уникальный код. В этом случае при обновления бизнес-процесса его придется получать из базы по имени. Имена иногда изменяются, потому что система использует их для вывода в списке процессов при запуске. Соответственно, возможны ситуации, когда при обновлении невозможно будет найти шаблон. Да и в целом, поиск по имени – не такая уж хорошая идея.
Все созданные в системе шаблоны бизнес-процессов хранятся в таблице b_bp_workflow_template. Открыв таблицу, среди полей мы видим SYSTEM_CODE: поле для кода есть, просто не выведено в интерфейс. Мы можем задать код самостоятельно, используя id шаблона — его можно увидеть в url на странице редактирования процесса:
Нам нужно создать функцию, чтобы получить на вход id шаблона и код, провести проверку на дублирование и на заполненность поля у изменяемого шаблона, а также установить его код.
use BitrixMainLoader; Loader::includeModule(«bizproc»); $BPloader = CBPWorkflowTemplateLoader::GetLoader(); // set template CODE field setTemplateCode ($BPloader, ‘TEST’, ’94’ ); function setTemplateCode($BPloader, $code, $tempalteId) < if (isCodeExists($BPloader, $code)) < die(‘Такой код уже существует’); >if (!isCodeEmpty($BPloader, $tempalteId)) < die(‘Код уже задан у этого шаблона’) >$BPloader->UpdateTemplate($tempalteId, [‘SYSTEM_CODE’ => $code]); > // check if $code exists in DB function isCodeExists($BPloader, string $code) < $dbRes = $BPloader->GetTemplatesList( $arOrder = [‘ID’ => ‘DESC’], $arFilter = [‘CODE’ => $code], $arGroupBy = false, $arNavStartParams = false, $arSelectFields = [‘ID’] ); if (intval($dbRes->SelectedRowsCount()) > 0) < return true; >return false; > // check if the template code is not empty function isCodeEmpty($BPloader, $tempalteId) < $dbRes = $BPloader->GetTemplatesList( $arOrder = [‘ID’ => ‘DESC’], $arFilter = [‘CODE’ => », ‘ID’ => $tempalteId], $arGroupBy = false, $arNavStartParams = false, $arSelectFields = [‘ID’] ); if (intval($dbRes->SelectedRowsCount()) > 0) < return false; >return true; > return true; >
Идем дальше. Для примера создадим тестовый бизнес-процесс на списках:
Чтобы перенести разработанный локально процесс на тестовый сервер (а потом и на продакшн), мы применяем механизм миграций.
Битрикс24 позволяет экспортировать бизнес-процесс. Будем использовать эту возможность.
Схема переноса такая:
- Экспортируем бизнес-процесс
- Пишем миграцию, прикладываем файл
- На новом стенде делаем бэкап старого процесса
- Применяем миграцию
Создание миграции
Файлы миграций в нашем проекте располагаются по адресу local/migrations/scenarios
Открываем страницу шаблона процесса и делаем экспорт. Внутри директории с миграциями создаем директорию files и помещаем туда экспортированный файл. Получается так:
local/migrations/scenarios/files/bp-94.bpt
Создаем сценарий миграций:
class ws_m_1565783124_approve_task extends WSMigrationsScriptScenario
Определяем параметры шаблона бизнес-процесса:
class ws_m_1565783124_approve_task extends WSMigrationsScriptScenario < private $arBPFields = [ ‘DOCUMENT_TYPE’ =>[ ‘lists’, ‘BizprocDocument’, ‘iblock_’ ], ‘AUTO_EXECUTE’ => 0, ‘NAME’ => ‘Утверждение задач’, ‘CODE’ => ‘TEST’, ];
Реализуем функцию импорта бизнес-процесса:
private function importBP($path) < CModule::IncludeModule(‘bizproc’); CModule::IncludeModule(‘iblock’); //Get iBlock id for which BP is created $this->arBPFields[‘DOCUMENT_TYPE’][2] .= $this->getIblockId(); // Get BP id by the CODE $result = CBPWorkflowTemplateLoader::GetList( [], [ ‘CODE’ => $this->arBPFields[‘CODE’], ‘MODULE_ID’ => ‘lists’ ] ); if ($arFields = $result->GetNext()) < $id = $arFields[‘ID’]; >else < $id = 0; >//read file to a variable $f = fopen($path, ‘rb’); $datum = fread($f, filesize($path)); fclose($f); //Update BP if id>0, otherwise add BP CBPWorkflowTemplateLoader::ImportTemplate( $id, $this->arBPFields[‘DOCUMENT_TYPE’], $this->arBPFields[‘AUTO_EXECUTE’], $this->arBPFields[‘NAME’], », $datum, $this->arBPFields[‘CODE’] ); return $arFields[‘ID’]; >
Здесь сначала определяем ID инфоблока, для которого мы применяем процесс, и получаем id шаблона процесса с заданным кодом.
Если шаблон найден – мы его обновляем. Если не найден – добавляем.
Функция возвращает id созданного или обновленного процесса, а для чего это нужно – расскажем дальше.
Определяем функцию commit, которая добавит/обновит наш бизнес-процесс:
public function commit() < $pathBPElement = __DIR__ . ‘/files/bp-94-approve-task.bpt’; $id = $this->importBP($pathBPElement); >
Итак, на этом шаге мы уже умеем создавать и обновлять конкретный бизнес-процесс через модуль миграций.
Проблема обновления данных шаблона
Давайте вернемся в наш бизнес-процесс и добавим туда действие – уведомление пользователя.
В качестве отправителя выбираем Автора. Получатели будут:
- Группа пользователей HR
- Пользователь Светлана Кузнецова
$arFieldsTemplate = CBPWorkflowTemplateLoader::GetList([], [‘ID’ => 94])->GetNext(); echo »; var_dump($arFieldsTemplate);
В массиве параметров процесса мы видим вот такие вхождения:
Смотрим на строку group_g15. Здесь 15 – это ID группы HR.
Смотрим на строку user_579. Здесь 579 – это ID пользователя.
Это значит, что если мы импортируем процесс на другой площадке, у нас будут сплошные нестыковки.
Т.о. нам нужно сделать замену после миграции этих ID на те, которые актуальны для площадки, куда импортируем процесс.
Группы определяем по символьному коду, пользователей – по логину.
Для начала на той площадке, где создавали процесс, получаем символьный код группы и логин пользователя. В том случае, если у вас не заданы символьные коды групп, лучше сначала написать миграцию и установить их.
В нашем примере:
- Код группы – HR
- Логин пользователя – svetlana.kuznetsova
- getUserId($login)
- getGroupId($code);
/** * Write action by apply scenario. Use method `setData` for save need rollback data **/ public function commit()
$pathBPElement = __DIR__ . ‘/files/bp-94-approve-task.bpt’; $id = $this->importBP($pathBPElement);
Получаем данные шаблона:
$arFieldsTemplate = CBPWorkflowTemplateLoader::GetList([], [‘ID’ => $id])->GetNext(); $template = $arFieldsTemplate[«TEMPLATE»];
Заменяем id пользователей внутри бизнес-процесса:
$template[0][‘Children’][0][‘Properties’][«MessageUserTo»][0] = ‘group_g’ . $this->getGroupId(‘HR’); $template[0][‘Children’][0][‘Properties’][«MessageUserTo»][1] = ‘user_’ . $this->getUserId(‘svetlana.kuznetsova’); $arNewFields = [ “TEMPLATE” => $template, “VARIABLES” => $arFieldsTemplate[«VARIABLES»] ]; $arNewFields[«MODIFIER_USER»] = new CBPWorkflowTemplateUser(CBPWorkflowTemplateUser::CurrentUser); CBPWorkflowTemplateLoader::Update($id, $arNewFields); >
Здесь при запуске миграции мы загружаем файл и функцией importBP создаем/обновляем процесс. Далее мы получаем структуру шаблона бизнес-процесса в массив, подменяем ID и обновляем шаблон.
Подводя итоги
В этой статье мы затронули лишь отдельные случаи, где при переносе между площадками могут возникнуть несоответствия, и обозначили, на что обратить внимание. В целом мы в своей практике сталкивались со следующими привязками по id:
- user_ (привязка к пользователю)
- group_ (привязка к группе пользователей)
- iblock_ (привязка к инфоблоку)
- SequentialWorkflowActivity (запуск бизнес-процесса из шаблона)
- PROPERTY_ (привязка к полю документа с незаданным символьным кодом)
Надеемся, что наш опыт был вам полезен!
Показать пример целиком
- Битрикс24
- crm
- crm-системы
- автоматизация бизнес-процессов
- электронный документооборот
- Блог компании SimbirSoft
- CRM-системы
- ECM/СЭД
Источник: habr.com