Настройка автоматической корректировки цен по конкурентам 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% изменения за сутки
- Competitor verification: не реагировать, если конкурент снизил цену менее чем 30 минут назад (защита от кратковременных акций)
- Minimum margin lock: если правило даёт цену ниже пола маржи — записать в лог «невозможно применить», уведомить менеджера
Сроки
| Этап | Срок |
|---|---|
| Модель правил + схема БД | 2 дня |
| Движок расчёта (все стратегии) | 3 дня |
| Агент применения + логирование | 2 дня |
| Административный интерфейс правил | 2 дня |
| Тестирование граничных случаев | 2 дня |
| Итого | 11–13 дней |







