Проблема ручной выгрузки отчётов
Менеджер тратит 1–2 часа каждое утро: войти в админку, выбрать даты, скачать Excel, отправить почтой. Ошибки — не те столбцы, забыл прикрепить файл. При срочном запросе отчёта за прошлый месяц — перерывает всю документацию. Такая ситуация типична для десятков компаний на Битрикс. Потери времени — 40 часов в месяц. Автоматизация генерации отчётов решает проблему за день разработки. Но без опыта возникают типовые грабли: cron не настроен, права на запись в /upload/reports не выставлены, агенты не логируют ошибки. Мы настраиваем полный цикл: данные → файл → доставка получателю. Наши инженеры с опытом работы над 30+ проектами гарантируют стабильную работу агентов в production.
Преимущества автоматизации в 10 раз выгоднее ручной работы
Ручная выгрузка требует участия человека. Автоматический агент выполняет работу в 3 часа ночи, без нагрузки на сервер. Экономия времени — более 90%. Сравните:
| Параметр | Ручная выгрузка | Автоматическая генерация |
|---|---|---|
| Время на 5 отчётов | 30 минут | 0 минут |
| Ошибки | возможны | исключены |
| Регулярность | по запросу | по расписанию |
| Затраты в год | $5.4k–7.8k | $450–650 (настройка + поддержка) |
Автоматизация в 10 раз сокращает издержки. Кроме того, исключаются ошибки человеческого фактора.
Как настроить cron и агенты на production?
Настройка cron и создание агента
На production-сервере обязательно использовать системный cron вместо HTTP-триггера. Добавьте задачу в crontab:
# /etc/cron.d/bitrix */5 * * * * www-data /usr/bin/php /var/www/site/bitrix/modules/main/include/cron_events.php > /dev/null 2>&1 Без cron агенты будут запускаться только при посещении сайта, что ненадёжно.
Пример кода агента (развернуть)
Агенты в Битрикс — это функции PHP, выполняемые по расписанию через CAgent. Пример создания агента:
\CAgent::AddAgent( 'GenerateDailyReports();', 'local', 'N', 86400, '', 'Y', date('d.m.Y H:i:s', mktime(8, 0, 0)), 30 ); Документация Битрикс
Шаблон агента и отправка email
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();'; } Отправка по email
Отчёт отправляется через почтовое событие Битрикс или напрямую через PHPMailer с вложением.
function sendReportEmail(string $to, string $filePath, string $fileName): void { $absolutePath = $_SERVER['DOCUMENT_ROOT'] . $filePath; $mail = new \PHPMailer\PHPMailer\PHPMailer(true); $mail->CharSet = 'UTF-8'; $mail->setFrom('[email protected]', 'Система отчётов'); $mail->addAddress($to); $mail->Subject = 'Автоотчёт: ' . $fileName . ' от ' . date('d.m.Y'); $mail->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();'; } Страница архива в ЛК менеджера — список файлов с датой и ссылкой на скачивание, с проверкой прав доступа.
Какие отчёты автоматизировать?
Подходит любой отчёт, который можно построить через Битрикс ORM или инфоблоки. Часто автоматизируем:
- Продажи за день/неделю/месяц (с группировкой по менеджерам)
- Остатки на складе с порогом
- Заказы в статусе "ожидание оплаты"
- Динамику цен конкурентов (если есть парсинг)
- Акты сверки с контрагентами
Для каждого типа отчёта создаётся свой класс, реализующий интерфейс ReportGeneratorInterface. Это позволяет легко добавлять новые отчёты без изменения ядра. На практике одна и та же фабрика может обслуживать 20 разных отчётов: конфигурация задаётся массивом, а логика выборки — отдельными методами. Для тяжёлых выборок применяем чанкование по 500 записей и потоковую запись в XLSX через PhpSpreadsheet Writer, чтобы не переполнять память при 100 000 строк.
Защита от несанкционированного доступа
Храните файлы в /upload/reports/ с проверкой прав через $USER. Настройте .htaccess для запрета прямого доступа из веба. Ссылка на скачивание должна генерироваться через скрипт с проверкой прав. Логирование всех скачиваний — в отдельный файл.
Типичные ошибки и рекомендации
- Агенты запускаются только при хите — решается cron.
- Некорректные права на папку /upload/reports — нужен write для www-data.
- Ошибки в коде без логирования — настройте
Debug::writeToFile. - Превышение времени выполнения — для больших отчётов используйте
set_time_limit(0).
Что входит в работу
- Анализ проекта: выявляем какие отчёты нужны и их параметры.
- Настройка cron и создание агентов под каждый отчёт.
- Разработка шаблонов отчётов (Excel/PDF/CSV) с требуемыми данными.
- Настройка отправки по email с вложением.
- Логирование ошибок и регистрация успешных генераций.
- Автоматическая очистка старых файлов (задается период хранения).
- Документирование схемы и обучение менеджера.
Сроки настройки
| Конфигурация | Срок |
|---|---|
| 1 агент + 1 тип отчёта + email | от 1 дня |
| 3–5 отчётов с разными расписаниями | 2–4 дня |
| Архив отчётов + UI в ЛК + уведомления | 4–6 дней |
Сроки ориентировочные, окончательные определяем после анализа вашего проекта. Свяжитесь с нами, чтобы получить консультацию инженера и расчёт стоимости под ваш проект. Закажите настройку автоматической генерации отчётов — избавьте менеджеров от рутины и ошибок.







