6 июня 2025
84

Иногда надо выполнить некоторые действия со сделкой при ее создании. Но редакция 1С-Битрикс24: Интернет-магазин+CRM имеет некоторые нюансы в вызове событий. Например, заказы интернет-магазина в отличие от сделок из CRM продолжают храниться в таблице b_sale_order.

В этой редакции продукта вызывается как OnSaleOrderBeforeSaved, так и OnBeforeCrmDealAdd. Причем массив $arFields в OnBeforeCrmDealAdd отличается структурно при ручном создании Сделки из CRM от того, который приходит при создании Заказа в интернет-магазине.

Мы рассмотрим кейс с обращением к OnBeforeCrmDealAdd используя Bitrix\Main\EventManager.

Итак, задача состояла в том, чтобы при создании Заказа в интернет-магазине автоматически в CRM в Сделке проставлялось поле Источник и Комментарий.

OnSaleOrderBeforeSaved - событие до сохранения заказа

В этом событии у нас есть объект заказа и значения его предыдущих полей (до сохранения). В 1С-Битрикс: Управление сайтом отлично отрабатывает setField для добавления комментария к Заказу из мануала:

//пример использования события OnSaleOrderBeforeSaved
use Bitrix\Main;
Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleOrderBeforeSaved',
'myFunction'
);
//в обработчике изменим комментарий:
function myFunction(Main\Event $event)
{
$order = $event->getParameter("ENTITY");
$order->setField('COMMENTS', 'Новый комментарий');
}

Но в сделку этот комментарий не прокидывается.

OnBeforeCrmDealAdd - событие перед добавлением сделки

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

Самое приятно, что в момент, когда сделки еще нет, но заказ уже создан - мы можем получить по ИД заказа всю необходимую информацию для обогащения сделки. При этом, если сделка создана из CRM руками менеджера, то в массиве $arFields не будет некоторых данных, например ORDER_ID, но будет TYPE_ID. Но данная статья не об этом.

$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandlerCompatible(
'crm',
'OnBeforeCrmDealAdd',
function ( &$arFields )
{
if (isset($arFields['ORDER_ID']) && $arFields['ORDER_ID']>0){
$arFields['SOURCE_ID'] = 'STORE';
$arFields['COMMENTS'] = 'Новый комментарий';
}
}
)

Предоставленный выше код проверяет создана ли Сделка пользователем интернет-магазина ($arFields['ORDER_ID']) и проставляет для поля "Источник" значение "Интернет-магазин". Доработав код можно для ручных сделок CRM выставлять другой источник, например "Заказ создан вручную".

Позвоните нам!
Личный кабинет
Вам будет доступна история заказов, управление рассылками, свои цены и скидки для постоянных клиентов и прочее.
Ваш логин
Ваш пароль