Налаштування автоматичної корекції цін за конкурентами 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, ОФД і системами трекінгу конкурентів. Гарантуємо прозорість коду та повну документацію.
Бажаєте виключити ручний моніторинг і отримувати актуальні ціни автоматично? Зв'яжіться з нами — оцінимо ваш проєкт за один робочий день. Отримайте консультацію з налаштування репрайсингу для вашого каталогу.







