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







