Вот рабочий код.
Для примера на событие OnBeforeCrmDealUpdate делаем проверку на наличие дел или задач у сделки. Если таковых не имеется, то делаем отмену изменения сделки с последующим уведомлением пользователя,
public static function OnBeforeCrmDealUpdate(&$arFields)
{
// Если у сделки нет активности в виде дел или задач, то запрещаем ее изменять
global $APPLICATION, $USER;
$arActivities = [];
$rsActivities = \CCrmActivity::GetList(
['ID' => 'DESC'],
[
'BINDINGS' => [[
'OWNER_ID' => $arFields['ID'],
'OWNER_TYPE_ID' => 2 // \CCrmOwnerType::Deal не работает, потому что Битрикс
]]
],
false,
false,
['PROVIDER_TYPE_ID', 'ASSOCIATED_ENTITY_ID'] // 'ASSOCIATED_ENTITY_ID'
);
while ($activity = $rsActivities->Fetch()) {
if ($activity['PROVIDER_TYPE_ID'] == 'TODO' || $activity['PROVIDER_TYPE_ID'] == 'TASKS_TASK') {
$arActivities[] = $activity['ASSOCIATED_ENTITY_ID'];
}
}
if (empty($arActivities)) {
$message = 'Изменять или завершать сделку без дела или задачи нельзя!';
if (\CModule::IncludeModule('im')) {
$arMessageFields = array(
"TO_USER_ID" => $USER->GetID(),
"FROM_USER_ID" => 0,
"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
"NOTIFY_MODULE" => "im",
"NOTIFY_TAG" => "",
"NOTIFY_EVENT" => "default",
"NOTIFY_MESSAGE" => $message,
);
\CIMNotify::Add($arMessageFields);
}
$arFields['RESULT_MESSAGE'] = $message;
$APPLICATION->ThrowException($message);
return false;
}
}