function SendDailyReportAgent() { global $DB; $email = 'sekrylov@gmail.com, grg767@yandex.ru'; $eventName = "DAILY_REPORT_STATS"; // Определяем даты для названия файла $dateStart = date('d-m-Y', strtotime("-30 days")); $dateEnd = date('d-m-Y'); $fileName = "puhovik_statistics_{$dateStart}_{$dateEnd}.xls"; $subject = "Ежедневный отчет по активности ($dateEnd)"; $DB->Query("SET @DateT = ADDDATE(CURDATE(), INTERVAL -30 DAY)"); $sql = " SELECT IFNULL(CAST(Date AS CHAR), 'ИТОГО') AS 'DATE_VAL', SUM(TotalSessions) AS SESSIONS, SUM(TotalUsersRegistration) AS REG_TOTAL, SUM(UsersWithBirthdate) AS WITH_BDAY, IF(SUM(TotalUsersRegistration) > 0, ROUND(SUM(UsersWithBirthdate) / SUM(TotalUsersRegistration) * 100, 2), 0) AS KOEF_BDAY, SUM(UsersWithEmail) AS WITH_EMAIL, IF(SUM(TotalUsersRegistration) > 0, ROUND(SUM(UsersWithEmail) / SUM(TotalUsersRegistration) * 100, 2), 0) AS KOEF_EMAIL, SUM(TotalOrder) AS ORDERS, SUM(CountReserves) AS RESERVES, SUM(CountPickup) - SUM(CountReserves) AS PICKUP, SUM(CountPartners) AS PARTNERS, SUM(AddToCart) AS ADD_CART, SUM(CartToOrder) AS ORDER_FROM_CART, IF(SUM(AddToCart) > 0, ROUND(SUM(CartToOrder) / SUM(AddToCart) * 100, 2), 0) AS KOEF_ORDER FROM ( SELECT DATE(`DATE_REGISTER`) AS Date, COUNT(`ID`) AS TotalUsersRegistration, COUNT(`PERSONAL_BIRTHDAY`) AS UsersWithBirthdate, COUNT(`EMAIL`) AS UsersWithEmail, 0 AS TotalOrder, 0 AS CountReserves, 0 AS CountPickup, 0 AS CountPartners, 0 AS TotalSessions, 0 AS AddToCart, 0 AS CartToOrder FROM `b_user` WHERE `DATE_REGISTER` >= @DateT GROUP BY Date UNION ALL SELECT DATE(a.DATE_INSERT) AS Date, 0, 0, 0, COUNT(DISTINCT a.ID), COUNT(DISTINCT prop.ORDER_ID), COUNT(DISTINCT dlv.ORDER_ID), COUNT(DISTINCT part.ORDER_ID), 0, 0, 0 FROM `b_sale_order` AS a LEFT JOIN `b_sale_order_props_value` AS prop ON a.ID = prop.ORDER_ID AND prop.ORDER_PROPS_ID = '22' AND prop.`VALUE` LIKE 'Y%' LEFT JOIN `b_sale_order_delivery` AS dlv ON a.ID = dlv.ORDER_ID AND dlv.DELIVERY_ID = 76 LEFT JOIN `b_sale_order_delivery` AS part ON a.ID = part.ORDER_ID AND part.DELIVERY_ID <> 76 WHERE a.DATE_INSERT >= @DateT GROUP BY Date UNION ALL SELECT DATE(`TIMESTAMP_X`) AS Date, 0, 0, 0, 0, 0, 0, 0, COUNT(`SESSION_ID`), 0, 0 FROM `b_user_session` WHERE `TIMESTAMP_X` >= @DateT GROUP BY Date UNION ALL SELECT DATE(`DATE_INSERT`) AS Date, 0, 0, 0, 0, 0, 0, 0, 0, COUNT(DISTINCT `FUSER_ID`), COUNT(DISTINCT `ORDER_ID`) FROM `b_sale_basket` WHERE `DATE_INSERT` >= @DateT GROUP BY Date ) combined GROUP BY Date WITH ROLLUP; "; $res = $DB->Query($sql); // Шапка таблицы (общая для HTML письма и XLS) $tableHeader = ' ДатаСессииЗарег.ДР% ДР Email% EmailЗаказыРезерв СамовывозПартнерыВ корзинуИз корзины% Заказа '; $tableRows = ''; while ($row = $res->Fetch()) { $isTotal = ($row['DATE_VAL'] === 'ИТОГО'); $style = $isTotal ? ' style="font-weight:bold; background:#eee;"' : ''; $tableRows .= " {$row['DATE_VAL']} {$row['SESSIONS']} {$row['REG_TOTAL']} {$row['WITH_BDAY']} {$row['KOEF_BDAY']}% {$row['WITH_EMAIL']} {$row['KOEF_EMAIL']}% {$row['ORDERS']} {$row['RESERVES']} {$row['PICKUP']} {$row['PARTNERS']} {$row['ADD_CART']} {$row['ORDER_FROM_CART']} {$row['KOEF_ORDER']}% "; } $html = '

Отчет за последние 30 дней

'; $html .= '' . $tableHeader . $tableRows . '
'; // Формируем контент для XLS (Excel понимает HTML таблицы, если указать кодировку) $xlsContent = ''; $xlsContent .= '' . $tableHeader . $tableRows . '
'; // Сохраняем временный файл для отправки $tempPath = \CTempFile::GetFileName($fileName); CheckDirPath($tempPath); file_put_contents($tempPath, $xlsContent); // Регистрируем файл в системе Битрикс $fileId = \CFile::SaveFile( array( "name" => $fileName, "size" => filesize($tempPath), "tmp_name" => $tempPath, "type" => "application/vnd.ms-excel", "MODULE_ID" => "main" ), "reports" ); // Отправка письма \Bitrix\Main\Mail\Event::send(array( "EVENT_NAME" => $eventName, "LID" => "s1", "C_FIELDS" => array( "EMAIL_TO" => $email, "SUBJECT" => $subject, "MESSAGE" => $html, ), "FILE" => array($fileId), // Добавляем ID файла во вложение )); // Опционально: удаляем файл из БД после постановки в очередь (Битрикс скопирует его в почтовую очередь) // \CFile::Delete($fileId); return "SendDailyReportAgent();"; }
[RuntimeException] 
Could not start session because headers have already been sent. "/data/www/bitrix/catalog_export/report_stat_send_email.php":1. (0)
/data/www/bitrix/modules/main/lib/session/session.php:143
#0: Bitrix\Main\Session\Session->start()
	/data/www/bitrix/modules/main/lib/session/kernelsessionproxy.php:47
#1: Bitrix\Main\Session\KernelSessionProxy->start()
	/data/www/bitrix/modules/main/include.php:182
#2: require_once(string)
	/data/www/bitrix/modules/main/include/prolog_before.php:19
#3: require_once(string)
	/data/www/bitrix/modules/main/include/prolog.php:10
#4: require_once(string)
	/data/www/bitrix/header.php:1
#5: require(string)
	/data/www/catalog/index.php:2
#6: include_once(string)
	/data/www/bitrix/modules/main/include/urlrewrite.php:128
#7: include_once(string)
	/data/www/bitrix/urlrewrite.php:2
----------