Налаштування автоматичного коригування цін за конкурентами 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування автоматичного коригування цін за конкурентами 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування автоматичного коригування цін за конкурентами у 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. Перевірка конкурента: не реагувати, якщо конкурент знизив ціну менш ніж 30 хвилин тому (захист від короткострокових акцій)
  4. Блокування мінімальної маржі: якщо правило дає ціну нижче порогу маржі — записати в лог «неможливо застосувати», сповістити менеджера

Терміни

Етап Термін
Модель правил + схема БД 2 дні
Рушій розрахунку (всі стратегії) 3 дні
Агент застосування + логування 2 дні
Адміністративний інтерфейс правил 2 дні
Тестування граничних випадків 2 дні
Разом 11–13 днів