Налаштування автоматичної генерації звітів 1С-Бітрікс
Ручне вивантаження звітів — втрата часу та джерело помилок. Автоматична генерація вирішує це через агентів Бітрікс і відправку за розкладом. Завдання — налаштувати цикл: дані → файл → доставка одержувачу.
Агенти Бітрікс як основа автоматизації
Агент (b_agent) — функція PHP, яку Бітрікс викликає за розкладом через механізм CAgent. Запуск відбувається при HTTP-запитах до сайту (за замовчуванням) або через cron (/bitrix/modules/main/include/cron_events.php).
Налаштування cron замість HTTP-тригера — обов'язково для production:
# /etc/cron.d/bitrix
*/5 * * * * www-data /usr/bin/php /var/www/site/bitrix/modules/main/include/cron_events.php > /dev/null 2>&1
Створення агента програмно:
\CAgent::AddAgent(
'GenerateDailyReports();', // Назва функції
'local', // Модуль
'N', // Періодичний
86400, // Інтервал у секундах (раз на добу)
'', // Дата першого запуску (порожньо = одразу)
'Y', // Активний
date('d.m.Y H:i:s', mktime(8, 0, 0)), // Час наступного запуску (8:00)
30 // Сортування
);
Шаблон агента генерації звітів
function GenerateDailyReports(): string
{
$reports = [
[
'type' => 'orders',
'filename' => 'orders_' . date('Y-m-d') . '.xlsx',
'params' => ['date_from' => date('Y-m-d', strtotime('-1 day')), 'status' => null],
'recipient' => '[email protected]',
],
[
'type' => 'low_stock',
'filename' => 'stock_' . date('Y-m-d') . '.xlsx',
'params' => ['threshold' => 5],
'recipient' => '[email protected]',
],
];
foreach ($reports as $reportConfig) {
try {
$generator = ReportGeneratorFactory::create($reportConfig['type']);
$filePath = $generator->generate($reportConfig['params']);
$savedName = '/upload/reports/' . $reportConfig['filename'];
rename($filePath, $_SERVER['DOCUMENT_ROOT'] . $savedName);
sendReportEmail($reportConfig['recipient'], $savedName, $reportConfig['filename']);
\Bitrix\Main\Diag\Debug::writeToFile(
date('Y-m-d H:i:s') . ' Report generated: ' . $reportConfig['filename'],
'',
'/local/logs/reports.log'
);
} catch (\Throwable $e) {
\Bitrix\Main\Diag\Debug::writeToFile(
date('Y-m-d H:i:s') . ' ERROR: ' . $e->getMessage(),
'',
'/local/logs/reports_errors.log'
);
}
}
return 'GenerateDailyReports();';
}
Відправка звітів електронною поштою
Звіт надсилається через поштову подію Бітрікс з вкладенням:
function sendReportEmail(string $to, string $filePath, string $fileName): void
{
$absolutePath = $_SERVER['DOCUMENT_ROOT'] . $filePath;
// Прикріплюємо файл через CFile і поштову подію
$event = new \Bitrix\Main\Mail\Event();
$fields = [
'TO' => $to,
'SUBJECT' => 'Авто-звіт: ' . $fileName . ' від ' . date('d.m.Y'),
'BODY' => 'Звіт сформовано автоматично. Файл у вкладенні.',
];
// Альтернатива — відправка через PHPMailer напряму з вкладенням
$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
$mail->CharSet = 'UTF-8';
$mail->setFrom('[email protected]', 'Система звітів');
$mail->addAddress($to);
$mail->Subject = $fields['SUBJECT'];
$mail->Body = $fields['BODY'];
$mail->addAttachment($absolutePath, $fileName);
$mail->send();
}
Зберігання та доступ до архіву звітів
Згенеровані файли зберігаються в /upload/reports/ зі збереженням історії за 30 днів. Очищення старих файлів — окремий агент:
function CleanOldReports(): string
{
$dir = $_SERVER['DOCUMENT_ROOT'] . '/upload/reports/';
foreach (glob($dir . '*.xlsx') as $file) {
if (filemtime($file) < time() - 30 * 86400) {
unlink($file);
}
}
return 'CleanOldReports();';
}
Сторінка архіву в особистому кабінеті менеджера — список файлів з датою та посиланням для завантаження, з перевіркою прав доступу.
Терміни
| Конфігурація | Термін |
|---|---|
| 1 агент + 1 тип звіту + email | 1 день |
| 3–5 звітів з різними розкладами | 2–4 дні |
| Архів звітів + UI в особистому кабінеті + сповіщення | 4–6 днів |







