לוחות מחוונים מותאמים אישית ב-Vue.js עבור Bitrix24: משפכים, KPIs ודוחות
האנליטיקה המובנית של Bitrix24 מכסה תרחישים סטנדרטיים: משפך מכירות, דוח מנהלים, תכנית/ביצוע. ברגע שאנליסט עסקי מגיע עם בקשה כמו "הראה לי המרה לפי מקור בהקשר של אזורים לתקופה שרירותית עם פילטר לפי אחראי" — דוחות סטנדרטיים נגמרים. ממשק אנליטי מותאם אישית (לוח מחוונים מבוסס Vue) הוא פתרון מותאם המוטמע ב-Bitrix24 דרך אפליקציית iframe עם גישה ישירה ל-REST API. אנו מטפלים בפרויקטים כאלה במפתח מלא וכבר יישמנו למעלה מ-20 פרויקטים לחברות בגדלים שונים. לוחות מחוונים אלה חוסכים עד 40% מזמן המנהלים באיסוף נתונים ומאפשרים לראות מדדים עסקיים בזמן אמת.
מדוע לוח מחוונים ב-Vue.js יעיל יותר מדוחות סטנדרטיים?
האנליטיקה הסטנדרטית של Bitrix24 מספקת חיתוכים קבועים: תכנית/ביצוע, משפך, דוח מנהלים. אך לניתוח מעמיק — המרה לפי מקור בהקשר של אזורים, השוואת דינמיקה לפי חודש, מדדים מותאמים אישית — יש לייצא נתונים ל-Excel ולעבד ידנית. לוח מחוונים מבוסס Vue פותר זאת: נתונים נשלפים דרך REST API, מצטברים בצד הלקוח או השרת, ומוצגים בגרפים אינטראקטיביים. לפי המדידות שלנו, לוח מחוונים כזה מעבד בקשות פי 3 מהר יותר מדוח סטנדרטי עם מספר פילטרים. המשתמש מקבל כלי קבלת החלטות: הוא רואה דינמיקת מכירות, המרת משפך, יעילות מנהלים בזמן אמת. הנתונים מתעדכנים אוטומטית, פילטרים מאפשרים צפייה בכל תקופה. ללא שינויים ב-CRM הסטנדרטי.
ארכיטקטורת לוח המחוונים
לוח המחוונים מורכב משלוש שכבות:
- שכבת נתונים — שאילתות ל-Bitrix24 REST API, מטמון, צבירה. לצבירות כבדות, אנו משתמשים בשכבת שרת ביניים (Node.js/PHP) הממזגת נתונים ממספר קריאות REST ומחזירה JSON מוכן.
- שכבת אחסון — חנויות Pinia עם מאפיינים מחושבים ריאקטיביים.
- שכבת הצגה — רכיבי Vue עם Chart.js או ApexCharts.
כיצד להאיץ טעינת נתונים עבור לוח המחוונים?
ל-Bitrix24 REST API יש מגבלה של 50 אלמנטים לבקשה. כדי לשלוף את כל העסקאות לתקופה, יש צורך ב-pagination או callBatch. אנו משתמשים באיסוף נתונים באצווה עם pagination ומטמון בצד השרת. לפי התיעוד הרשמי של Bitrix24 REST API, המגבלה לבקשה היא 50 רשומות, ולכן אנו עוקפים זאת באמצעות callBatch בפונקציות composable.
// composables/useCrmData.js
export function useCrmData() {
const { callMethod } = useBx24()
async function fetchAllDeals(filter) {
const allDeals = []
let start = 0
let hasMore = true
while (hasMore) {
const result = await callMethod('crm.deal.list', {
select: ['ID', 'TITLE', 'STAGE_ID', 'OPPORTUNITY', 'SOURCE_ID', 'ASSIGNED_BY_ID', 'DATE_CREATE', 'UF_CRM_REGION'],
filter,
order: { ID: 'ASC' },
start,
})
allDeals.push(...result)
hasMore = result.length === 50
start += 50
}
return allDeals
}
async function fetchDealsByStages(filter) {
const [deals, stages] = await Promise.all([
fetchAllDeals(filter),
callMethod('crm.status.list', {
filter: { ENTITY_ID: 'DEAL_STAGE' }
})
])
return { deals, stages }
}
return {
fetchAllDeals,
fetchDealsByStages
}
} רכיב פילטר תקופה
פילטר התאריך הוא אחד מהאלמנטים המרכזיים בלוח המחוונים. אנו מיישמים אותו ב-Vue 3 באמצעות date-fns.
<!-- components/DateRangeFilter.vue -->
<template>
<div class="filter-bar">
<div class="filter-presets">
<button
v-for="preset in presets"
:key="preset.id"
:class="{ active: activePreset === preset.id }"
@click="applyPreset(preset)"
>{{ preset.label }}</button>
</div>
<div class="filter-custom">
<input type="date" v-model="dateFrom" @change="emitCustomRange" />
<input type="date" v-model="dateTo" @change="emitCustomRange" />
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { startOfMonth, endOfMonth, subMonths, format } from 'date-fns'
const emit = defineEmits(['change'])
const activePreset = ref('current_month')
const dateFrom = ref('')
const dateTo = ref('')
const presets = [
{ id: 'current_month', label: 'Текущий месяц' },
{ id: 'prev_month', label: 'Прошлый месяц' },
{ id: 'quarter', label: 'Квартал' },
{ id: 'year', label: 'Год' },
]
function applyPreset(preset) {
activePreset.value = preset.id
const now = new Date()
let from, to
switch (preset.id) {
case 'current_month':
from = startOfMonth(now)
to = endOfMonth(now)
break
case 'prev_month':
from = startOfMonth(subMonths(now, 1))
to = endOfMonth(subMonths(now, 1))
break
// ...
}
emit('change', {
from: format(from, 'yyyy-MM-dd'),
to: format(to, 'yyyy-MM-dd'),
})
}
</script> שילוב Chart.js
ליצירת גרפים, אנו משתמשים ב-composable שמאתחל את Chart.js ומעדכן אותו כאשר התצורה משתנה.
// composables/useChart.js
import { onMounted, onUnmounted, ref, watch } from 'vue'
import Chart from 'chart.js/auto'
export function useChart(canvasRef, config) {
let chart = null
onMounted(() => {
chart = new Chart(canvasRef.value, config.value)
})
watch(config, (newConfig) => {
if (!chart) return
chart.data = newConfig.data
chart.update('active')
}, { deep: true })
onUnmounted(() => chart?.destroy())
}רכיב משפך מכירות עם פסים אופקיים:
<template>
<div class="chart-card">
<h3>Воронка продаж</h3>
<canvas ref="canvasRef" height="300"></canvas>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
import { useDashboardStore } from '@/stores/dashboard'
import { useChart } from '@/composables/useChart'
const store = useDashboardStore()
const canvasRef = ref(null)
const chartConfig = computed(() => ({
type: 'bar',
data: {
labels: store.stages.map(s => s.NAME),
datasets: [{
label: 'Количество сделок',
data: store.stages.map(s => store.dealsByStage[s.STATUS_ID] || 0),
backgroundColor: store.stages.map(s => s.COLOR || '#4a90d9'),
}]
},
options: {
indexAxis: 'y',
responsive: true,
plugins: {
legend: {
display: false
}
}
}
}))
useChart(canvasRef, chartConfig)
</script> כרטיסי KPI
צבירת מדדים בצד הלקוח באמצעות computed של Pinia:
// stores/dashboard.js
const kpis = computed(() => {
const deals = filteredDeals.value
const won = deals.filter(d => d.STAGE_ID === 'WON')
const total = deals.length
return {
totalDeals: total,
wonDeals: won.length,
conversionRate: total ? Math.round((won.length / total) * 100) : 0,
totalRevenue: won.reduce((sum, d) => sum + parseFloat(d.OPPORTUNITY || 0), 0),
avgDealSize: won.length ? won.reduce((sum, d) => sum + parseFloat(d.OPPORTUNITY || 0), 0) / won.length : 0,
}
}) ביצועים
לוחות מחוונים עם נפחי נתונים גדולים דורשים אופטימיזציה:
- צבירה בצד השרת — אין להעביר 10,000 עסקאות לדפדפן.
- shallowRef עבור מערכים גדולים ב-Pinia — אין צורך בריאקטיביות עמוקה לכל אובייקט.
- וירטואליזציה של טבלאות — @tanstack/vue-virtual עבור רשימות > 500 שורות.
- Debounce על פילטרים — 300–500 אלפיות השנייה לפני ביצוע בקשה.
השוואת ספריות גרפים
| ספרייה | סוגי גרפים | ביצועים | רישיון |
|---|---|---|---|
| Chart.js | 8 בסיסיים | גבוה עד 1,000 נקודות | MIT |
| ApexCharts | 15+ (כולל heatmaps) | בינוני עד 10,000 נקודות | MIT |
| ECharts | 20+ | גבוה עד 100,000 נקודות | Apache 2.0 |
עבור רוב לוחות המחוונים, Chart.js מתאים, אך אם יש צורך בלוחות מחוונים מורכבים עם נתונים גדולים, אנו משתמשים ב-ApexCharts או ECharts.
השוואת שיטות שליפת נתונים
| שיטה | מהירות | מגבלות |
|---|---|---|
| REST ישיר | בינונית | 50 רשומות |
| callBatch | מהירה | 50 לבקשה |
| פרוקסי שרת | גבוהה | אין |
תהליך הפיתוח והערבויות
התהליך כולל:
- ניתוח מדדים ואיסוף דרישות – הגדרת KPIs ומקורות נתונים.
- עיצוב פריסה ו-wireframes – אישור אבות טיפוס של לוח המחוונים.
- פיתוח בטכנולוגיית Vue 3 + Pinia – בניית רכיבים לשימוש חוזר.
- אינטגרציה עם Bitrix24 REST API – יישום שליפת נתונים ומטמון.
- בדיקת ביצועים על נתונים אמיתיים – אופטימיזציה למהירות.
- פריסה לענן או לשרת Bitrix24.
- מסירת תיעוד, גישה והדרכה לאנליסטים.
העלות כוללת:
- פיתוח לוח מחוונים לפי הדרישות שלך.
- אינטגרציה עם Bitrix24 REST API, הגדרת מטמון.
- הרכבת ממשק באמצעות Vue.js, Pinia, Chart.js/ApexCharts.
- בדיקות על נתונים אמיתיים, אופטימיזציה של שאילתות.
- תיעוד, גישה לקוד, הדרכת משתמשים.
- אחריות ל-6 חודשים על הפונקציונליות.
מה כלול בעבודה
- עיצוב ופיתוח לוח מחוונים מותאם אישית
- אינטגרציה עם Bitrix24 REST API
- הגדרת מטמון וצבירת נתונים
- גרפים אינטראקטיביים באמצעות Chart.js או ApexCharts
- תיעוד מלא וקוד מקור
- הדרכת משתמשים לאנליסטים
- אחריות ל-6 חודשים על כל הפונקציונליות
- אפשרויות תמיכה שוטפת זמינות
חיסכון בעלויות והחזר השקעה
לקוחות מדווחים על חיסכון של עד 30 שעות בחודש למנהל על ידי אוטומציה של דיווח, מה שמתורגם לאלפי דולרים בשנה. לדוגמה, חברה בינונית עם 10 מנהלי מכירות יכולה לחסוך למעלה מ-$50,000 בשנה בזמן אנליסטים. ההשקעה הטיפוסית בפרויקט נעה בין $1,500 ללוח מחוונים בסיסי ועד $15,000 לפורטל אנליטי מלא, עם תקופת החזר ממוצעת של 3 חודשים.
ציר זמן
לוח מחוונים עם 3–5 ווידג'טים (משפך, כרטיסי KPI, דינמיקת תקופה) — 5–8 ימי עסקים. פורטל אנליטי מלא עם ווידג'טים רבים, צבירה בצד השרת, ייצוא ותפקידי גישה — 3–5 שבועות. הזמינו פיתוח — קבלו ייעוץ על צירי זמן והיקף.
משאבים נוספים: Vue.js ו-Chart.js הם כלים מוכחים ללוחות מחוונים.

