← Назад к заметкам

Заметки

Как прочитать переменную БП в 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-сущности, задачи, элемента списка или другого объекта, на котором запущен процесс.

Если значение нужно только внутри процесса, достаточно переменной. Если оно должно остаться в карточке после завершения БП, нужно записывать его в поле документа отдельным действием или кодом.