Разработка дашборда с KPI для администратора 1С-Битрикс
Стандартная административная панель Битрикс показывает технические метрики — нагрузку, ошибки, состояние модулей. Бизнес-KPI там нет: выручку за сегодня, конверсию воронки, средний чек по менеджерам смотрят в отдельных системах или вовсе в Excel. Дашборд с бизнес-метриками, встроенный прямо в Битрикс, убирает этот разрыв.
Архитектура дашборда
Дашборд реализуется как отдельная страница в административной части: /bitrix/admin/kpi_dashboard.php. Либо как публичная страница в закрытом разделе — для доступа менеджеров без права на /bitrix/admin/.
Данные агрегируются напрямую из базы через SQL — это быстрее, чем последовательные вызовы Битрикс API для каждого виджета. Визуализация — Chart.js или ApexCharts, подключаемые как JS-зависимости.
Ключевые SQL-запросы для KPI
Выручка за период с разбивкой по дням:
SELECT
DATE(o.date_insert) AS day,
COUNT(o.id) AS orders_count,
SUM(o.price) AS revenue,
AVG(o.price) AS avg_check
FROM b_sale_order o
WHERE
o.lid = 's1'
AND o.canceled = 'N'
AND o.date_insert >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY DATE(o.date_insert)
ORDER BY day;
Конверсия корзины в заказ:
WITH baskets AS (
SELECT DATE(date_insert) AS day, COUNT(DISTINCT fuser_id) AS basket_users
FROM b_sale_basket
WHERE site_id = 's1' AND date_insert >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY DATE(date_insert)
),
orders AS (
SELECT DATE(date_insert) AS day, COUNT(DISTINCT user_id) AS order_users
FROM b_sale_order
WHERE lid = 's1' AND date_insert >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY DATE(date_insert)
)
SELECT b.day,
b.basket_users,
COALESCE(o.order_users, 0) AS order_users,
ROUND(COALESCE(o.order_users, 0)::NUMERIC / NULLIF(b.basket_users, 0) * 100, 2) AS conversion
FROM baskets b
LEFT JOIN orders o ON o.day = b.day
ORDER BY b.day;
Топ товаров по выручке:
SELECT
ie.name AS product_name,
SUM(bi.quantity) AS qty_sold,
SUM(bi.price * bi.quantity) AS revenue
FROM b_sale_basket_item bi
JOIN b_sale_order_shipment_item si ON si.basket_id = bi.id
JOIN b_sale_order o ON o.id = bi.order_id
JOIN b_iblock_element ie ON ie.id = bi.product_id
WHERE o.canceled = 'N' AND o.date_insert >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY ie.id, ie.name
ORDER BY revenue DESC
LIMIT 20;
PHP-реализация виджетов
Данные отдаются через AJAX-endpoint и рендерятся Chart.js:
// /local/ajax/kpi_data.php
if (!$USER->IsAdmin()) {
header('HTTP/1.1 403 Forbidden');
exit;
}
$widget = $_GET['widget'] ?? '';
$dateFrom = $_GET['date_from'] ?? date('Y-m-d', strtotime('-30 days'));
$dateTo = $_GET['date_to'] ?? date('Y-m-d');
$db = \Bitrix\Main\Application::getConnection();
switch ($widget) {
case 'revenue_chart':
$data = $db->query("
SELECT DATE(date_insert) as day,
SUM(price) as revenue,
COUNT(*) as cnt
FROM b_sale_order
WHERE lid = ? AND canceled = 'N'
AND DATE(date_insert) BETWEEN ? AND ?
GROUP BY DATE(date_insert)
ORDER BY day
", [SITE_ID, $dateFrom, $dateTo])->fetchAll();
break;
case 'top_products':
// ... см. запрос выше
break;
}
header('Content-Type: application/json');
echo json_encode(['success' => true, 'data' => $data ?? []]);
// Инициализация графика выручки
fetch('/local/ajax/kpi_data.php?widget=revenue_chart&date_from=2024-01-01')
.then(r => r.json())
.then(({ data }) => {
const ctx = document.getElementById('revenueChart').getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: data.map(d => d.day),
datasets: [{
label: 'Выручка, ₽',
data: data.map(d => d.revenue),
backgroundColor: '#4F81BD',
}]
},
options: { responsive: true, plugins: { legend: { display: false } } }
});
});
Кейс: дашборд для интернет-магазина электроники
Проект — e-commerce с 4 менеджерами, 50–80 заказов в день. Задача: руководитель хочет видеть выручку в реальном времени, конверсию и загрузку менеджеров. Реализовали дашборд с 6 виджетами:
- Выручка сегодня / вчера / неделю назад (сравнение в числах и %)
- График выручки за 30 дней (Bar chart)
- Воронка: посетители → корзины → заказы (данные из Битрикс + Яндекс.Метрика API)
- Топ-10 товаров по выручке за период
- Загрузка менеджеров: количество заказов в работе на каждого
- Незакрытые заказы старше 3 дней (требуют внимания)
Дашборд обновляется каждые 5 минут через setInterval. Тяжёлые агрегатные запросы кэшируются на 5 минут в таблице b_cache_tag с инвалидацией при изменении статусов заказов.
Время разработки — 12 рабочих дней (SQL-запросы, PHP-backend, верстка дашборда, интеграция с Метрикой).
Сроки
| Объём | Срок |
|---|---|
| 3–4 виджета (выручка, заказы, топ товаров) | 4–6 дней |
| 6–8 виджетов + фильтры по периоду | 8–12 дней |
| Полный дашборд + интеграция с внешними источниками | 12–20 дней |







