PHP: Работа с комментариями компаний в Битрикс24
Примеры PHP-кода для получения и добавления комментариев к компаниям в Битрикс24: получение списка комментариев, добавление новых, фильтрация по автору.
Описание
Комментарии в Битрикс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());
}
Входные параметры:
| Параметр | Тип | Описание | Обязательный |
|---|---|---|---|
| CompanyID | int/string | ID компании | Да |
Выходные переменные:
| Переменная | Тип | Описание |
|---|---|---|
| CommentIDs | array | Массив ID комментариев компании |
| FoundCount | int | Количество найденных комментариев |
| Status | string | Статус выполнения: SUCCESS, NOT_FOUND, INPUT_ERROR, MODULE_ERROR, DB_ERROR |
| ErrorMessage | string | Описание ошибки (заполняется при ошибках) |
Возможные ошибки:
| Статус | Причина | Решение |
|---|---|---|
| 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());
}
Входные параметры:
| Параметр | Тип | Описание | Обязательный |
|---|---|---|---|
| CompanyID | int/string | ID компании | Да |
| AuthorID | int/string | ID автора комментариев | Да |
Выходные переменные:
| Переменная | Тип | Описание |
|---|---|---|
| CommentIDs | array | Массив ID комментариев указанного автора |
| FoundCount | int | Количество найденных комментариев |
| Status | string | Статус выполнения операции |
| ErrorMessage | string | Описание ошибки |
Возможные ошибки:
| Статус | Причина | Решение |
|---|---|---|
| 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());
}
Входные параметры:
| Параметр | Тип | Описание | Обязательный |
|---|---|---|---|
| CompanyID | int/string | ID компании | Да |
| CommentText | string | Текст комментария | Да |
| AuthorID | int/string | ID автора комментария | Да |
Выходные переменные:
| Переменная | Тип | Описание |
|---|---|---|
| NewCommentID | int | ID созданного комментария |
| Status | string | Статус выполнения операции |
| ErrorMessage | string | Описание ошибки (если есть) |
Возможные ошибки:
| Статус | Причина | Решение |
|---|---|---|
| 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 перед использованием
Связанные статьи
- Коды полей и идентификаторы - справочник кодов полей
- Получение компаний - выборка компаний для работы с комментариями
- Работа с активностями компаний - получение и создание дел
- Работа с реквизитами компаний - управление реквизитами
Хотите следить за обновлениями?