Отправка покупателю pdf-файла счета вместе с e-mail уведомлением

В одной из статей я приводил пример, как можно отправлять документы заказчику интернет-магазина в Excel-формате - вместе с E-mail уведомлением. Есть более простой способ реализовать подобный функционал в версиях "Битрикса", начиная с 15-й. Можно использовать для этих целей типовой компонент "Битрикса" - bitrix:sale.order.payment - который умеет создавать pdf-файлы счетов (или любых других документов, заданных формой документа для заказа) и прикладывать файлы к письму-уведомлению, используя типовой метод CEvent::Send.

В данном примере опишу функционал отправки счетов в формате pdf, который мы создавали для заказчиков выписок из ЕГРЮЛ на сайте-магазине егр.рф.
В этом магазине используется кастомизированный компонент создания заказа, сделанный на основе компонента bitrix:sale.basket.order.ajax - объединенный компонент корзины и формы заказа.

Добавим в данный компонент условие: если покупатель выбрал платежную систему "Безналичный расчет" (в данном примере, ID этой платежной системы = 9), то создадим pdf-файл счета и приложим его к письму-уведомлению о заказе. Находим в компоненте строку "if($bSend)" и заменяем блок этого условия на следующий код:
if($bSend) {
   $event = new CEvent;
   if($PAYSYSTEM_ID == 9) {
      ob_start();
      $_REQUEST["ORDER_ID"] = $ORDER_ID;
      $_REQUEST["pdf"] = 'Y';
      $APPLICATION->IncludeComponent("bitrix:sale.order.payment", "", Array());
      $pdf_content=ob_get_contents();
      ob_clean();
      
      $fid = CFile::SaveFile(array(
            'name' => 'bill_'.$ORDER_ID.'.pdf',
            'size' => strlen($pdf_content),
            'type' => 'application/pdf',
            'MODULE_ID' => 'sale',
            'content' => $pdf_content,
         ),
         'bills'
      );

      $event->Send($eventName, SITE_ID, $arFields, "N", "", array($fid));
   }
   else {
      $event->Send($eventName, SITE_ID, $arFields, "N");
   }
}
ob_start() - включаем буферизацию вывода, задаем параметры $_REQUEST для компонента bitrix:sale.order.payment, сохраняем вывод компонента в строку, которую затем записываем в pdf-файл (CFile::SaveFile). Передаем 6-м параметром метода Send массив с файлами, которые нужно приложить к письму.

В целом, этот способ гораздо проще генерации Excel-файлов через PHPExcel.