← Назад к справке

CRM

Дела

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

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

Основные операции

Базовая работа с делом: получить список дел, изменить дело или удалить его.

Получить дела по основному владельцу

Такой вариант получает дела, у которых указанная CRM-сущность является основным владельцем. Например, если дело напрямую принадлежит сделке.

<?php

use Bitrix\Main\Loader;

const CRM_DEAL_TYPE_ID = 2;

Loader::includeModule('crm');

/**
 * Получает дела, у которых сущность является основным владельцем.
 */
function fetchActivitiesByOwner(int $owner_id, int $owner_type_id): array
{
    $activities = [];

    $activity_result = CCrmActivity::GetList(
        ['ID' => 'ASC'],
        [
            'OWNER_ID' => $owner_id,
            'OWNER_TYPE_ID' => $owner_type_id,
        ],
        false,
        false,
        ['*']
    );

    while ($activity = $activity_result->Fetch()) {
        $activities[] = $activity;
    }

    return $activities;
}

$activities = fetchActivitiesByOwner($deal_id, CRM_DEAL_TYPE_ID);

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

Изменить дело

Например, можно отметить дело как завершённое. В примере каждая операция вынесена в отдельную функцию, чтобы код было проще читать и переиспользовать.

<?php

use Bitrix\Main\Loader;

Loader::includeModule('crm');

/**
 * Отмечает дело как завершённое.
 */
function completeActivity(int $activity_id): void
{
    CCrmActivity::Update(
        $activity_id,
        [
            'COMPLETED' => 'Y',
        ],
        false
    );
}

completeActivity($activity_id);

Удалить дело

Если удаление не прошло, ошибки можно получить через CCrmActivity::GetErrorMessages().

<?php

use Bitrix\Main\Loader;

Loader::includeModule('crm');

/**
 * Удаляет дело.
 */
function deleteActivity(int $activity_id): bool
{
    return CCrmActivity::Delete($activity_id);
}

/**
 * Получает ошибки удаления дела.
 */
function fetchActivityErrorMessages(): array
{
    return CCrmActivity::GetErrorMessages();
}

$is_deleted = deleteActivity($activity_id);

if ($is_deleted) {
    // Дело удалено
} else {
    $error_messages = fetchActivityErrorMessages();

    var_dump($error_messages);
}

Привязки

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

Получить дела, которые видны в карточке

Если нужно получить именно те дела, которые отображаются в карточке, лучше искать через BINDINGS. Так можно учесть дополнительные привязки дела к CRM-сущностям.

<?php

use Bitrix\Main\Loader;

const CRM_DEAL_TYPE_ID = 2;

Loader::includeModule('crm');

/**
 * Получает дела, которые привязаны к карточке через bindings.
 */
function fetchActivitiesByBindings(int $owner_id, int $owner_type_id): array
{
    $activities = [];

    $activity_result = CCrmActivity::GetList(
        ['ID' => 'ASC'],
        [
            'BINDINGS' => [
                [
                    'OWNER_ID' => $owner_id,
                    'OWNER_TYPE_ID' => $owner_type_id,
                ],
            ],
        ],
        false,
        false,
        ['*']
    );

    while ($activity = $activity_result->Fetch()) {
        $activities[] = $activity;
    }

    return $activities;
}

$activities = fetchActivitiesByBindings($deal_id, CRM_DEAL_TYPE_ID);

Получить привязки дела

Привязки показывают, с какими CRM-сущностями связано дело. Именно они объясняют, почему одно и то же дело может быть видно в нескольких карточках.

<?php

use Bitrix\Main\Loader;

Loader::includeModule('crm');

/**
 * Получает список привязок дела.
 */
function fetchActivityBindings(int $activity_id): array
{
    return CCrmActivity::GetBindings($activity_id);
}

$activity_bindings = fetchActivityBindings($activity_id);

Добавить привязку к делу

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

<?php

use Bitrix\Main\Loader;

const CRM_DEAL_TYPE_ID = 2;

Loader::includeModule('crm');

/**
 * Получает список привязок дела.
 */
function fetchActivityBindings(int $activity_id): array
{
    return CCrmActivity::GetBindings($activity_id);
}

/**
 * Добавляет новую привязку к списку привязок дела.
 */
function addActivityBinding(array $activity_bindings, int $owner_id, int $owner_type_id): array
{
    $activity_bindings[] = [
        'OWNER_ID' => $owner_id,
        'OWNER_TYPE_ID' => $owner_type_id,
    ];

    return $activity_bindings;
}

