Описание

Активности (дела) в Битрикс24 — это запланированные или завершенные действия, связанные с элементами CRM: звонки, встречи, письма, задачи. Данный раздел содержит примеры PHP-кода для работы с активностями компаний. Вы можете использовать эти примеры для получения истории взаимодействий с клиентами, автоматического создания напоминаний и планирования действий в бизнес-процессах.

Активности позволяют отслеживать всю коммуникацию с компанией и планировать будущие взаимодействия, что критично для управления клиентскими отношениями.

Примеры использования

Пример 1: Получение активностей компании

Этот пример показывает, как получить список активностей (всех дел), связанных с компанией.

  • Установлен лимит: не больше 500 активностей (лимит можно изменить в строке 28-31)
  use Bitrix\Crm\ActivityTable;
use Bitrix\Main\Loader;

Loader::includeModule('crm');

// ВХОДНОЙ ПАРАМЕТР: ID компании
$companyId = "{{CompanyID}}";

// Валидация входных данных
if (empty($companyId)) {
    $this->WriteToTrackingService("[ERROR] Не передан ID компании");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Отсутствует обязательный параметр CompanyID");
    return;
}

$companyId = (int)$companyId;

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    // ПОЛУЧЕНИЕ ДАННЫХ: Выборка активностей компании
    $activities = ActivityTable::getList([
        'filter' => [
            '=OWNER_TYPE_ID' => \CCrmOwnerType::Company,
            '=OWNER_ID' => $companyId
        ],
        'select' => ['ID'], // Выбираем только ID для оптимизации запроса
        'order' => ['DEADLINE' => 'DESC'],
        'limit' => 500,
        'cache' => ['ttl' => 3600]
    ])->fetchAll();
    
    if (empty($activities)) {
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("ActivityIDs", array());
        $rootActivity->SetVariable("FoundCount", 0);
        $rootActivity->SetVariable("Status", "NOT_FOUND");
        return;
    }
    
    $activityIDs = array();
    foreach ($activities as $activity) {
        $activityIDs[] = $activity['ID'];
    }
    
    // Проверка лимита
    if (count($activities) >= 500) {
        $this->WriteToTrackingService("[WARNING] Достигнут лимит выборки 500 записей, возможны необработанные активности");
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Массив ID активностей и статус
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("ActivityIDs", $activityIDs);
    $rootActivity->SetVariable("FoundCount", count($activityIDs));
    $rootActivity->SetVariable("Status", "SUCCESS");
    
} catch (\Exception $e) {
    $this->WriteToTrackingService("[CRITICAL] Ошибка получения активностей: " . $e->getMessage());
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "DB_ERROR");
    $rootActivity->SetVariable("ErrorMessage", $e->getMessage());
}
  

Входные параметры:

ПараметрТипОписаниеОбязательный
CompanyIDint/stringID компанииДа

Выходные переменные:

ПеременнаяТипОписание
ActivityIDsarrayМассив ID активностей компании
FoundCountintКоличество найденных активностей
StatusstringСтатус выполнения: SUCCESS, NOT_FOUND, INPUT_ERROR, MODULE_ERROR, DB_ERROR
ErrorMessagestringОписание ошибки (заполняется при ошибках)

Возможные ошибки:

СтатусПричинаРешение
INPUT_ERRORНе передан CompanyIDПередать ID компании
MODULE_ERRORМодуль CRM не установленПроверить установку модуля
NOT_FOUNDАктивности не найденыПроверить наличие дел у компании
DB_ERRORОшибка при работе с базой данныхПроверить логи системы

Рекомендации по использованию:

  • Всегда проверяйте переменную Status в следующих шагах БП
  • Используйте фильтр COMPLETED для разделения завершённых и активных дел
  • Для получения конкретных типов активностей используйте фильтр TYPE_ID
  • Типы активностей: \CCrmActivityType::Call (звонок), \CCrmActivityType::Meeting (встреча), \CCrmActivityType::Email (письмо)

Пример 2: Получение незавершённых активностей (звонков) с фильтрацией по типу

Этот пример демонстрирует получение только незавершённых активностей определённого типа.

  • Установлен лимит: не больше 500 активностей (лимит можно изменить в строке 35-38)
  use Bitrix\Crm\ActivityTable;
use Bitrix\Main\Loader;

Loader::includeModule('crm');

