@web_bitrix

Почему иногда не срабатывает событие?

Привет всем. У меня есть событие, которое срабатывает до создания компании и проверяет, существует ли уже такая компания, чтобы избежать дублирования. Код работает, но порой возникает ситуация, когда пользователь вводит название компании, которая уже существует, и тогда этот код почему-то не работает.

Сам код:
AddEventHandler('crm', 'OnBeforeCrmCompanyAdd',  'OnBeforeCrmCompanyAddHandler');
function OnBeforeCrmCompanyAddHandler(&$arFields) {
   $res = CCrmCompany::getList($arFields["ID"]);
$companyExists = false;

while ($result = $res->Fetch()) {
    if ($result["TITLE"] == $arFields["TITLE"]) {
        $companyExists = true;
        break;
    }
}

if ($companyExists) {
    $arFields["RESULT_MESSAGE"] = "Данная компания уже существует!";
    return false;
} else {
    return true;
}
}
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
Вы неправильно используете аргументы в CCrmCompany::getList(), из-за этого получаете вообще все компании и вынуждены их перебирать. Плюс, для событий "OnBefore....Add" ключ ID не может существовать - ведь такие события происходят до создания новой записи ( в смысле элемента, раздела, компании ).

Должно быть что-то такое ( префиксный фильтр в arFilter должен работать, но я не проверял ):
function OnBeforeCrmCompanyAddHandler(&$arFields)
{
    $res = CCrmCompany::getList(['ID' => 'ASC'], ['=TITLE' => $arFields["TITLE"]], ['ID'], 1);
    if ($res->Fetch()) {
        $arFields["RESULT_MESSAGE"] = "Данная компания уже существует!";
        return false;
    }
    return true;
}

Список префиксов можно посмотреть в файле bitrix/modules/main/classes/general/sqlwhere.php , в свойстве $operations
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы