מנהל קטגוריות מבזבז עד 30% מזמנו בבדיקת מחירים ידנית — פתיחת כרטיסי מוצר, השוואה עם מתחרים, וחזרה על התהליך. עם קטלוג של 50,000 פריטים, מדובר במאות שעות עבודה בחודש שיכלו להיות מוקדשות לתמחור אסטרטגי. הקמנו דשבורד שמציג עמדות בעייתיות תוך 30 שניות, את ההפרש בדולרים ובאחוזים, ומאפשר שינוי מחירים ישירות על המסך. גישה זו מקצרת את זמן הניתוח פי 10 בהשוואה להשוואה ידנית ומפחיתה את הסיכוי לשגיאות בהעתקת נתונים.
בפרויקט אחד עם קטלוג של 120,000 מוצרים, יישמנו את הדשבורד תוך 8 ימים. לאחר ההשקה, המנהלים צמצמו את זמן ניתוח המחירים מ-4 שעות ל-15 דקות ביום. חיסכון ממוצע בזמן ניתוח מחירים — 30%, החזר השקעה תוך 2–3 חודשים הודות להפחתת עבודה ידנית. נאמוד את הפרויקט שלך תוך יום אחד ונספק הצעת מחיר ללא תוספות מיותרות. צור קשר לייעוץ.
מקורות נתונים
הדשבורד בנוי על שלוש טבלאות:
-
bl_competitor_prices— מחירי מתחרים עדכניים -
bl_product_price_position— אגרגטים (מינימום/מקסימום/ממוצע של מתחרים, הדירוג שלנו) -
b_catalog_price— המחירים העדכניים שלנו
הנתונים בטבלת האגרגטים מתעדכנים על ידי סוכן לאחר כל סנכרון מחירי מתחרים. כדי לזרז שאילתות, אנו מוסיפים אינדקסים על שדות product_id, rank ו-updated_at. אופטימיזציית SQL מאפשרת עיבוד קטלוגים של עד מיליון מוצרים ללא עיכובים ניכרים. עבור קטלוגים מעל 500,000 פריטים, אנו מגדירים בנוסף חלוקת טבלאות וקאשינג מתויג באמצעות Bitrix Cache.
למה מפת חום לפי קטגוריות היא המפתח לאבחון מהיר
במקום לגלול בין אינסוף מוצרים, המנהל רואה מיד איזו קטגוריה בקטלוג "בוערת". אנו יוצרים מפה: ירוק (>70% במקום הראשון), צהוב (50–70%), אדום (<50%). זה מקצר את זמן הניתוח פי 10 בהשוואה לבדיקה ידנית.
// Запрос агрегатов по разделам $sectionStats = \Bitrix\Main\Application::getConnection()->query(" SELECT s.NAME as section_name, COUNT(*) as total_products, COUNT(CASE WHEN ppp.rank = 1 THEN 1 END) as on_first_place, ROUND(AVG(ppp.rank), 1) as avg_rank, COUNT(CASE WHEN ppp.our_price > ppp.min_comp THEN 1 END) as losing_count FROM bl_product_price_position ppp JOIN b_iblock_element ie ON ie.ID = ppp.product_id JOIN b_iblock_section s ON s.ID = ie.IBLOCK_SECTION_ID GROUP BY s.ID, s.NAME ORDER BY losing_count DESC ")->fetchAll(); אילו מדדים הדשבורד מציג?
עמדת מחיר — התפלגות מוצרים לפי דירוג:
SELECT rank, COUNT(*) as product_count FROM bl_product_price_position WHERE updated_at > NOW() - INTERVAL '24 hours' GROUP BY rank ORDER BY rank; מוצג כתרשים עמודות: "מקום ראשון — 34 מוצרים, מקום שני — 87, מקום שלישי — 124..." מוצרים שבהם אנחנו יקרים יותר ממחיר המתחרה המינימלי:
SELECT ie.ID, ie.NAME, ppp.our_price, ppp.min_comp as competitor_min, ROUND((ppp.our_price - ppp.min_comp) / ppp.min_comp * 100, 1) as diff_pct, ppp.rank FROM bl_product_price_position ppp JOIN b_iblock_element ie ON ie.ID = ppp.product_id WHERE ppp.our_price > ppp.min_comp AND ppp.min_comp > 0 ORDER BY diff_pct DESC LIMIT 50; הכנסות אבודות (הערכה):
SELECT SUM( (ppp.our_price - ppp.min_comp) / ppp.our_price * oe.order_count * ppp.our_price ) as estimated_lost_revenue FROM bl_product_price_position ppp JOIN ( SELECT product_id, COUNT(DISTINCT order_id) as order_count FROM b_sale_basket WHERE date_insert > NOW() - INTERVAL '30 days' GROUP BY product_id ) oe ON oe.product_id = ppp.product_id WHERE ppp.our_price > ppp.min_comp; איך לעדכן נתונים ללא טעינה מחדש?
כפתור "רענן נתונים" שולח בקשת AJAX לשרת, שמסנכרן נתונים עם מקור המחירים ומחשב מחדש אגרגטים. הממשק נשאר רספונסיבי — ללא F5.
document.getElementById('refresh-btn').addEventListener('click', function() { this.disabled = true; fetch('/bitrix/services/main/ajax.php?action=PriceDashboard:refresh', { method: 'POST', headers: {'X-Bitrix-Csrf-Token': BX.bitrix_sessid()} }) .then(r => r.json()) .then(data => { if (data.status === 'ok') location.reload(); }); }); מבנה עמוד הדשבורד
העמוד ב-// Запрос агрегатов по разделам $sectionStats = \Bitrix\Main\Application::getConnection()->query(" SELECT s.NAME as section_name, COUNT(*) as total_products, COUNT(CASE WHEN ppp.rank = 1 THEN 1 END) as on_first_place, ROUND(AVG(ppp.rank), 1) as avg_rank, COUNT(CASE WHEN ppp.our_price > ppp.min_comp THEN 1 END) as losing_count FROM bl_product_price_position ppp JOIN b_iblock_element ie ON ie.ID = ppp.product_id JOIN b_iblock_section s ON s.ID = ie.IBLOCK_SECTION_ID GROUP BY s.ID, s.NAME ORDER BY losing_count DESC ")->fetchAll(); מורכב משלושה בלוקים: בלוק עליון — מדדי KPI סיכומיים:
- סה"כ מוצרים במעקב: N
- מתוכם יקרים יותר מהמתחרים: N (XX%)
- עמדת מחיר ממוצעת: מקום X.X
- מוצרים במקום הראשון: N
בלוק אמצעי — מפת חום לפי קטגוריות בקטלוג (כמתואר לעיל). בלוק תחתון — טבלת מוצרים בעייתיים עם עמודות:
| מוצר | מק"ט | המחיר שלנו | מחיר מתחרה מינימלי | הפרש | דירוג | [שינוי מחיר] |
|---|
כפתור "שינוי מחיר" — עריכה מובנית עם שמירה דרך AJAX אל SELECT rank, COUNT(*) as product_count FROM bl_product_price_position WHERE updated_at > NOW() - INTERVAL '24 hours' GROUP BY rank ORDER BY rank; . בעת השמירה, SELECT ie.ID, ie.NAME, ppp.our_price, ppp.min_comp as competitor_min, ROUND((ppp.our_price - ppp.min_comp) / ppp.min_comp * 100, 1) as diff_pct, ppp.rank FROM bl_product_price_position ppp JOIN b_iblock_element ie ON ie.ID = ppp.product_id WHERE ppp.our_price > ppp.min_comp AND ppp.min_comp > 0 ORDER BY diff_pct DESC LIMIT 50; מתעד מי שינה, מתי, מאיזה מחיר לאיזה מחיר.
פרטי יישום עריכה מובנית
לעריכה מובנית אנו משתמשים ברכיב `bitrix:main.ui.grid` עם פעולה מותאמת אישית. לאחר שינוי המחיר, נשלחת בקשה אל `/bitrix/services/main/ajax.php?action=PriceDashboard:updatePrice` שמאמתת נתונים, כותבת ל-`b_catalog_price` וללוג. אם המחיר חורג מהגבולות המותרים, המשתמש מקבל הודעת שגיאה.תהליך עבודה
- ניתוח — אנו לומדים את הקטלוג הנוכחי שלך, מקורות מחירי מתחרים, ושאילתות אופייניות של מנהלים. מגדירים מדדי מפתח.
- עיצוב — מתכננים מבנה HL-block, סוכנים, שאילתות SQL וממשק.
- יישום — כתיבת קוד: שאילתות אגרגציה, דשבורד עם Chart.js, עריכה מובנית, ייצוא.
- בדיקות — בדיקות על נתונים אמיתיים, מדידת ביצועים, תיקון צווארי בקבוק.
- השקה — פריסה לסביבת הייצור, הדרכת מנהלים, מסירת תיעוד.
ייצוא לאקסל
כפתור "ייצוא לאקסל" יוצר דוח דרך SELECT SUM( (ppp.our_price - ppp.min_comp) / ppp.our_price * oe.order_count * ppp.our_price ) as estimated_lost_revenue FROM bl_product_price_position ppp JOIN ( SELECT product_id, COUNT(DISTINCT order_id) as order_count FROM b_sale_basket WHERE date_insert > NOW() - INTERVAL '30 days' GROUP BY product_id ) oe ON oe.product_id = ppp.product_id WHERE ppp.our_price > ppp.min_comp; : כל המוצרים עם מחירי מתחרים בעמודות נפרדות (כל מתחרה בעמודה נפרדת), המחיר שלנו, עמדה, מחיר מומלץ (אם מוגדר repricer).
מה כלול בעבודה (תוצרים)
- טבלאות אגרגטים מוגדרות עם אינדקסים מותאמים
- שאילתות SQL עבור KPI, מפת חום ורשימת בעיות
- ממשק דשבורד (PHP + JS + Chart.js)
- עריכת מחיר מובנית עם תיעוד
- ייצוא לאקסל
- מדריך למנהלים לעבודה עם הדשבורד
- אחריות ל-30 יום על פעילות יציבה
לוחות זמנים
| שלב | זמן |
|---|---|
| שאילתות אגרגציה ואופטימיזציה | יומיים |
| בלוק KPI עליון + Chart.js | יום אחד |
| מפת חום לפי קטגוריות | יום אחד |
| טבלת מוצרים בעייתיים + עריכה מובנית | יומיים |
| ייצוא לאקסל | יום אחד |
| בדיקות | יום אחד |
| סה"כ | 8–9 ימים |
טעויות נפוצות ביישום דשבורד
התעלמות מאינדקסים. ללא אינדקסים מתאימים (במיוחד על document.getElementById('refresh-btn').addEventListener('click', function() { this.disabled = true; fetch('/bitrix/services/main/ajax.php?action=PriceDashboard:refresh', { method: 'POST', headers: {'X-Bitrix-Csrf-Token': BX.bitrix_sessid()} }) .then(r => r.json()) .then(data => { if (data.status === 'ok') location.reload(); }); }); ו-/bitrix/admin/price_dashboard.php), שאילתות על קטלוג של 100,000 מוצרים יכולות לקחת דקות. אנו תמיד בודקים b_catalog_price ומוסיפים אינדקסים מורכבים.
סנכרון בעומס שיא. עדכון אגרגטים דרך סוכן פעם בשעה הוא בדרך כלל בטוח, אבל אם הניתוח רץ בזמן עבודה פעילה של מנהלים, עדיף להעביר את לוח הזמנים ללילה או להשתמש בתור משימות.
חוסר תיעוד שינויים. ללא bl_price_change_log, אי אפשר לעקוב מי שינה מחירים ומתי. זה קריטי לדוחות וביקורות.
עם הניסיון שלנו (יותר מ-50 יישומי דשבורד על Bitrix), אנו נמנעים מהמלכודות הללו. מומחים מוסמכים עם 7+ שנות ניסיון בעבודה עם 1C-Bitrix מבטיחים פתרון יציב. הזמינו התקנת דשבורד סוהר.
קבלו ייעוץ — צרו קשר, נעריך את הפרויקט שלכם ונכין מפת דרכים. מנהל המסחרי שלכם יקבל כלי שבאמת חוסך זמן. לפרטים על עבודה עם HL-blocks, עיינו בתיעוד הרשמי של 1C-Bitrix ל-Highload blocks.







