Раздельная отправка писем о новом заказе в 1С Битрикс, на примере заказов с Яндекс Маркета

Раздельная отправка писем о новом заказе в 1С Битрикс, на примере заказов с Яндекс Маркета

19.03.2023
681
Пример кода, раздельной отправки писем при оформлении заказов на примере заказов с Яндекс Маркета в 1С Битрикс. Код представляет собой функцию SendOtherEmail, которая вызывается при отправке письма на почту пользователя при оформлении заказа, используя событие OnOrderNewSendEmail.

1С Битрикс предоставляет широкие возможности для работы с заказами, включая отправку писем на почту пользователей. Однако, возникают ситуации, когда нужно отправлять письма только определенным пользователям или при определенных условиях. 

Задача состоит в отмене отправки писем о заказах сформированных с площадки Я.Маркет. В этом случае решением может быть написание своей функции для отправки писем с учетом необходимых условий, функция размещается/подключается в файле init.php.

Пример кода, решающего задачу отправки писем при оформлении заказов с Яндекс Маркета, может быть следующим:

//подключим логирование - если нужно
define("LOG_FILENAME", $_SERVER["DOCUMENT_ROOT"]."/na_log.txt");

use Bitrix\Sale; //подключение для получении пользователя из заказа и ID сайта

//используем событие OnOrderNewSendEmail
AddEventHandler("sale", "OnOrderNewSendEmail", "SendOtherEmail");
function SendOtherEmail($orderID, &$eventName, &$arFields) {

    $market_user = 11; //ID пользователя для заказов с Яндекс маркета

    $event_post = 'SALE_NEW_ORDER'; //почтовое событие

    $template_id = 67; //Шаблон почтового события
    $template_id_market = 32; //Шаблон почтового события для заказов маркета

    if($eventName == $event_post){
        $order = Sale\Order::load($orderID); // объект заказа
        $user_order = $order->getUserId(); // ID пользователя
        $site_id = $order->getSiteId(); // ID сайта - пример: s1

        if($user_order == $market_user){ // Пользователь Я.Маркета
           // убрать комментарий, если нужна отправка писем о заказах с маркета
           // CEvent::Send($event_post, [$site_id], $arFields, 'N', $template_id_market);
        }
        if($user_order != $market_user){ // Пользователь не с Я.Маркета
            CEvent::Send($event_post, [$site_id], $arFields, 'N', $template_id);
        }
    }
    //Логирование
    /*
    $log_arr = [
        "site_id" => $site_id,
        "user_order" => $user_order,
        "orderID" => $orderID,
        "eventName" => $eventName,
        "arFields" => $arFields,
    ];

    AddMessage2Log($log_arr, "my_module_id");
    */

    return false; //отмена стандартной отправки для исключения отправки дублей.
}

Код представляет собой функцию SendOtherEmail, которая вызывается при отправке письма на почту пользователя при оформлении заказа, используя событие OnOrderNewSendEmail. Функция получает ID заказа $orderID, название почтового события $eventName и массив полей $arFields, передаваемых в шаблон письма.

В первой части функции определяются необходимые параметры:

  • $market_user - ID пользователя для заказов с Яндекс Маркета (пользователь появляется в админке после начала работы с маркетом);
  • $event_post - название почтового события;
  • $template_id - ID шаблона почтового события для обычных заказов;
  • $template_id_market - ID шаблона почтового события для заказов с Маркета.

Далее, функция получает объект заказа и необходимые данные из него: ID пользователя и ID сайта. Затем, используя условный оператор, определяется, является ли пользователь Маркета. Если да, то происходит отправка письма на почту с использованием соответствующего шаблона (убрать комментарий если нужно получать письмо о заказе через Я.Маркет). Если нет, то отправляется стандартное письмо (ID шаблона$template_id) на почту.

Важно отметить, что в данном примере мы отправляем письма при оформлении заказа, используя событие OnOrderNewSendEmail. Однако, в зависимости от задачи, может потребоваться использовать другие события, например, OnSaleStatusOrder при изменении статуса заказа.

Наконец, функция создает массив $log_arr с данными о заказе и переданными полями, добавляет его в логи (раскомментировать если нужно) и отменяет стандартную отправку письма return false;. для избежания продолжения выполнения события (иначе отправится стандартный шаблон).

Содержимое лог файла na_log.txt

Ниже представлен массив с логируемыми данными (у Вас будут другие значения)

array (
  'site_id' => 's1', // ID Сайта
  'user_order' => '28', // ID пользователя
  'orderID' => 7399, // ID заказа
  'eventName' => 'SALE_NEW_ORDER',
  'arFields' =>
  array (
    'ORDER_ID' => 7399,
    'ORDER_REAL_ID' => 7399,
    'ORDER_ACCOUNT_NUMBER_ENCODE' => '7399',
    'ORDER_DATE' => '21.03.2023 10:33:38',
    'ORDER_USER' => 'Имя Фамилия',
    'PRICE' => '550 ₽',
    'BCC' => 'info@test_shop.com',
    'EMAIL' => 'client@email.com',
    'ORDER_LIST' => '"Вишня-Грейпфрут" 500 мл. - 3 шт x 65 &#8381;<br/>"Клубника-Лайм" 500 мл. - 2 шт x 65 &#8381;<br/>',
    'SALE_EMAIL' => 'info@test_shop.com',
    'DELIVERY_PRICE' => 0.0,
    'ORDER_PUBLIC_URL' => '',
  ),
)

Заключение

Можно сказать, что данный пример кода представляет собой небольшую, но полезную функцию для работы с заказами в 1С Битрикс. Его использование позволяет обрабатывать заказы с Яндекс Маркета отдельно от обычных заказов и отправлять на почту соответствующие письма с учетом требуемых условий.

Чтобы избежать ошибок при написании своей функции для отправки писем, необходимо убедиться в правильности указанных параметров, а также протестировать функцию на разных вариантах заказов и пользователей.

Использование своей функции для отправки писем с учетом требуемых условий позволяет сделать работу с заказами более гибкой и эффективной.