Налаштування автоматичного коригування цін за конкурентами у 1С-Бітрікс
Автоматичне коригування цін — це коли система самостійно змінює ціну товару при зміні цін конкурентів, без участі менеджера. Звучить просто, але реалізація без правил обмежень призводить до цінових воєн: ваш магазин знижує ціну, конкурент відповідає, ви знижуєте ще. Через добу обидва продають у збиток. Тому автокоригування — це не просто «стеж за конкурентом і копіюй», а система правил зі стелею, підлогою та логікою пріоритетів.
Модель правил репрайсингу
Правила зберігаються в bl_repricing_rules:
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— бути на X грн/% нижче мінімальної ціни конкурентів -
match_min— збігтися з мінімальною ціною -
avg— тримати середнє арифметичне -
position— тримати N-у позицію за дешевизною
Рушій розрахунку нової ціни
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'];
}
}
Застосування ціни у Бітрікс
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'],
'RUB'
);
if (!$priceResult) {
// Відкат і сповіщення про помилку
RepricingLogTable::update($logId, ['STATUS' => 'error']);
}
}
}
Агент автоматичного репрайсингу
Запускається раз на годину. Отримує список товарів, у яких оновилися ціни конкурентів за останню годину, пропускає через RepricingEngine, застосовує зміни або ставить на схвалення.
Конфігурація через опції модуля: для кожного розділу каталогу — режим (auto | manual | disabled). Автоматично змінюються лише товари у розділах із режимом auto.
Захист від цінових воєн
- Cooldown: після зміни ціни наступна зміна — не раніше ніж через N годин
- Max change per day: не більше X% зміни за добу
- Перевірка конкурента: не реагувати, якщо конкурент знизив ціну менш ніж 30 хвилин тому (захист від короткострокових акцій)
- Блокування мінімальної маржі: якщо правило дає ціну нижче порогу маржі — записати в лог «неможливо застосувати», сповістити менеджера
Терміни
| Етап | Термін |
|---|---|
| Модель правил + схема БД | 2 дні |
| Рушій розрахунку (всі стратегії) | 3 дні |
| Агент застосування + логування | 2 дні |
| Адміністративний інтерфейс правил | 2 дні |
| Тестування граничних випадків | 2 дні |
| Разом | 11–13 днів |







