Описание

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

Комментарии отображаются в таймлайне компании и доступны всем сотрудникам с правами доступа к карточке компании.

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

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

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

  • Установлен лимит: не больше 500 комментариев (лимит можно изменить в строке 28-31)
  use Bitrix\Crm\Timeline\CommentEntry;
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;
    }
    
    // ПОЛУЧЕНИЕ ДАННЫХ: Выборка комментариев компании
    $comments = CommentEntry::getList([
        'filter' => [
            '=ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
            '=ENTITY_ID' => $companyId
        ],
        'select' => ['ID'],
        'order' => ['CREATED_TIME' => 'DESC'],
        'limit' => 500
    ])->fetchAll();
    
    if (empty($comments)) {
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("CommentIDs", array());
        $rootActivity->SetVariable("FoundCount", 0);
        $rootActivity->SetVariable("Status", "NOT_FOUND");
        return;
    }
    
    $commentIDs = array();
    foreach ($comments as $comment) {
        $commentIDs[] = $comment['ID'];
    }
    
    // Проверка лимита
    if (count($comments) >= 500) {
        $this->WriteToTrackingService("[WARNING] Достигнут лимит выборки 500 записей, возможны необработанные комментарии");
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Массив ID комментариев и статус
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("CommentIDs", $commentIDs);
    $rootActivity->SetVariable("FoundCount", count($commentIDs));
    $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 компанииДа

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

ПеременнаяТипОписание
CommentIDsarrayМассив 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 в следующих шагах БП
  • Комментарии сортируются по дате создания (сначала новые)
  • Для получения полного текста комментариев добавьте в select поле COMMENT
  • Используйте фильтр по AUTHOR_ID для получения комментариев конкретного автора

Пример 2: Получение комментариев с фильтрацией по автору

Этот пример демонстрирует получение комментариев определённого автора.

  • Установлен лимит: не больше 500 комментариев (лимит можно изменить в строке 30-33)
  use Bitrix\Crm\Timeline\CommentEntry;
use Bitrix\Main\Loader;

Loader::includeModule('crm');

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

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

$companyId = (int)$companyId;
$authorId = (int)$authorId;

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    // ФИЛЬТРАЦИЯ: Выборка комментариев по автору
    $comments = CommentEntry::getList([
        'filter' => [
            '=ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
            '=ENTITY_ID' => $companyId,
            '=AUTHOR_ID' => $authorId
        ],
        'select' => ['ID', 'COMMENT', 'CREATED_TIME'],
        'order' => ['CREATED_TIME' => 'DESC'],
        'limit' => 500
    ])->fetchAll();
    
    if (empty($comments)) {
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("CommentIDs", array());
        $rootActivity->SetVariable("FoundCount", 0);
        $rootActivity->SetVariable("Status", "NOT_FOUND");
        return;
    }
    
    $commentIDs = array();
    foreach ($comments as $comment) {
        $commentIDs[] = $comment['ID'];
    }
    
    if (count($comments) >= 500) {
        $this->WriteToTrackingService("[WARNING] Достигнут лимит выборки, возможны необработанные записи");
    }
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: Массив ID комментариев и статус
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("CommentIDs", $commentIDs);
    $rootActivity->SetVariable("FoundCount", count($commentIDs));
    $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 компанииДа
AuthorIDint/stringID автора комментариевДа

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

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

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

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

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

  • Используйте фильтр по автору для анализа активности сотрудников
  • В select добавлено поле COMMENT для получения текста комментариев
  • Поле CREATED_TIME позволяет отследить время создания комментария
  • Комбинируйте фильтры для более точного поиска (автор + период времени)

Пример 3: Production-ready добавление комментария к компании

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

  use Bitrix\Crm\Timeline\CommentEntry;
use Bitrix\Main\Type\DateTime;
use Bitrix\Main\Loader;

Loader::includeModule('crm');

// ВХОДНЫЕ ПАРАМЕТРЫ: Данные для создания комментария
$companyId = "{{CompanyID}}";
$commentText = "{{CommentText}}";
$authorId = "{{AuthorID}}";

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

$companyId = (int)$companyId;
$authorId = (int)$authorId;

// Дополнительная валидация текста комментария
$commentText = trim($commentText);
if (strlen($commentText) < 1) {
    $this->WriteToTrackingService("[ERROR] Текст комментария пустой после trim");
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "INPUT_ERROR");
    $rootActivity->SetVariable("ErrorMessage", "Текст комментария не может быть пустым");
    return;
}

try {
    if (!Loader::includeModule('crm')) {
        $this->WriteToTrackingService("[ERROR] Модуль CRM не установлен");
        $rootActivity = $this->GetRootActivity();
        $rootActivity->SetVariable("Status", "MODULE_ERROR");
        return;
    }
    
    // СЛОЖНАЯ ЛОГИКА: Подготовка данных для создания комментария
    $fields = array(
        'ENTITY_TYPE_ID' => \CCrmOwnerType::Company,
        'ENTITY_ID' => $companyId,
        'COMMENT' => $commentText,
        'AUTHOR_ID' => $authorId,
        'CREATED_TIME' => new DateTime()
    );
    
    // СОЗДАНИЕ: Добавление комментария
    $result = CommentEntry::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;
    }
    
    $newCommentId = $result->getId();
    
    // ВЫХОДНЫЕ ПАРАМЕТРЫ: ID созданного комментария и статус
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("NewCommentID", $newCommentId);
    $rootActivity->SetVariable("Status", "SUCCESS");
    
    $this->WriteToTrackingService("[SUCCESS] Комментарий создан. ID: " . $newCommentId);
    
} catch (\Exception $e) {
    $this->WriteToTrackingService("[CRITICAL] Ошибка при создании комментария: " . $e->getMessage());
    $rootActivity = $this->GetRootActivity();
    $rootActivity->SetVariable("Status", "DB_ERROR");
    $rootActivity->SetVariable("ErrorMessage", $e->getMessage());
}
  

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

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

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

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

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

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

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

  • Всегда валидируйте текст комментария после trim
  • Комментарий автоматически отобразится в таймлайне компании
  • ID автора должен соответствовать реальному пользователю системы
  • Используйте DateTime() для автоматической установки текущего времени
  • Комментарии видны всем пользователям с доступом к карточке компании

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

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

  • Двухэтапной валидацией (наличие параметров + проверка текста после trim)
  • Автоматической установкой времени создания
  • Детальной обработкой ошибок на всех этапах
  • Логированием успешного создания с ID комментария
  • Защитой от добавления пустых комментариев

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


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

  • Валидация: Всегда проверяйте обязательные параметры (CompanyID, CommentText, AuthorID) перед операциями
  • Статусы: Проверяйте переменную Status в следующих шагах БП для обработки различных сценариев
  • Текст комментариев: Используйте trim для очистки текста от пробелов перед добавлением
  • Производительность: Используйте select только нужных полей для оптимизации запросов
  • Права доступа: Учитывайте, что комментарии видны всем с доступом к компании
  • Безопасность: Всегда приводите ID к типу int перед использованием

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