Бизнес-процессы
Поля документа
Как читать поля документа бизнес-процесса через DocumentService и как менять сам документ через API нужной сущности.
Документ бизнес-процесса — это сущность, по которой запущен процесс: сделка, лид, элемент
списка, элемент смарт-процесса и так далее. В PHP-блоке поля документа лучше читать через
DocumentService, а не через подстановки.
Чтение документа
Основной рабочий путь: получить ID документа, получить сервис документа и прочитать поля.
Получить document id
getDocumentId() возвращает идентификатор документа бизнес-процесса. Его
формат зависит от типа документа.
/**
* Записывает document id в отчёт.
*/
function writeDocumentIdToReport($context): void
{
$document_id = $context->getDocumentId();
$context->WriteToTrackingService(
print_r($document_id, true),
0,
\CBPTrackingType::Report
);
}
writeDocumentIdToReport($this);
Перед универсальным кодом лучше один раз вывести getDocumentId() в отчёт и
посмотреть фактический формат на своём типе документа.
Получить поля документа
Сервис документа можно получить из workflow через GetService('DocumentService').
Дальше вызывается getDocument().
/**
* Получает поля документа бизнес-процесса.
*/
function fetchDocumentFields($context): array
{
$document_service = $context->workflow->GetService('DocumentService');
$document_fields = $document_service->getDocument($context->getDocumentId());
return is_array($document_fields) ? $document_fields : [];
}
$document_fields = fetchDocumentFields($this);
$this->WriteToTrackingService(
print_r($document_fields, true),
0,
\CBPTrackingType::Report
); Получить конкретное поле
После получения документа можно брать нужное поле из массива. Код поля зависит от документа: для сделки это одни поля, для элемента списка — другие.
/**
* Получает значение поля документа.
*/
function fetchDocumentFieldValue(array $document_fields, string $field_id)
{
return $document_fields[$field_id] ?? null;
}
$document_fields = fetchDocumentFields($this);
$title = (string) fetchDocumentFieldValue($document_fields, 'TITLE');
$this->SetVariable('document_title', $title);
Не нужно вставлять в PHP-код {=Document:TITLE}. Если поле пустое
или содержит кавычки, можно получить синтаксическую ошибку ещё до выполнения кода.
Изменение документа
Читать документ можно через DocumentService, а изменять лучше через API той
сущности, по которой запущен процесс.
Почему не через $this
$this — это контекст действия бизнес-процесса. Через него удобно работать
с переменными, константами и отчётом, но саму CRM-карточку лучше менять через
CCrmDeal, фабрику CRM, ORM смарт-процесса или стандартное действие
изменения документа.
Изменить сделку CRM
Пример ниже подходит как заготовка для CRM-документа сделки. Для другого документа
сначала выведите getDocumentId() и проверьте формат.
\Bitrix\Main\Loader::includeModule('crm');
/**
* Получает ID сущности из document id.
*/
function fetchEntityIdFromDocumentId($context): int
{
$document_ids = $context->getDocumentId();
$document_code = is_array($document_ids) ? (string) end($document_ids) : (string) $document_ids;
preg_match('/(\d+)$/', $document_code, $matches);
return isset($matches[1]) ? (int) $matches[1] : 0;
}
/**
* Изменяет поле сделки.
*/
function updateDealField(int $deal_id, string $field_id, $field_value): bool
{
if ($deal_id <= 0) {
return false;
}
$deal = new \CCrmDeal();
return (bool) $deal->Update(
$deal_id,
[
$field_id => $field_value,
]
);
}
$deal_id = fetchEntityIdFromDocumentId($this);
$is_updated = updateDealField($deal_id, 'TITLE', 'Новое название сделки');
$this->WriteToTrackingService(
$is_updated ? 'Сделка обновлена' : 'Сделка не обновлена',
0,
\CBPTrackingType::Report
);