Настройка автоматической корректировки цен по конкурентам 1С-Битрикс
Мы настраиваем автоматическую корректировку цен в 1С-Битрикс — систему, которая сама меняет цены товаров при изменении цен конкурентов. Без правил такая система быстро приводит к ценовым войнам: магазин снижает цену, конкурент отвечает, и через несколько часов оба торгуют в убыток. Чтобы этого избежать, мы проектируем гибкие правила с полом, потолком и приоритетами. Работаем под ключ — от модели данных до агента и админ-интерфейса. Сроки — 11–13 дней, в зависимости от объёма каталога. За 5 лет мы реализовали более 50 проектов по автоматизации ценообразования в 1С-Битрикс. Имеем сертификацию «1С-Битрикс: Разработчик» и опыт интеграции с CommerceML, ОФД и системами трекинга конкурентов.
Почему нужна защита от ценовых войн?
Автокорректировка без защиты — прямой путь к демпингу. Конкуренты могут выставлять акционные цены на 15–20 минут, и ваш магазин бездумно копирует их. Мы реализуем четыре механизма защиты: cooldown (пауза между изменениями), лимит дневного изменения (не более X% за сутки), верификация конкурента (не реагировать на акции короче 30 минут) и блокировка по минимальной марже. Например, для каталога электроники с 10 000 товаров эти механизмы снижают количество ошибочных срабатываний на 70%.
По данным официальной документации 1С-Битрикс, механизм агентов позволяет выполнять фоновые задачи без участия пользователя.
Как мы проектируем модель правил
Правила хранятся в таблице 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-ю позицию по дешевизне | Занять конкретное место в рейтинге (например, 3-е) |
Движок расчёта новой цены
Движок RepricingEngine получает применимое правило для товара, собирает цены конкурентов и вычисляет целевое значение. Затем применяет ограничения (пол и потолок) и округляет до маркетингово привлекательного формата (оканчивается на 0 или 9 копеек). Если новая цена отличается от текущей менее чем на 1 копейку, изменение не происходит — это предотвращает микроколебания.
Автоматический репрайсинг в 5 раз быстрее ручного изменения цен — система обрабатывает до 10 000 товаров за один запуск агента.
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 логирует изменение до обновления цены через CCatalogProduct::SetPrice. Если что-то пошло не так — статус в логе меняется на error, менеджер получает уведомление. Мы используем 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'],
'RUB'
);
if (!$priceResult) {
// Откат и уведомление об ошибке
RepricingLogTable::update($logId, ['STATUS' => 'error']);
}
}
}
Как настроить агента репрайсинга
- Создайте агент в административной панели: «Настройки» → «Производительность» → «Агенты».
- Укажите время запуска (рекомендуется раз в час).
- В функции агента вызовите метод
RepricingAgent::run(). - Настройте приоритет и количество товаров за один запуск.
Как работает агент репрайсинга?
Агент запускается раз в час. Он собирает товары, у которых за последний час обновились цены конкурентов, прогоняет через движок и применяет изменения (или ставит на одобрение, если раздел в режиме manual). Конфигурация гибкая — для каждого раздела каталога можно задать свой режим.
Что входит в настройку
| Этап | Содержание | Длительность |
|---|---|---|
| Модель правил и БД | Проектирование таблиц, индексов, миграций | 2 дня |
| Движок расчёта | Реализация всех четырёх стратегий с ограничениями | 3 дня |
| Агент и логирование | Фоновый агент, логи, уведомления об ошибках | 2 дня |
| Админ-интерфейс | Форма для управления правилами, таблица правил, фильтры | 2 дня |
| Тестирование | Граничные случаи, нагрузка, защита от дурацких сценариев | 2 дня |
| Итого | Полный цикл под ключ | 11–13 дней |
В результат входит: документация схемы БД, код движка и агента, админ-интерфейс, инструкция по эксплуатации, 1 месяц поддержки после запуска.
Почему доверяют нам
За 5 лет мы реализовали более 50 проектов по автоматизации ценообразования в 1С-Битрикс. Имеем сертификацию «1С-Битрикс: Разработчик» и опыт интеграции с CommerceML, ОФД и системами трекинга конкурентов. Гарантируем прозрачность кода и полную документацию.
Хотите исключить ручной мониторинг и получать актуальные цены автоматически? Свяжитесь с нами — оценим ваш проект за один рабочий день. Получите консультацию по настройке репрайсинга для вашего каталога.







