Обработчик добавления полей (макросов) в существующие шаблоны писем Битрикса

Добавление обработчика события - добавляет дополнительные поля в почтовый шаблон о новом заказе
[spoiler]
Бросаем этот код в init.php

 // Регистрируем обработчик
AddEventHandler("sale", "OnOrderNewSendEmail", "bxModifySaleMails"); 

//-- Собственно обработчик события

function bxModifySaleMails($orderID, &$eventName, &$arFields)
{ 
  $arOrder = CSaleOrder::GetByID($orderID);

 
//данные по составу заказа
$res = CSaleBasket::GetList(array(), array("ORDER_ID" => $orderID)); // ID заказа
$sostav='<table style="background-color: f8f8f8; width: 100%;"><tr><th style="padding: 10px;font-weight: bold;font-size: 15px;color: #3d4345;border-bottom: 1px solid #d9d9d9;border-left: 1px solid #d9d9d9;border-top: 1px solid #d9d9d9;  width: 60%;  background: linear-gradient(to bottom, #fefefe 0%,#e7e7e7 100%);">Наименование</th><th style="padding: 10px; width: 20%; font-weight: bold;font-size: 15px;color: #3d4345;border-bottom: 1px solid #d9d9d9;border-top: 1px solid #d9d9d9;    background: linear-gradient(to bottom, #fefefe 0%,#e7e7e7 100%); width: 20%;">Цена</th><th style="padding: 10px;font-weight: bold;font-size: 15px;color: #3d4345;border-top: 1px solid #d9d9d9;border-right: 1px solid #d9d9d9;border-bottom: 1px solid #d9d9d9;    background: linear-gradient(to bottom, #fefefe 0%,#e7e7e7 100%);">Количество</th></tr>'; 
$col=0;
$priceplus=0;
while ($arItem = $res->Fetch()) {
   
   $ress = CIBlockElement::GetProperty($arItem['CATALOG_XML_ID'], $arItem["PRODUCT_ID"], "sort", "asc", array("CODE" => "ARTIKUL")); 
    while ($ob = $ress->GetNext())   {$VALUE_ART = $ob['VALUE'];}
   
   $sostav.='<tr style="text-align: center; font-weight: normal;font-size: 14px;"><td style="padding: 10px 5px; border: 1px solid #d9d9d9;text-align: left;">'.$arItem["NAME"].'<br/><span style="color: #ccc;">Код: '.$arItem["PRODUCT_ID"].'</span> <span style="color: #ccc;"> Артикул: '.$VALUE_ART.'</span></td><td style="padding: 10px 5px; border: 1px solid #d9d9d9;">'.number_format($arItem["PRICE"], 0, ',', ' ').' руб.'.'</td><td style="padding: 10px 5px; border: 1px solid #d9d9d9;">'.$arItem["QUANTITY"].' шт.</td></tr>';
   $priceplus=$priceplus+$arItem["PRICE"]; 
   $col++;
   //echo "<pre>", print_r($arItem), "</pre>"; 
} 
$sostav.='</table>'; 
//закончились данные по составу заказа
 
  //-- получаем телефоны и адрес (или еще что-нибудь)
  $order_props = CSaleOrderPropsValue::GetOrderProps($orderID);
  $EMAIL="";
  $phone = ""; 
  $country_name = "";
  $city_name = "";  
  $address = "";
  $DELSERVCE = "";
  $PROVERKA_VIN = "";
  $VIN_NOMER = "";
  $NameLast = "";
  $Name = "";
  while ($arProps = $order_props->Fetch()) 
  {
    
    if ($arProps["CODE"] == "PHONE") 
    {
       $phone = $arProps["VALUE"];
    }
    if ($arProps["CODE"] == "LOCATION")
    {
        $arLocs = CSaleLocation::GetByID($arProps["VALUE"], LANGUAGE_ID);
   $city_name=htmlspecialchars($arLocs["COUNTRY_NAME"]." - ".$arLocs["CITY_NAME"]);
    } 

    if ($arProps["CODE"] == "EMAIL")
    {
      $EMAIL = $arProps["VALUE"];   
    }
 
    if ($arProps["CODE"] == "ADDRESS")
    {
      $address = $arProps["VALUE"];
    }
   if ($arProps["CODE"] == "DELSERVCE")
    {
      $DELSERVCE = $arProps["VALUE"];
    }
   if ($arProps["CODE"] == "PROVERKA_VIN")
    {
      $PROVERKA_VIN = $arProps["VALUE"];
    }
       if ($arProps["CODE"] == "VIN_NOMER")
    {
      $VIN_NOMER = $arProps["VALUE"];
    }
   if ($arProps["CODE"] == "Name")
    {
      $Name = $arProps["VALUE"];
    }
   if ($arProps["CODE"] == "NameLast")
    {
      $NameLast = $arProps["VALUE"];
    }
  } 

  $full_address = $city_name.", ".$address;
 
  //-- получаем название службы доставки
  $arDeliv = CSaleDelivery::GetByID($arOrder["DELIVERY_ID"]);
  $delivery_name = "";
  if ($arDeliv)
  {
    $delivery_name = $arDeliv["NAME"];
  }

  //-- получаем название платежной системы   
  $arPaySystem = CSalePaySystem::GetByID($arOrder["PAY_SYSTEM_ID"]);
  $pay_system_name = "";
  if ($arPaySystem)
  {
    $pay_system_name = $arPaySystem["NAME"];
  }

  //-- добавляем новые поля в массив результатов - каждое поле это макрос для почтового события
  

  $arFields["ORDER_DESCRIPTION"] = $arOrder["USER_DESCRIPTION"]; 
  $arFields["PHONE"] =  $phone;
  $arFields["DELIVERY_NAME"] =  $delivery_name;
  $arFields["PAY_SYSTEM_NAME"] =  $pay_system_name;
  $arFields["FULL_ADDRESS"] = $full_address; 
  $arFields["DELSERVCE"] = $DELSERVCE;   
  $arFields["PROVERKA_VIN"] = $PROVERKA_VIN;   
  $arFields["VIN_NOMER"] = $VIN_NOMER;   
  $arFields["EMAIL"] = $EMAIL;  
  $arFields["NameLast"] = $NameLast;  
  $arFields["Name"] = $Name; 
  
}
?>