// ВХОДНЫЕ ПАРАМЕТРЫ: ID компании и тип активности
$companyId = "{{CompanyID}}";
$activityTypeId = 2; // 1-Встреча, 2-Звонок, 4-Email

// Валидация входных данных
if (empty($companyId) || empty($activityTypeId)) {
    $this->WriteToTrackingService("[ERROR] Не переданы обязательные параметры CompanyID или ActivityTypeID");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Отсутствуют параметры для фильтрации");
    return;
}

$companyId = (int)$companyId;
$activityTypeId = (int)$activityTypeId;

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    // ФИЛЬТРАЦИЯ: Выборка незавершённых активностей по типу
    $activities = ActivityTable::getList([
        'filter' => [
            '=OWNER_TYPE_ID' => \CCrmOwnerType::Company,
            '=OWNER_ID' => $companyId,
            '=TYPE_ID' => $activityTypeId,
            '=COMPLETED' => 'N' // Только незавершённые активности
        ],
        'select' => ['ID'], // Выбираем только ID для оптимизации запроса
        'order' => ['DEADLINE' => 'DESC'],
        'limit' => 500,
        'cache' => ['ttl' => 3600]
    ])->fetchAll();
    
    if (empty($activities)) {
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("ActivityIDs", array());
        $rootActivity->SetVariable("FoundCount", 0);
        $rootActivity->SetVariable("Status", "NOT_FOUND");
        return;
    }
    
    $activityIDs = array();
    foreach ($activities as $activity) {
        $activityIDs[] = $activity['ID'];
    }
    
    if (count($activities) >= 500) {
        $this->WriteToTrackingService("[WARNING] Достигнут лимит выборки, возможны необработанные записи");
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Массив ID активностей и статус
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("ActivityIDs", $activityIDs);
    $rootActivity->SetVariable("FoundCount", count($activityIDs));
    $rootActivity->SetVariable("Status", "SUCCESS");
    
} catch (\Exception $e) {
    $this->WriteToTrackingService("[CRITICAL] Ошибка фильтрации активностей: " . $e->getMessage());
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "DB_ERROR");
    $rootActivity->SetVariable("ErrorMessage", $e->getMessage());
}
  

Входные параметры:

ПараметрТипОписаниеОбязательный
CompanyIDint/stringID компанииДа
ActivityTypeIDint/stringID типа активности (1-Встреча, 2-Звонок, 4-Email). Как узнать?Да

Выходные переменные:

ПеременнаяТипОписание
ActivityIDsarrayМассив ID активностей указанного типа
FoundCountintКоличество найденных активностей
StatusstringСтатус выполнения операции
ErrorMessagestringОписание ошибки

Возможные ошибки:

СтатусПричинаРешение
INPUT_ERRORНе переданы обязательные параметрыПередать CompanyID и ActivityTypeID
MODULE_ERRORМодуль CRM не установленПроверить установку модуля
NOT_FOUNDНезавершённые активности указанного типа не найденыПроверить наличие активных дел
DB_ERRORОшибка при выполнении запроса к БДПроверить логи системы

Типы активностей в Битрикс24:

IDКонстантаОписание
1\CCrmActivityType::MeetingВстреча
2\CCrmActivityType::CallЗвонок
4\CCrmActivityType::EmailEmail
6\CCrmActivityType::TaskЗадача

Рекомендации по использованию:

  • Используйте константы \CCrmActivityType::* для типобезопасности
  • Фильтр '=COMPLETED' => 'N' возвращает только активные (незавершённые) дела
  • Для получения истории (завершённых дел) используйте '=COMPLETED' => 'Y'
  • Комбинируйте фильтры для точного поиска (тип + статус + период)
  • Этот пример идеален для получения актуальных задач по работе с компанией

Пример 3: Production-ready создание активности (исходящего звонка) для компании

Продвинутый пример создания новой активности с полной валидацией и обработкой ошибок.

  use Bitrix\Crm\ActivityTable;
use Bitrix\Main\Type\DateTime;
use Bitrix\Main\Loader;

Loader::includeModule('crm');

// ВХОДНЫЕ ПАРАМЕТРЫ: Данные для создания активности
$companyId = "{{CompanyID}}";
$responsibleId = "{{ResponsibleUserID}}";
$subject = "{{Subject}}";
$description = "{{Description}}";

