Работа с процессами

Все взаимодействие с новым API CRM и смарт-процессами в частности осуществляется посредством взаимодействия с сервисами из контейнера \Bitrix\Crm\Service\Container. Это означает что перед выполнением любой операции необходимо сначала получить контейнер, затем достать из него нужный сервис и уже после выполнить действие.

Несмотря на то что в некоторых случаях можно обойтись без контейнеров, использование их строго рекомендовано, чтобы обеспечивать возможность наследования и переопределения действий.

Пример получения контейнера для дальнейшей работы:

use \Bitrix\Crm\Service;

/**
 * @var Container
 */
$container = Service\Container::getInstance();

Получить зарегистрированные процессы

Для получения списка смарт-процессов необходимо сначала получить название таблета, с которым можно работать, как и с любым другим DataManager объектом.

use \Bitrix\Crm\Service;

/**
 * @var Container
 */
$container = Service\Container::getInstance();

/**
 * @var \Bitrix\Crm\Model\Dynamic\TypeTable
 */
$typeDataClass = $container->getDynamicTypeDataClass();

/**
 * @var Bitrix\Main\ORM\Query\Result
 */
$listDynamicTypes = $typeDataClass::getList([
    'select' => ['*']
]);

Создание и редактирование процесса

При работе с ORM нет отдельных операций на создание и редактирование процесса, вместо этого все это определяется единым методом сохранения и обновлением сопутствующей информации.

Ход сохранения смарт-процесса:

  • Получение объекта (\Bitrix\Crm\Model\Dynamic\Type)
  • Изменение полей. Сохранение смарт-процесса.
  • Сохранение конверсионной схемы
  • Обновление разрешений для пользовательских полей
  • Обновление связей
  • Обновление раздела (если выводится в собственном разделе)

Рассмотрим пример создания своего смарт-процесса: предположим нам необходимо создать типовой смарт-процесс для хранения NDA (соглашение о неразглашении) со стандартными полями (Название, Ответственный), привязкой к задачам. В данном примере мы не будем обновлять связи, не затрагиваем конверсионную карту и не будем обновлять отдельный раздел.

use \Bitrix\Crm\Service,
    \Bitrix\Crm\UserField;

/**
 * @var Container
 */
$container = Service\Container::getInstance();

/**
 * @var \Bitrix\Crm\Model\Dynamic\TypeTable
 */
$typeDataClass = $container->getDynamicTypeDataClass();

/**
 * @var \Bitrix\Crm\Model\Dynamic\Type
 */
$type = $typeDataClass::createObject();

$type->set('TITLE', 'NDA') // Заголовок
     ->set('CODE', 'NDA') // Символьный код.
     ->set('IS_USE_IN_USERFIELD_ENABLED', 'Y') // Флаг, разрешающий использование польз.полей.
    ;

/**
 * @var \Bitrix\Main\Result
 */
$result = $type->save();

if ( !$result->isSuccess() )
{
    /**
     * Get error \Bitrix\Main\Error[] $result->getErrors()
     * Get error messages string[] $result->getErrorMessages()
     */
    reutrn;
}

$entityTypeName = \CCrmOwnerType::ResolveName($type->getEntityTypeId());

$settings = [
    'TASKS_TASK|UF_CRM_TASK'          => 'true', // Connected with task
    //'TASKS_TASK_TEMPLATE|UF_CRM_TAS'  => 'true', // Connected with task template
    //'CALENDAR_EVENT|UF_CRM_CAL_EVENT' => 'true', // Connected with calendar event
];

$userFieldsMap = UserField\UserFieldManager::getLinkedUserFieldsMap();

foreach ($settings as $name => $isEnabled)
{
    if (isset($userFieldsMap[$name]))
    {
        UserField\UserFieldManager::enableEntityInUserField(
            $userFieldsMap[$name],
            $entityTypeName,
            $isEnabled === 'true'
        );
    }
}

Удаление процесса

Удаление смарт-процесса мало чем отличается от удаления объекта ORM: необходимо получить объект процесса и вызвать метод удаления.


/**
 * Smart proccess to be deteled
 * @var \Bitrix\Crm\Model\Dynamic\Type
 */
$type;

/**
 * @var \Bitrix\Main\Result
 */
$deleteResult = $type->delete();

if ( !$deleteResult->isSuccess() )
{
    /**
     * Some errors when delete $type.
     * Get \Bitrix\Main\Errors[] = $deleteResult->getErrors();
     * Or get string[] = $deleteResult->getErrorMessages()
     */
}