В доработке СРМ Битрикс24 часто приходится создавать дополнительные поля для сущностей СРМ - лидов, компаний, контактов, сделок и др.
В принципе в СРМ Битрикс24 создан удобный интерфейс, чтобы добавлять свои поля разного типа без помощи программиста, но для такой сущности как Дела - встречи, звонки, письма - эту возможность не сделали.
Поэтому я хочу рассказать, как я работаю с пользовательскими полями в Битрикс24.
Рассмотрим работу с пользовательскими полями на примере сделки СРМ Битрикс24. С остальными сущностями аналогично.
Во-первых, лучше добавлять новые поля не через форму добавления сделки или в настройках СРМ Битрикс24,

а через административный раздел на странице пользовательских полей.

Потому что так можно задать символьный код для такого поля в удобном для программирования виде.
Пользовательские поля имеют разные типы - строка, список, привязка к элементам и разделам инфоблоков, дата, число, привязка к сущностям СРМ, привязка к справочникам СРМ. Сейчас еще появились новые типы - адрес, шаблон, ссылка - но в СРМ они пока не работают.

Разберем основной код для установки значения пользовательского поля и поиска по пользовательскому полю.
Для работы с пользовательскими полями используется глобальная переменная $USER_FIELD_MANAGER.
Установка значения текстового поля:
$GLOBALS["USER_FIELD_MANAGER"]->Update("CRM_DEAL", $idDeal, Array("UF_NEWPOLE"=>$value));
где "CRM_DEAL" - для какой сущности мы изменяем значение,
$idDeal - id конкретной сделки,
"UF_NEWPOLE" - символьный код пользовательского поля,
$value - одно значение или массив, если поле множественное.
Получение значений пользовательских полей сделки:
$arUserFields1 = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("CRM_DEAL", $idDeal);
Так мы получим массив всех пользовательских полей со значениями для конкретной сделки с id =$idDeal.
Поиск сделок с определенным значением пользовательского поля можно осуществлять через CCrmDeal::GetListEx:
$dbDeal=CCrmDeal::GetListEx(
array("ID"=>"ASC"),
array(">=BEGINDATE"=>$begin,"<=BEGINDATE"=>$end,"!UF_NEWPOLE"=>false),
false,
false,
array("ID","BEGINDATE","STAGE_ID","OPPORTUNITY","ASSIGNED_BY_ID","CLOSEDATE","UF_NEWPOLE"),
array());
while($arDeal=$dbDeal->fetch()){
var_dump($arDeal);
}
Значение, которое устанавливается для сделки, должно быть равно id значения из списка, но если нам приходит, например из 1с, текстовое значение, то сначала мы должны найти это id:
$obEnum = new \CUserFieldEnum;
$rsEnum = $obEnum->GetList(array(), array("USER_FIELD_ID" => $idField));
while($arEnum = $rsEnum->Fetch()){
if($arEnum["VALUE"]==$value){
$idvalue=$arEnum["ID"];
}
}
где $idField - id а не символьный код нашего пользовательского поля типа список.
$value - текстовое значение, которое мы ищем в списке,
$idvalue - id значения из списка, которое мы используем для установки значения сделке в следующем коде:
$GLOBALS["USER_FIELD_MANAGER"]->Update("CRM_DEAL", $idDeal, Array("UF_NEWPOLELIST"=>$idvalue));
$GLOBALS["USER_FIELD_MANAGER"]->Update("CRM_DEAL", $idDeal, Array("UF_DANET"=>$value));
где $value=0 если нет, и $value=1 если да.
Обязательно нужно указать язык 'LANG' => 'ru', тогда придет название поля на русском языке.
$rsData = CUserTypeEntity::GetList(array("ID"=>"ASC"), array("FIELD_NAME"=>"UF_TEST",'LANG' => 'ru'));
while($arRes = $rsData->Fetch())
{
$title= $arRes["EDIT_FORM_LABEL"];
}
$USER_FIELD_MANAGER->AdminListAddFilter(CCrmDeal::$sUFEntityID, $arFilter);
Добавьте обработчик события
EventManager::getInstance()->addEventHandler(
"main",
"onGetPublicView",
["EventHandlers\\UserFieldHandler", "onGetPublicViewHandler"]
);
public static function onGetPublicViewHandler(Event $event): EventResult
{
$arUserField = $event->getParameters()[0];
if ($arUserField['FIELD_NAME'] === "UF_CODE") {
/*измените поле как надо */
$newView = $arUserField['VALUE']. "плюс ваш текст или верстка или дополнительные данные";
return new EventResult(EventResult::SUCCESS, $newView);
}
else{
return new EventResult(EventResult::ERROR);
}
}