Как сделать обязательным заполнение поля в карточке CRM по условию?

Добавляя поля в карточки CRM, менеджер проставляет признак обязательности заполнения поля. При этом, часто необходимо настроить более сложные условия, связанные с тем, что поле становится обязательным для заполнения лишь при определенных условиях. В противном случае сделка или контакт не будет сохранен.

В стандартных настройках заложен лишь один сценарий, связанный с обязательными полями в сделках. Как быть с прочими сценариями. Например, в сделке медицинской организации есть поле «Пациенту требуется электрокардиограмма» (первое поле) и дополнительное поле «Дата снятия электрокардиограммы» (второе поле), становящееся обязательным для заполнения, если первое поле имеет значения да.

В таких случаях, на помощь в коробочной версии придет обработчик события

OnBeforeCrmDealUpdate

или аналогичный обработчик для любой другой сущности CRM. Добавьте в функцию обработчика следующий код:

$arFilterDeal = array('ID'=>$dealId);
$arSelectDeal = array('ID','UF_код1поля', 'UF_код2поля');
// смотрим какие значения у полей в базе
$obResDeal = CCrmDeal::GetListEx(false,$arFilterDeal,false,false,$arSelectDeal)->Fetch();
// сценарий если пользователь не ввел дату
if($arFields['UF_код1поля']=='код значения да' && !$arFields['UF_код2поля']) {
    if(!$obResDeal['UF_код2поля']) {
        $arFields['RESULT_MESSAGE'] = "Поле 2 должно быть заполнено";
        $APPLICATION->ThrowException($arFields['RESULT_MESSAGE']);
        return false;
    }    
// сценарий, если пользователь вводит дату для значения нет 
} else if($arFields['UF_код1поля'] != 'код значения да' && $arFields['UF_UF_код2поля']) {
    if($obResDeal['UF_код1поля'] != 'код значения да') {
        $arFields['RESULT_MESSAGE'] = "Поле 1 должно иметь значение да";
        $APPLICATION->ThrowException($arFields['RESULT_MESSAGE']);
        return false;
    }
}
// сценарий если пользователь удаляет дату
if (array_key_exists('UF_код2поля', $arFields) && $arFields['UF_UF_код2поля']==""
    && $obResDeal['UF_код1поля']=='код значения да') {
    $arFields['RESULT_MESSAGE'] = "Поле дата не может быть пустой";
    $APPLICATION->ThrowException($arFields['RESULT_MESSAGE']);
    return false;
}

Как вы понимаете, конструкция

 $APPLICATION->ThrowException($arFields['RESULT_MESSAGE']

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