// Валидация входных данных
if (empty($companyId) || empty($responsibleId)) {
    $this->WriteToTrackingService("[ERROR] Не переданы обязательные параметры CompanyID или ResponsibleUserID");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Отсутствуют обязательные параметры");
    return;
}

$companyId = (int)$companyId;
$responsibleId = (int)$responsibleId;

// Установка значений по умолчанию
if (empty($subject)) {
    $subject = "Плановый звонок клиенту";
}

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    // СЛОЖНАЯ ЛОГИКА: Подготовка данных для создания активности
    $deadline = new DateTime();
    $deadline->add("+1 day"); // Активность на завтра
    
    $fields = array(
        'OWNER_TYPE_ID' => \CCrmOwnerType::Company,
        'OWNER_ID' => $companyId,
        'TYPE_ID' => \CCrmActivityType::Call,
        'SUBJECT' => $subject,
        'DESCRIPTION' => $description,
        'DEADLINE' => $deadline,
        'COMPLETED' => 'N',
        'PRIORITY' => \CCrmActivityPriority::Medium,
        'RESPONSIBLE_ID' => $responsibleId,
        'AUTHOR_ID' => $responsibleId,
        'DIRECTION' => \Bitrix\Crm\ActivityDirection::Outgoing
    );
    
    // СОЗДАНИЕ: Добавление активности
    $result = ActivityTable::add($fields);
    
    if (!$result->isSuccess()) {
        $errors = $result->getErrorMessages();
        $this->WriteToTrackingService("[ERROR] Ошибка создания активности: " . implode(", ", $errors));
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "CREATE_ERROR");
        $rootActivity->SetVariable("ErrorMessage", implode(", ", $errors));
        return;
    }
    
    $newActivityId = $result->getId();
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: ID созданной активности и статус
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("NewActivityID", $newActivityId);
    $rootActivity->SetVariable("Status", "SUCCESS");
    
    $this->WriteToTrackingService("[SUCCESS] Активность создана. ID: " . $newActivityId);
    
} catch (\Exception $e) {
    $this->WriteToTrackingService("[CRITICAL] Ошибка при создании активности: " . $e->getMessage());
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "DB_ERROR");
    $rootActivity->SetVariable("ErrorMessage", $e->getMessage());
}
  

Входные параметры:

ПараметрТипОписаниеОбязательный
CompanyIDint/stringID компанииДа
ResponsibleUserIDint/stringID ответственного пользователяДа
SubjectstringТема активностиНет
DescriptionstringОписание активностиНет

Выходные переменные:

ПеременнаяТипОписание
NewActivityIDintID созданной активности
StatusstringСтатус выполнения операции
ErrorMessagestringОписание ошибки (если есть)

Возможные ошибки:

СтатусПричинаРешение
INPUT_ERRORНе переданы обязательные параметрыПередать CompanyID и ResponsibleUserID
MODULE_ERRORМодуль CRM не установленПроверить установку модуля
CREATE_ERRORОшибка при создании активностиПроверить корректность данных и права доступа
DB_ERRORОшибка при работе с базой данныхПроверить логи системы

Рекомендации по использованию:

  • Всегда указывайте DEADLINE для активности - это критично для планирования
  • Используйте DIRECTION для указания направления (входящий/исходящий звонок)
  • Для создания встречи измените TYPE_ID на \CCrmActivityType::Meeting
  • Проверяйте права пользователя на создание активностей
  • Используйте PRIORITY для установки приоритета: High, Medium, Low

Фича примера кода №3:

Данный пример демонстрирует production-ready подход с:

  • Полной валидацией всех обязательных параметров
  • Установкой значений по умолчанию для опциональных полей
  • Детальной обработкой ошибок на всех этапах
  • Логированием успешного создания с ID активности
  • Гибкой настройкой срока выполнения (deadline)

Этот код можно использовать как основу для автоматического создания напоминаний и планирования взаимодействий с клиентами.


Общие рекомендации по использованию

  • Валидация: Всегда проверяйте обязательные параметры (CompanyID, ResponsibleUserID) перед операциями
  • Статусы: Проверяйте переменную Status в следующих шагах БП для обработки различных сценариев
  • Типы активностей: Используйте константы \CCrmActivityType::* для типобезопасности
  • Фильтрация: Комбинируйте фильтры (тип + статус + период) для точного поиска
  • Производительность: Используйте кеширование для часто запрашиваемых данных
  • Безопасность: Всегда приводите ID к типу int перед использованием

Связанные статьи