Кастомные отчеты для интернет-магазина на 1С-Битрикс
Штатные отчеты модуля sale дают фиксированный набор метрик: выручка, количество заказов, конверсия. Когда требуется сегментация клиентов по менеджерам с учетом возвратов или разбивка маржинальности по категориям, приходится вручную выгружать данные в Excel. На каждом втором проекте клиент сначала тратит недели на ручную аналитику, а затем просит автоматизировать.
Мы разрабатываем кастомные отчеты на D7 ORM, которые дают полный контроль над данными: произвольная группировка, кросс-таблицы, автоматический экспорт. После внедрения такого отчета один из клиентов сократил время на подготовку ежемесячного отчета с двух дней до одного часа — и перестал ошибаться в цифрах.
Какие задачи решают кастомные отчеты?
Штатные отчеты модуля sale не поддерживают кросс-таблицы. Для магазинов с оборотом от нескольких тысяч заказов в месяц их недостаточно. Кастомные отчеты на D7 ORM дают гибкость, недоступную в стандартном функционале.
Штатные отчеты: что есть и чего не хватает
Модуль sale предоставляет несколько встроенных отчетов через компонент bitrix:sale.report.construct. Их ограничения:
- Фиксированный набор группировок — нельзя добавить произвольное поле
- Нет кросс-таблиц (pivot) — невозможно построить матрицу «товар × регион»
- Отсутствует когортный анализ и RFM-анализ
- Экспорт только в CSV с ограниченным форматированием
- Нет составных метрик (LTV, средний чек с учетом возвратов)
ORM-запросы через OrderTable и смежные сущности
Основа кастомных отчетов — D7 ORM Битрикса. Ключевые таблицы:
| Класс ORM | Назначение | Ключевые поля |
|---|---|---|
\\Bitrix\\Sale\\Internals\\OrderTable |
Заказы | ID, DATE_INSERT, USER_ID, PRICE, STATUS_ID, RESPONSIBLE_ID |
\\Bitrix\\Sale\\Internals\\BasketTable |
Корзина | ORDER_ID, PRODUCT_ID, QUANTITY, PRICE, DISCOUNT_PRICE |
\\Bitrix\\Sale\\Internals\\ShipmentTable |
Отгрузки | ORDER_ID, DELIVERY_ID, STATUS_ID, DATE_DEDUCTED |
\\Bitrix\\Sale\\Internals\\PaymentTable |
Оплаты | ORDER_ID, PAY_SYSTEM_ID, SUM, PAID, DATE_PAID |
\\Bitrix\\Sale\\Internals\\OrderPropsValueTable |
Свойства заказа | ORDER_ID, ORDER_PROPS_ID, VALUE |
ORM позволяет строить запросы с JOIN-ами, группировкой и агрегатными функциями без сырого SQL. Кастомный отчет на D7 ORM обрабатывает сводку по 100 000 заказов в 3 раза быстрее, чем аналогичный отчет на агентах.
Пример ORM-запроса с группировкой
$result = OrderTable::getList([ 'select' => [ 'MONTH' => new ExpressionField('MONTH', "DATE_TRUNC('month', %s)", ['DATE_INSERT']), 'RESPONSIBLE_ID', 'TOTAL' => new ExpressionField('TOTAL', 'SUM(%s)', ['PRICE']), 'CNT' => new ExpressionField('CNT', 'COUNT(%s)', ['ID']), ], 'filter' => [ '>=DATE_INSERT' => DateTime::createFromPhp(new \DateTime('last year')), '!STATUS_ID' => 'F', ], 'group' => ['MONTH', 'RESPONSIBLE_ID'], 'order' => ['MONTH' => 'ASC'], ]); Почему ORM эффективнее штатных отчетов?
ORM-запросы дают произвольную группировку: по периодам, товарам, менеджерам, регионам. Для сложных запросов с подзапросами используем $DB->Query() напрямую.
Визуализация и экспорт
Типичный набор визуализаций: line chart для динамики, bar chart для сравнения, doughnut для долей, heatmap для активности. Экспорт в Excel через PhpSpreadsheet:
cd /home/bitrix/www/local composer require phpoffice/phpspreadsheet PhpSpreadsheet формирует файлы с форматированием, формулами и несколькими листами — бухгалтерия использует их без доработок.
Deep-dive: отчет RFM-анализа клиентов
RFM-анализ сегментирует клиентов по трем параметрам: Recency, Frequency, Monetary. Каждый параметр оценивается от 1 до 5 (квинтили). 125 сегментов группируются в категории: «лояльные», «засыпающие», «потерянные», «новые перспективные».
Алгоритм:
- Выборка клиентов с завершенными заказами за 12 месяцев.
- Для каждого рассчитываем дату последнего заказа, количество заказов, общую сумму.
- Распределяем по квинтилям через
NTILE(5) OVER (ORDER BY ...). - Присваиваем сегмент по комбинации R-F-M.
SQL-запрос для метрик:
SELECT o.USER_ID, MAX(o.DATE_INSERT) AS last_order_date, EXTRACT(DAY FROM NOW() - MAX(o.DATE_INSERT)) AS recency_days, COUNT(o.ID) AS frequency, SUM(o.PRICE) AS monetary FROM b_sale_order o WHERE o.STATUS_ID NOT IN ('F', 'CA') AND o.DATE_INSERT >= NOW() - INTERVAL '12 months' AND o.PAYED = 'Y' GROUP BY o.USER_ID Маппинг сегментов:
| Сегмент | R | F | M | Действие |
|---|---|---|---|---|
| Чемпионы | 5 | 5 | 5 | Программа лояльности |
| Лояльные | 3-5 | 3-5 | 3-5 | Upsell, рефералы |
| Перспективные новички | 5 | 1 | 1-3 | Онбординг |
| Засыпающие | 2-3 | 2-3 | 2-3 | Реактивация |
| Под угрозой | 1-2 | 3-5 | 3-5 | Срочная реактивация |
| Потерянные | 1 | 1-2 | 1-2 | Win-back |
RFM-отчет выводится в виде таблицы с фильтрацией и treemap-визуализацией. Данные кэшируются — пересчет на 50 000 клиентов занимает 10-15 секунд.
Что входит в работу
После согласования макета и метрик мы:
- Проектируем запросы и оптимизируем индексы.
- Реализуем дашборд с фильтрами и визуализацией.
- Настраиваем экспорт в Excel/CSV.
- Готовим документацию по структуре данных и алгоритмам.
- Проводим обучение сотрудников работе с отчетами.
- Предоставляем 30 дней бесплатной поддержки после запуска.
Этапы разработки
| Этап | Содержание | Срок |
|---|---|---|
| Аналитика | Определение метрик, разрезов, макет дашборда | 2-3 дня |
| Проектирование запросов | ORM-запросы, оптимизация индексов | 3-5 дней |
| Визуализация | Верстка дашборда, графики Chart.js, фильтры | 3-4 дня |
| Экспорт | PhpSpreadsheet, форматирование | 1-2 дня |
| Тестирование | Проверка на больших объемах, нагрузка | 2-3 дня |
Сроки и стоимость
Сроки — от 5 рабочих дней для одного простого отчета, от 15 дней для комплексного дашборда с RFM и когортами. Стоимость рассчитывается индивидуально после анализа вашей базы и требований. Экономия времени на подготовку отчетности окупает разработку уже за пару месяцев. Свяжитесь с нами — мы спроектируем отчет под вашу задачу.







