הגדרת התאמת מחירים אוטומטית למתחרים ב-1C-Bitrix
אנו מגדירים מערכת התאמת מחירים אוטומטית ב-1C-Bitrix — מערכת שמתאימה מחירי מוצרים באופן דינמי בהתאם לשינויים של מתחרים. ללא מנגנוני הגנה, היא עלולה לגרום למלחמות מחירים: חנות מורידה מחיר, מתחרה מגיב, ושניהם מפסידים מרווח. כדי למנוע זאת, אנו מתכננים חוקים גמישים עם רצפים, תקרות וסדרי עדיפויות. אנו מספקים פתרון מלא ומפתח — ממודל הנתונים ועד לסוכן הרקע ופאנל הניהול. זמן ביצוע: 11–13 ימים, תלוי בגודל הקטלוג. במשך למעלה מ-5 שנים, ביצענו 50+ פרויקטים של אוטומציית מחירים ב-1C-Bitrix. אנו מוסמכים כ-"1C-Bitrix: Developer" ושילבנו עם CommerceML, OFD ומערכות מעקב מתחרים.
מדוע יש צורך בהגנה מפני מלחמות מחירים?
תיקון אוטומטי ללא הגנה מוביל להורדת מחירים אוטומטית. מתחרים עשויים להציב מחירים מבצעיים למשך 15–20 דקות, והחנות שלך מעתיקה אותם בעיוורון. אנו מיישמים ארבעה מנגנוני הגנה: קירור (השהיה בין שינויים), מגבלת שינוי יומית (מקסימום X% ליום), אימות מתחרים (התעלמות ממבצעים קצרים מ-30 דקות), ונעילת מרווח מינימלי. עבור קטלוג אלקטרוניקה עם 10,000 מוצרים, מנגנונים אלה מפחיתים טריגרים שגויים ב-70%. ניתן לחסוך עד 40% בעלויות עבודה על ידי ביטול ניטור מחירים ידני.
לפי התיעוד הרשמי של 1C-Bitrix, מנגנון הסוכן מאפשר משימות רקע ללא מעורבות משתמש.
עיצוב מודל החוקים
החוקים נמצאים בטבלת bl_repricing_rules. כל חוק מגדיר אסטרטגיה (beat_min, match_min, avg, position), גבולות (רצפה ותקרה), ורשימת מתחרים. בחירת האסטרטגיה תלויה במרווח המוצר ובמטרות העסקיות.
CREATE TABLE bl_repricing_rules ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, scope_type VARCHAR(20) NOT NULL, -- 'product', 'section', 'all' scope_id INT, -- ID товара или раздела strategy VARCHAR(30) NOT NULL, -- 'beat_min', 'match_min', 'avg', 'position' value NUMERIC(8,4), -- для beat_min: -50 (руб) или -0.05 (5%) value_type VARCHAR(10) DEFAULT 'abs', -- 'abs' | 'pct' floor_type VARCHAR(10) DEFAULT 'margin', -- 'margin' | 'abs' | 'cost_pct' floor_value NUMERIC(8,4), -- минимальная маржа или абс. порог ceiling_type VARCHAR(10) DEFAULT 'abs', ceiling_value NUMERIC(12,2), -- не выше этой цены competitor_ids INT[], -- NULL = все конкуренты priority SMALLINT DEFAULT 10, active BOOLEAN DEFAULT true ); | אסטרטגיה | תיאור | דוגמת שימוש |
|---|---|---|
| beat_min | הורדה מתחת למחיר הנמוך ביותר של המתחרה ב-N ש"ח/% | אגרסיבית למוצרים עם מרווח גבוה |
| match_min | התאמה למחיר הנמוך ביותר | שמירה על תדמית חנות זולה |
| avg | שמירה על ממוצע אריתמטי | מאוזנת למוצרים עם מרווח בינוני |
| position | החזקת מיקום N בדירוג הזול ביותר | תפיסת דירוג ספציפי (לדוגמה, שלישי) |
מנוע חישוב המחירים
CREATE TABLE bl_repricing_rules ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, scope_type VARCHAR(20) NOT NULL, -- 'product', 'section', 'all' scope_id INT, -- ID товара или раздела strategy VARCHAR(30) NOT NULL, -- 'beat_min', 'match_min', 'avg', 'position' value NUMERIC(8,4), -- для beat_min: -50 (руб) или -0.05 (5%) value_type VARCHAR(10) DEFAULT 'abs', -- 'abs' | 'pct' floor_type VARCHAR(10) DEFAULT 'margin', -- 'margin' | 'abs' | 'cost_pct' floor_value NUMERIC(8,4), -- минимальная маржа или абс. порог ceiling_type VARCHAR(10) DEFAULT 'abs', ceiling_value NUMERIC(12,2), -- не выше этой цены competitor_ids INT[], -- NULL = все конкуренты priority SMALLINT DEFAULT 10, active BOOLEAN DEFAULT true ); מביא את החוק הרלוונטי, אוסף מחירי מתחרים, ומחשב את הערך המבוקש. לאחר מכן מוחלים אילוצים (רצפה/תקרה), והמחיר הסופי מעוגל לפורמט שיווקי (מסתיים ב-0 או 9 אגורות). אם המחיר החדש שונה בפחות מאגורה אחת, לא מתבצע שינוי — ומונעים תנודות מיקרו. המנוע מעבד עד 10,000 מוצרים בכל ריצת סוכן, פי 5 מהר יותר מעדכונים ידניים. למעלה ממיליון התאמות מחירים בוצעו בכל הלקוחות.
class RepricingEngine { public function calculate(int $productId): ?array { $rule = $this->getApplicableRule($productId); if (!$rule) return null; $competitorPrices = $this->getCompetitorPrices($productId, $rule['competitor_ids']); if (empty($competitorPrices)) return null; $targetPrice = match($rule['strategy']) { 'beat_min' => $this->beatMin($competitorPrices, $rule), 'match_min' => min($competitorPrices), 'avg' => array_sum($competitorPrices) / count($competitorPrices), 'position' => $this->targetPosition($competitorPrices, $rule['value']), default => null, }; if ($targetPrice === null) return null; // Применяем ограничения $floor = $this->calcFloor($productId, $rule); $ceiling = (float)$rule['ceiling_value']; $finalPrice = max($targetPrice, $floor); if ($ceiling > 0) $finalPrice = min($finalPrice, $ceiling); // Округление до 0 или 9 в копейках $finalPrice = $this->roundPrice($finalPrice); $currentPrice = $this->getCurrentPrice($productId); if (abs($finalPrice - $currentPrice) < 0.01) return null; // Нет изменений return [ 'product_id' => $productId, 'current_price' => $currentPrice, 'new_price' => $finalPrice, 'rule_id' => $rule['id'], 'reason' => $rule['strategy'], 'competitor_min'=> min($competitorPrices), ]; } private function beatMin(array $prices, array $rule): float { $min = min($prices); return $rule['value_type'] === 'pct' ? $min * (1 + $rule['value'] / 100) : $min + $rule['value']; } private function calcFloor(int $productId, array $rule): float { if ($rule['floor_type'] === 'margin') { $cost = $this->getCostPrice($productId); return $cost > 0 ? $cost * (1 + $rule['floor_value'] / 100) : 0; } return (float)$rule['floor_value']; } } החלת מחירים ב-Bitrix
RepricingEngine מתעד את השינוי לפני העדכון באמצעות class RepricingEngine { public function calculate(int $productId): ?array { $rule = $this->getApplicableRule($productId); if (!$rule) return null; $competitorPrices = $this->getCompetitorPrices($productId, $rule['competitor_ids']); if (empty($competitorPrices)) return null; $targetPrice = match($rule['strategy']) { 'beat_min' => $this->beatMin($competitorPrices, $rule), 'match_min' => min($competitorPrices), 'avg' => array_sum($competitorPrices) / count($competitorPrices), 'position' => $this->targetPosition($competitorPrices, $rule['value']), default => null, }; if ($targetPrice === null) return null; // Применяем ограничения $floor = $this->calcFloor($productId, $rule); $ceiling = (float)$rule['ceiling_value']; $finalPrice = max($targetPrice, $floor); if ($ceiling > 0) $finalPrice = min($finalPrice, $ceiling); // Округление до 0 или 9 в копейках $finalPrice = $this->roundPrice($finalPrice); $currentPrice = $this->getCurrentPrice($productId); if (abs($finalPrice - $currentPrice) < 0.01) return null; // Нет изменений return [ 'product_id' => $productId, 'current_price' => $currentPrice, 'new_price' => $finalPrice, 'rule_id' => $rule['id'], 'reason' => $rule['strategy'], 'competitor_min'=> min($competitorPrices), ]; } private function beatMin(array $prices, array $rule): float { $min = min($prices); return $rule['value_type'] === 'pct' ? $min * (1 + $rule['value'] / 100) : $min + $rule['value']; } private function calcFloor(int $productId, array $rule): float { if ($rule['floor_type'] === 'margin') { $cost = $this->getCostPrice($productId); return $cost > 0 ? $cost * (1 + $rule['floor_value'] / 100) : 0; } return (float)$rule['floor_value']; } } . במקרה של כשל, הסטטוס משתנה ל-RepricingApplicator והמנהל מקבל הודעה. אנו משתמשים ב-REST API לאינטגרציה חיצונית אם נתוני המתחרים מגיעים משותפים.
class RepricingApplicator { public function apply(array $change): void { // Логируем ДО изменения RepricingLogTable::add([ 'PRODUCT_ID' => $change['product_id'], 'RULE_ID' => $change['rule_id'], 'OLD_PRICE' => $change['current_price'], 'NEW_PRICE' => $change['new_price'], 'REASON' => $change['reason'], 'APPLIED_AT' => new \Bitrix\Main\Type\DateTime(), ]); // Обновляем цену $priceResult = \CCatalogProduct::SetPrice( $change['product_id'], BASE_PRICE_TYPE_ID, $change['new_price'], 'USD' ); if (!$priceResult) { // Откат и уведомление об ошибке RepricingLogTable::update($logId, ['STATUS' => 'error']); } } } כיצד להגדיר את סוכן התאמת המחירים
- צור סוכן בפאנל הניהול: "הגדרות" → "ביצועים" → "סוכנים".
- ציין את זמן ההפעלה (מומלץ כל שעה).
- בפונקציית הסוכן, קרא ל-
CCatalogProduct::SetPrice. - הגדר עדיפות ומספר מוצרים לכל ריצה.
כיצד הסוכן פועל
הסוכן רץ כל שעה, אוסף מוצרים עם שינויי מחיר אחרונים של מתחרים, מעביר אותם דרך המנוע, ומחיל עדכונים (או מסמן לאישור ידני במצב error). לכל קטלוג קטלוגי יכול להיות מצב משלו.
מה כלול בהתקנה
| שלב | תוכן | משך |
|---|---|---|
| מודל חוקים ומסד נתונים | עיצוב טבלאות, אינדקסים, מיגרציות | יומיים |
| מנוע חישוב | יישום כל ארבע האסטרטגיות עם אילוצים | 3 ימים |
| סוכן ורישום | סוכן רקע, יומנים, הודעות שגיאה | יומיים |
| ממשק ניהול | טופס לניהול חוקים, טבלת חוקים, מסננים | יומיים |
| בדיקות | מקרי קצה, עומס, הגנה מפני תרחישים אבסורדיים | יומיים |
| סה"כ | מחזור מלא ומפתח | 11–13 ימים |
תוצרים: תיעוד סכמת מסד נתונים, קוד מנוע וסוכן, ממשק ניהול עם גישה מלאה, מדריך הפעלה, תמיכה חודש לאחר ההשקה, ותיעוד קוד. אנו גם מספקים עד שעתיים של הדרכה למנהלים שלך.
למה לסמוך עלינו
במשך 5 שנים, 50+ פרויקטים של אוטומציית מחירים ב-1C-Bitrix. מוסמכים כ-"1C-Bitrix: Developer" עם אינטגרציות ל-CommerceML, OFD, ומעקב מתחרים. אנו מבטיחים קוד שקוף ותיעוד יסודי.
רוצה לבטל ניטור ידני וליישם מחירים אופטימליים באופן אוטומטי? אנו נעריך את הפרויקט שלך ביום עסקים אחד. בממוצע, לקוחות רואים הפחתה של 95% בעדכוני מחירים ידניים וחוסכים $1,000–$3,000 בחודש בעלויות עבודה. קבל ייעוץ על הגדרת התאמת מחירים לקטלוג שלך.







