לוח המחוונים הסטנדרטי של Bitrix מציג מדדים טכניים—עומס, שגיאות, סטטוס מודולים. מדדי KPI עסקיים אינם שם: הכנסות היום, המרת משפך, ערך הזמנה ממוצע למנהל נראים במערכות נפרדות או אפילו באקסל. לוח מחוונים עם מדדי KPI עסקיים המשולב ישירות ב-Bitrix מגשר על הפער הזה. אנו מפתחים לוחות מחוונים כאלה במפתח מלא: משאילתות SQL ועד ויזואליזציה בלוח הניהול או בדף ציבורי.
אילו מדדי KPI העסק באמת צריך?
לעתים קרובות מנהלים מבקשים "כל המדדים," אבל הערך האמיתי טמון ב-5–6 אינדיקטורים מרכזיים. חנות מסחר אלקטרוני צריכה הכנסות, המרה, ערך הזמנה ממוצע, מוצרים מובילים. מפיץ סיטונאי צריך חובות לקוחות, תשלומים באיחור, עומס מנהלים. אנו עוזרים לזהות בדיוק את אותם מדדי KPI שמניעים קבלת החלטות.
למה דוחות Bitrix סטנדרטיים אינם מספיקים?
דוחות סטנדרטיים הם תמונות מצב ברגע הבקשה, ללא דינמיקה או השוואות תקופות. אין חלון אחד: הכנסות נראות ב-1C, המרה ב-Yandex.Metrica, עומס בניהול כוח אדם. לוח מחוונים מאחד נתונים אלה בממשק אחד, וחוסך 2–3 שעות ביום על איחוד.
ארכיטקטורת לוח המחוונים
לוח המחוונים מיושם כדף נפרד בקטע הניהול: /bitrix/admin/kpi_dashboard.php. או כדף ציבורי בקטע מוגבל—לגישת מנהל ללא זכויות ל-/bitrix/admin/.
הנתונים נאספים ישירות ממסד הנתונים באמצעות SQL—מהיר יותר מקריאות רציפות ל-API של Bitrix עבור כל ווידג'ט. הוויזואליזציה משתמשת ב-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 ומעובדים עם 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 ?? []]);
// Инициализация графика выручки
const startDate = new Date();
startDate.setDate(startDate.getDate() - 30);
fetch(`/local/ajax/kpi_data.php?widget=revenue_chart&date_from=${encodeURIComponent(startDate.toISOString().slice(0,10))}`)
.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 }
}
}
});
}); מקרה בוחן: לוח מחוונים לחנות מסחר אלקטרוני לאלקטרוניקה (הלקוח שלנו)
הפרויקט הוא חנות מסחר אלקטרוני עם 4 מנהלים, 50–80 הזמנות ביום. המטרה: המנהל רוצה הכנסות בזמן אמת, המרה ועומס מנהלים. יישמנו לוח מחוונים עם 6 ווידג'טים:
- הכנסות היום / אתמול / שבוע שעבר (השוואה מספרית ובאחוזים)
- תרשים הכנסות על פני 30 יום (תרשים עמודות)
- משפך: מבקרים → עגלות → הזמנות (נתונים מ-Bitrix + API של Yandex.Metrica)
- 10 המוצרים המובילים לפי הכנסות לתקופה
- עומס מנהלים: מספר הזמנות בתהליך לכל מנהל
- הזמנות לא סגורות מעל 3 ימים (דורשות תשומת לב)
לוח המחוונים מתרענן כל 5 דקות דרך 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; . שאילתות אגרגציה כבדות נשמרות במטמון למשך 5 דקות עם פסילה בעת שינוי סטטוס הזמנה. מנהל הפרויקט ציין שלוח המחוונים קיצץ את זמן ניתוח הנתונים פי שלושה.
זמן פיתוח: 12 ימי עבודה (שאילתות SQL, backend PHP, עיצוב לוח מחוונים, אינטגרציית Metrica). זמן שנחסך למנהל: עד 10 שעות בחודש על הכנת דוחות.
טעויות נפוצות בפיתוח לוחות מחוונים
- שאילתות ללא מטמון—עם 10,000+ הזמנות הדף נטען במשך 20+ שניות.
- ניסיון להביא את כל הנתונים דרך
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;—בהיקפים גדולים, זה אסון. - מסנני תאריכים חסרים—לוח המחוונים חסר תועלת לניתוח מגמות.
- זכויות גישה שלא נלקחו בחשבון—מנהלים רואים הזמנות של אחרים.
אנו פותרים בעיות אלה בשלב התכנון: שימוש ב-SQL גולמי, מטמון מתויג, מודל מבוסס תפקידים.
מה כלול בעבודה
| רכיב | תיאור |
|---|---|
| מפרט טכני | תיאור מדדים, מקורות נתונים, עיצובים |
| אב טיפוס | עיצוב אינטראקטיבי בלוח הניהול |
| פיתוח | שאילתות SQL, נקודות קצה PHP, ווידג'טים JS |
| אינטגרציה | 1C, Yandex.Metrica, CRM (לפי צורך) |
| בדיקות | בדיקת עומס עם 1000+ הזמנות |
| תיעוד | הוראות להוספת ווידג'טים חדשים |
| מסירה | קוד מקור, גישת מטמון |
לוחות זמנים
| היקף | משך |
|---|---|
| 3–4 ווידג'טים (הכנסות, הזמנות, מוצרים מובילים) | 4–6 ימים |
| 6–8 ווידג'טים + מסנני תקופות | 8–12 ימים |
| לוח מחוונים מלא + אינטגרציה עם מקורות חיצוניים | 12–20 ימים |
למה לבחור בנו
למהנדסים שלנו יש ניסיון של למעלה מ-10 שנים ב-Bitrix ויותר מ-50 פרויקטים של לוחות מחוונים. אנו שותף מוסמך של 1C-Bitrix. אנו מבטיחים: לוח המחוונים לא יקרוס בעומס שיא, הנתונים טריים עד 5 דקות, הוויזואליזציה רספונסיבית לכל מסך. עלות הפיתוח נקבעת לאחר ניתוח.
אנו נעריך את הפרויקט שלכם. צרו קשר כדי לדון במדדים ולקבל אב טיפוס ללוח מחוונים תוך יום אחד.

