Заметки
Как прочитать переменную БП в PHP-активити
Как читать переменные бизнес-процесса Bitrix24 в PHP-активити через GetRootActivity и GetVariable, работать с множественными значениями и пользователями.
В PHP-активити переменную бизнес-процесса обычно читают через
$this->GetRootActivity() и GetVariable().
Главное — помнить, что переменная БП, поле документа и глобальная переменная портала
это разные сущности.
Задача
В PHP-действии бизнес-процесса часто нужно взять значение, которое уже есть в процессе: ID сделки, выбранного пользователя, сумму, флаг, список элементов или результат предыдущего действия.
Для этого не нужно подставлять значение прямо в код через фигурные скобки бизнес-процесса. Надёжнее читать переменную через корневую активити процесса.
Так код получается понятнее: сначала получаем объект процесса, потом читаем нужные переменные по их кодам, приводим значения к ожидаемому типу и уже после этого выполняем основную логику.
Как читать переменную
Базовый вариант выглядит так: получить корневую активити и вызвать
GetVariable с кодом переменной.
$root_activity = $this->GetRootActivity();
$deal_id = $root_activity->GetVariable('DealId');
$this->WriteToTrackingService('DealId: ' . $deal_id); DealId здесь — это код переменной бизнес-процесса, а не название поля CRM
и не подпись из интерфейса. Лучше сразу давать переменным технически понятные коды:
DealId, ManagerId, Approvers,
PreparedValues.
Если переменная должна быть числом, её лучше привести к числу до использования:
$root_activity = $this->GetRootActivity();
$deal_id = (int)$root_activity->GetVariable('DealId');
if ($deal_id <= 0) {
$this->WriteToTrackingService('DealId не заполнен');
return;
} То же самое касается флагов, строк и массивов. Значение из БП лучше не использовать вслепую: сначала привести к ожидаемому виду, а потом передавать в API, условие или дальнейший расчёт.
Когда нужно прочитать несколько переменных, удобнее сделать это в начале PHP-активити и при необходимости вывести короткую диагностическую запись в журнал:
$root_activity = $this->GetRootActivity();
$deal_id = (int)$root_activity->GetVariable('DealId');
$manager_id = (string)$root_activity->GetVariable('ManagerId');
$is_debug_enabled = $root_activity->GetVariable('IsDebugEnabled') === 'Y';
$this->WriteToTrackingService(
'Данные: ' . print_r([
'deal_id' => $deal_id,
'manager_id' => $manager_id,
'is_debug_enabled' => $is_debug_enabled,
], true)
); А вот так читать переменную не стоит:
$deal_id = $DealId;
Такой переменной PHP не знает. Значение нужно получить из бизнес-процесса через
GetVariable.
Множественные значения
Если переменная в БП множественная, в PHP-коде её обычно нужно обрабатывать как массив. Но на практике лучше быть готовым и к пустому значению, и к одиночной строке.
Простой вариант:
$root_activity = $this->GetRootActivity();
$user_values = $root_activity->GetVariable('Approvers');
if (!is_array($user_values)) {
$user_values = $user_values === '' || $user_values === null
? []
: [$user_values];
}
foreach ($user_values as $user_value) {
$this->WriteToTrackingService('Согласующий: ' . $user_value);
}
Для повторного использования удобнее вынести нормализацию в маленькую функцию.
Тогда основной код не будет каждый раз проверять null, пустую строку
и одиночное значение.
function normalizeBizprocMultipleValue(mixed $value): array
{
if ($value === null || $value === '') {
return [];
}
if (is_array($value)) {
return array_values(array_filter($value, static function ($item): bool {
return $item !== null && $item !== '';
}));
}
return [$value];
}
$root_activity = $this->GetRootActivity();
$selected_ids = normalizeBizprocMultipleValue(
$root_activity->GetVariable('SelectedIds')
);
$this->WriteToTrackingService(
'SelectedIds: ' . print_r($selected_ids, true)
); Это особенно полезно для переменных, которые приходят из списков, выбора пользователей, дополнительной информации или предыдущих PHP-действий.
Если после обработки нужно вернуть результат обратно в БП, можно записать подготовленный массив в другую переменную процесса:
$root_activity = $this->GetRootActivity();
$source_values = normalizeBizprocMultipleValue(
$root_activity->GetVariable('SourceValues')
);
$result_values = [];
foreach ($source_values as $source_value) {
$result_values[] = trim((string)$source_value);
}
$result_values = array_values(array_filter($result_values));
$this->SetVariable('PreparedValues', $result_values); Для множественной переменной лучше передавать именно массив, а не строку с ID через запятую. Так следующие действия процесса смогут нормально использовать каждое значение отдельно.
Пользователи и ID
С переменными типа «Пользователь» часто возникает путаница: в БП значение может быть
не просто числом, а строкой вида user_1.
Если дальше в коде нужен именно ID пользователя, его можно извлечь из таких значений:
function extractUserIds(array $user_values): array
{
$user_ids = [];
foreach ($user_values as $user_value) {
$user_id = (int)str_replace('user_', '', (string)$user_value);
if ($user_id > 0) {
$user_ids[] = $user_id;
}
}
return $user_ids;
}
$root_activity = $this->GetRootActivity();
$user_values = normalizeBizprocMultipleValue(
$root_activity->GetVariable('Approvers')
);
$user_ids = extractUserIds($user_values);
$this->WriteToTrackingService(
'ID пользователей: ' . implode(', ', $user_ids)
);
При этом для записи обратно в переменную типа «Пользователь» часто нужен обратный формат:
не 1, а user_1. Это важно учитывать, если одно PHP-действие
читает пользователей, а другое потом использует их в задаче, согласовании или уведомлении.
Для множественного выбора пользователей переменная должна быть множественной, а значение лучше передавать массивом. Иначе в следующих действиях БП часть пользователей может не подставиться так, как ожидается.
Переменная БП и поле документа
GetVariable читает переменную бизнес-процесса. Если нужно получить поле
документа, это уже другая задача.
Такой код будет искать переменную с кодом UF_CRM_1234567890, а не читать
поле CRM:
$field_value = $root_activity->GetVariable('UF_CRM_1234567890'); Если нужно прочитать поле документа из PHP-активити, можно обратиться к сервису документа:
$document_service = $this->workflow->GetService('DocumentService');
$document = $document_service->getDocument($this->getDocumentId());
$field_value = $document['UF_CRM_1234567890'] ?? null; Эту разницу лучше держать в голове. Переменные БП удобны для промежуточных результатов и передачи данных между действиями процесса. Поля документа — это данные самой CRM-сущности, задачи, элемента списка или другого объекта, на котором запущен процесс.
Если значение нужно только внутри процесса, достаточно переменной. Если оно должно остаться в карточке после завершения БП, нужно записывать его в поле документа отдельным действием или кодом.