Представьте: ежемесячно 5000 заказов, менеджеры тратят по 15 часов на выгрузку данных из Битрикс и сборку отчета в Excel. При этом до 30% данных теряется из-за ручного копирования. Стандартные отчеты Битрикс не показывают прибыль по каждому менеджеру, ABC-анализ товаров или конверсию по каналам. Внедрение кастомной аналитики сокращает ручную обработку на 30 часов в месяц, что при средней ставке аналитика $18–26/час дает экономию $540–780. ежемесячно.
Мы разрабатываем отчеты по продажам под ключ — от ORM-запросов до дашборда в админке и экспорта в Excel. За 5 лет реализовали больше 50 проектов для магазинов на Битрикс. Каждый отчет ускоряет принятие решений в 10 раз быстрее ручной выгрузки.
Ограничения стандартных отчетов Битрикс
Штатный модуль sale выдает плоскую таблицу заказов с минимальной группировкой. Для управления продажами нужна сегментация по менеджерам с учетом возвратов, разбивка по категориям товаров, динамика среднего чека, анализ повторных покупок. Готовые отчеты не умеют связывать данные из разных таблиц — заказы, корзину, оплаты, свойства заказов — в единую аналитическую выборку. По оценкам, до 80% времени менеджеры тратят на ручную обработку данных. Без кастомной аналитики бизнес опирается на догадки, а не на цифры.
Как построить отчет по выручке с разбивкой по менеджерам?
Самый востребованный отчет — выручка по периодам с разбивкой по менеджерам. Задача: показать, сколько каждый менеджер принес в кассу, со скольких заказов, каков средний чек и процент отмен. Данные собираются ORM-запросом к OrderTable с группировкой по менеджеру и месяцу. Рассчитываются метрики: выручка (без отмен), сумма отмен, количество заказов, средний чек, конверсия в выполненный заказ, скорость обработки.
Пример ORM-запроса (без фильтра):
use Bitrix\Sale\Internals\OrderTable; use Bitrix\Main\Entity\ExpressionField; $result = OrderTable::getList([ 'select' => [ 'RESPONSIBLE_ID', 'MONTH' => new ExpressionField('MONTH', "DATE_TRUNC('month', %s)", ['DATE_INSERT']), 'REVENUE' => new ExpressionField('REVENUE', 'SUM(CASE WHEN %s NOT IN (\'F\', \'CA\') THEN %s ELSE 0 END)', ['STATUS_ID', 'PRICE']), 'CANCELLED' => new ExpressionField('CANCELLED', 'SUM(CASE WHEN %s IN (\'F\', \'CA\') THEN %s ELSE 0 END)', ['STATUS_ID', 'PRICE']), 'ORDER_COUNT' => new ExpressionField('ORDER_COUNT', 'COUNT(%s)', ['ID']), 'AVG_CHECK' => new ExpressionField('AVG_CHECK', 'AVG(CASE WHEN %s NOT IN (\'F\', \'CA\') THEN %s END)', ['STATUS_ID', 'PRICE']), ], 'filter' => [ '>=DATE_INSERT' => DateTime::createFromPhp(new \DateTime('first day of this month')), ], 'group' => ['RESPONSIBLE_ID', 'MONTH'], 'order' => ['MONTH' => 'ASC', 'REVENUE' => 'DESC'], ]); Метрики менеджера, которые считаем:
- Выручка (без отмен и возвратов)
- Сумма отмен — показывает качество работы
- Средний чек — сравнение между менеджерами
- Количество заказов — нагрузка
- Конверсия из «Новый» в «Выполнен» —
COUNT(status=F) / COUNT(*)по статусам - Средняя скорость обработки —
AVG(DATE_STATUS - DATE_INSERT)
В одном проекте мы сократили время построения такого отчета с 15 секунд до 2 за счет правильных индексов.
Как оптимизировать производительность отчетов?
На магазине с 50 000+ заказов ORM-запросы с группировкой выполняются 3-10 секунд. Решения:
- Материализованные представления (PostgreSQL) или summary-таблица, пересчитываемая агентом раз в час
- Индексы — обязательны:
(DATE_INSERT, STATUS_ID)наb_sale_order,(ORDER_ID, PRODUCT_ID)наb_sale_basket - Кэш отчета в
managed_cacheБитрикса с TTL 1 час и инвалидацией при изменении заказа
Что такое ABC-анализ и как его реализовать в Битрикс?
ABC-анализ показывает, какие товары и категории генерируют выручку, какие лежат мертвым грузом. Обычно 20% товаров дают 80% выручки. Реализуется оконной функцией SUM() OVER (ORDER BY revenue DESC) или программно после выборки. Сортировка товаров по убыванию выручки, расчет нарастающего итога, присвоение категории: A (80% выручки), B (15%), C (5%).
Структура: JOIN BasketTable с OrderTable (фильтр по оплаченным заказам) и с инфоблоком каталога. Группировка по разделам с агрегацией: выручка, количество проданных единиц, средняя цена продажи, средняя скидка.
Визуализация и дашборд
Отчеты размещаются на кастомной странице в /local/admin/. Стек визуализации:
- Chart.js — линейные графики динамики, bar chart для сравнения менеджеров
- HTML-таблицы с сортировкой — для детальных данных
- PhpSpreadsheet — экспорт в xlsx с форматированием, формулами ИТОГО, автоширина колонок
Дашборд строится как single-page с табами: «Общая выручка», «По менеджерам», «По товарам», «ABC-анализ». Данные подгружаются через AJAX-эндпоинт, параметры фильтра (период, менеджер, категория) передаются в запросе.
Интеграция с внешними системами
Для полной картины часто требуется интеграция с 1С УТ/ЕРП, CRM или телефонией. Мы подключаем данные об оплатах через REST API, синхронизируем справочники контрагентов, добавляем воронку конверсий по каналам трафика. Например, для отчета по конверсиям используем данные модуля sale и пользовательских свойств заказов, что позволяет увидеть путь клиента от лида до оплаты.
Что входит в работу
- Аналитика: определение метрик, согласование разрезов
- Бэкенд: ORM-запросы, оптимизация, кэширование
- Фронтенд: дашборд, графики, фильтры
- Экспорт: Excel-шаблоны, форматирование
- Тестирование: проверка на реальных данных, нагрузка
- Документация по отчетам и поддержка 3 месяца
Сроки разработки
| Этап | Содержание | Срок |
|---|---|---|
| Аналитика | Определение метрик, согласование разрезов | 1-2 дня |
| Бэкенд | ORM-запросы, оптимизация, кэширование | 3-5 дней |
| Фронтенд | Дашборд, графики, фильтры | 2-3 дня |
| Экспорт | Excel-шаблоны, форматирование | 1 день |
| Тестирование | Проверка на реальных данных, нагрузка | 1-2 дня |
Общий срок — 1-2 недели в зависимости от количества отчетов и сложности метрик. Результат — дашборд в админке с экспортом, который заменяет ручную выгрузку и обработку в Excel.
Свяжитесь с нами, чтобы обсудить ваши метрики и получить консультацию. Закажите разработку отчета — мы подготовим коммерческое предложение в течение дня.







