Розробка дашборду з KPI для адміністратора 1С-Бітрікс
Стандартна адміністративна панель 1С-Бітрікс показує технічні метрики — навантаження, помилки, стан модулів. Бізнес-KPI там немає: виручку за сьогодні, конверсію воронки, середній чек по менеджерах дивляться в окремих системах або взагалі в Excel. Дашборд із бізнес-метриками, вбудований безпосередньо в 1С-Бітрікс, усуває цей розрив.
Архітектура дашборду
Дашборд реалізується як окрема сторінка в адміністративній частині: /bitrix/admin/kpi_dashboard.php. Або як публічна сторінка в закритому розділі — для доступу менеджерів без права на /bitrix/admin/.
Дані агрегуються безпосередньо з бази через SQL — це швидше, ніж послідовні виклики API 1С-Бітрікс для кожного віджета. Візуалізація — Chart.js або ApexCharts, що підключаються як JavaScript-залежності.
Ключові 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)
- Воронка: відвідувачі → кошики → замовлення (дані з 1С-Бітрікс + API Яндекс.Метрики)
- Топ-10 товарів за виручкою за період
- Завантаженість менеджерів: кількість замовлень у роботі на кожного
- Незакриті замовлення старше 3 днів (потребують уваги)
Дашборд оновлюється кожні 5 хвилин через setInterval. Важкі агрегатні запити кешуються на 5 хвилин у таблиці b_cache_tag з інвалідацією при зміні статусів замовлень.
Час розробки — 12 робочих днів (SQL-запити, PHP-backend, верстка дашборду, інтеграція з Метрикою).
Терміни
| Обсяг | Термін |
|---|---|
| 3–4 віджети (виручка, замовлення, топ товарів) | 4–6 днів |
| 6–8 віджетів + фільтри за періодом | 8–12 днів |
| Повний дашборд + інтеграція з зовнішніми джерелами | 12–20 днів |







