Настройка автоматической корректировки цен по конкурентам 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка автоматической корректировки цен по конкурентам 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка автоматической корректировки цен по конкурентам 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.

Защита от ценовых войн

  1. Cooldown: после изменения цены следующее изменение не раньше чем через N часов
  2. Max change per day: не более X% изменения за сутки
  3. Competitor verification: не реагировать, если конкурент снизил цену менее чем 30 минут назад (защита от кратковременных акций)
  4. Minimum margin lock: если правило даёт цену ниже пола маржи — записать в лог «невозможно применить», уведомить менеджера

Сроки

Этап Срок
Модель правил + схема БД 2 дня
Движок расчёта (все стратегии) 3 дня
Агент применения + логирование 2 дня
Административный интерфейс правил 2 дня
Тестирование граничных случаев 2 дня
Итого 11–13 дней