/**
 * Сохраняет список привязок дела.
 */
function saveActivityBindings(int $activity_id, array $activity_bindings): void
{
    CCrmActivity::SaveBindings($activity_id, $activity_bindings, false, false, true);
}

$activity_bindings = fetchActivityBindings($activity_id);
$activity_bindings = addActivityBinding($activity_bindings, $deal_id, CRM_DEAL_TYPE_ID);

saveActivityBindings($activity_id, $activity_bindings);

Коротко про OWNER_ID и BINDINGS

  • OWNER_ID — основной владелец дела.
  • OWNER_TYPE_ID — тип CRM-сущности владельца.
  • BINDINGS — дополнительные привязки, через которые дело видно в других карточках.
  • Если нужно получить только “родные” дела сущности — можно фильтровать по OWNER_ID.
  • Если нужно получить то, что видно в карточке, — лучше смотреть в сторону BINDINGS.

События

События CRM activity позволяют реагировать на добавление, изменение и удаление дел.

Список событий CRM activity

Для дел CRM есть отдельные события, которые можно использовать при добавлении, изменении и удалении дела.

Событие Когда вызывается Метод
OnActivityAdd После добавления дела к сущности. CCrmActivity::Add
OnActivityUpdate После изменения дела. CCrmActivity::Update
OnBeforeActivityDelete Перед удалением дела. CCrmActivity::Delete
OnActivityDelete После удаления дела. CCrmActivity::Delete

На практике чаще всего нужны два сценария: отреагировать на изменение дела или остановить удаление дела при определённых условиях.

Обработчик после добавления дела

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

<?php

use Bitrix\Main\EventManager;

$event_manager = EventManager::getInstance();

/**
 * Регистрирует обработчик после добавления дела.
 */
function registerActivityAddHandler(EventManager $event_manager): void
{
    $event_manager->addEventHandlerCompatible(
        'crm',
        'OnActivityAdd',
        'handleActivityAdd'
    );
}

/**
 * Обрабатывает добавление дела.
 */
function handleActivityAdd(int $activity_id, array $activity_fields): void
{
    // Здесь можно добавить свою логику после создания дела
}

registerActivityAddHandler($event_manager);

Обработчик после изменения дела

Этот вариант подходит, если нужно реагировать на изменение полей дела: завершение, смену ответственного, изменение связей или других данных.

<?php

use Bitrix\Main\EventManager;

$event_manager = EventManager::getInstance();

/**
 * Регистрирует обработчик после изменения дела.
 */
function registerActivityUpdateHandler(EventManager $event_manager): void
{
    $event_manager->addEventHandlerCompatible(
        'crm',
        'OnActivityUpdate',
        'handleActivityUpdate'
    );
}

/**
 * Обрабатывает изменение дела.
 */
function handleActivityUpdate(int $activity_id, array $activity_fields): void
{
    // Здесь можно добавить свою логику после изменения дела
}

registerActivityUpdateHandler($event_manager);

Обработчик перед удалением дела

Событие OnBeforeActivityDelete удобно использовать, если удаление нужно проверить или запретить.

<?php

use Bitrix\Main\EventManager;

$event_manager = EventManager::getInstance();

/**
 * Регистрирует обработчик перед удалением дела.
 */
function registerBeforeActivityDeleteHandler(EventManager $event_manager): void
{
    $event_manager->addEventHandlerCompatible(
        'crm',
        'OnBeforeActivityDelete',
        'handleBeforeActivityDelete'
    );
}

/**
 * Проверяет возможность удаления дела.
 */
function handleBeforeActivityDelete(int $activity_id): bool
{
    $has_delete_access = false;

    if (!$has_delete_access) {
        return false;
    }

    return true;
}

registerBeforeActivityDeleteHandler($event_manager);

Обработчик после удаления дела

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

<?php

use Bitrix\Main\EventManager;

$event_manager = EventManager::getInstance();

/**
 * Регистрирует обработчик после удаления дела.
 */
function registerActivityDeleteHandler(EventManager $event_manager): void
{
    $event_manager->addEventHandlerCompatible(
        'crm',
        'OnActivityDelete',
        'handleActivityDelete'
    );
}

/**
 * Обрабатывает удаление дела.
 */
function handleActivityDelete(int $activity_id): void
{
    // Здесь можно добавить логирование или очистку связанных данных
}

registerActivityDeleteHandler($event_manager);

Источники