Уявіть: щомісяця 5000 замовлень, менеджери витрачають по 15 годин на вивантаження даних із Бітрікс та збірку звіту в Excel. При цьому до 30% даних втрачається через ручне копіювання. Стандартні звіти Бітрікс не показують прибуток по кожному менеджеру, ABC-аналіз товарів або конверсію по каналах. Впровадження кастомної аналітики скорочує ручну обробку на 30 годин на місяць, що дає значну економію.
Ми розробляємо звіти по продажах під ключ — від 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' => \Bitrix\Main\Type\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.
Зв'яжіться з нами, щоб обговорити ваші метрики та отримати консультацію. Замовте розробку звіту — ми підготуємо комерційну пропозицію протягом дня.







