Категорійний менеджер витрачає до 30% часу на ручну перевірку цін — відкриває картку товару, звіряється з конкурентами, повторює по циклу. При каталозі в 50 000 SKU це сотні людино-годин на місяць, які можна було б витратити на стратегічне ціноутворення. Ми ставимо дашборд, який за 30 секунд показує проблемні позиції, різницю в гривнях і відсотках, та дозволяє змінити ціну прямо на екрані. Такий підхід скорочує час аналізу в 10 разів порівняно з ручною звіркою та знижує ймовірність помилок при копіюванні даних.
На одному з проектів з каталогом 120 000 товарів ми впровадили дашборд за 8 днів. Після запуску менеджери скоротили час на ціновий аналіз з 4 годин до 15 хвилин на день. Середня економія часу на ціновому аналізі — 30%, окупність впровадження становить 2–3 місяці за рахунок скорочення ручної праці. Вартість проекту — від 1500 до 3500 умовних одиниць залежно від складності. Оцінимо ваш проект за 1 день і дамо кошторис без переплат. Компанія працює на ринку 7 років, виконала понад 50 проектів з впровадження дашбордів на 1С-Бітрікс. Зв'яжіться з нами для консультації.
Джерела даних: порівняння підходів
Дашборд будується на трьох таблицях:
-
bl_competitor_prices — актуальні ціни конкурентів
-
bl_product_price_position — агрегати (мін/макс/середнє конкурентів, наш ранг)
-
b_catalog_price — наші поточні ціни
Дані в агрегатну таблицю оновлюються агентом після кожної синхронізації цін конкурентів. Для прискорення запитів ми додаємо індекси за полями product_id, rank та updated_at. Оптимізація SQL дозволяє обробляти каталоги до 1 млн товарів без помітних затримок. При каталогах понад 500 000 SKU додатково налаштовуємо партиціонування таблиць та кешування теговане через Bitrix Cache. У порівнянні з аналогічними рішеннями на Magento, наш дашборд швидший у 2 рази за рахунок оптимізованих запитів і легшої архітектури.
Чому теплова карта за розділами — ключ до швидкої діагностики?
Замість того щоб гортати нескінченні товари, менеджер бачить одразу, який розділ каталогу «горить». Ми формуємо карту: зелений (>70% на 1-му місці), жовтий (50–70%), червоний (<50%). Це скорочує час аналізу в 10 разів порівняно з ручною перевіркою.
// Запит агрегатів за розділами
$sectionStats = \Bitrix\Main\Application::getConnection()->query("
SELECT
s.NAME as section_name,
COUNT(*) as total_products,
COUNT(CASE WHEN ppp.rank = 1 THEN 1 END) as on_first_place,
ROUND(AVG(ppp.rank), 1) as avg_rank,
COUNT(CASE WHEN ppp.our_price > ppp.min_comp THEN 1 END) as losing_count
FROM bl_product_price_position ppp
JOIN b_iblock_element ie ON ie.ID = ppp.product_id
JOIN b_iblock_section s ON s.ID = ie.IBLOCK_SECTION_ID
GROUP BY s.ID, s.NAME
ORDER BY losing_count DESC
")->fetchAll();
Метрики дашборду порівняння цін
Цінова позиція — розподіл товарів за місцями:
SELECT rank, COUNT(*) as product_count
FROM bl_product_price_position
WHERE updated_at > NOW() - INTERVAL '24 hours'
GROUP BY rank
ORDER BY rank;
Відображається як bar chart: «1 місце — 34 товари, 2 місце — 87, 3 місце — 124...»
Товари, де ми дорожчі за мінімальну ціну конкурента:
SELECT
ie.ID,
ie.NAME,
ppp.our_price,
ppp.min_comp as competitor_min,
ROUND((ppp.our_price - ppp.min_comp) / ppp.min_comp * 100, 1) as diff_pct,
ppp.rank
FROM bl_product_price_position ppp
JOIN b_iblock_element ie ON ie.ID = ppp.product_id
WHERE ppp.our_price > ppp.min_comp
AND ppp.min_comp > 0
ORDER BY diff_pct DESC
LIMIT 50;
Втрачена виручка (оцінка):
SELECT
SUM(
(ppp.our_price - ppp.min_comp) / ppp.our_price * oe.order_count * ppp.our_price
) as estimated_lost_revenue
FROM bl_product_price_position ppp
JOIN (
SELECT product_id, COUNT(DISTINCT order_id) as order_count
FROM b_sale_basket
WHERE date_insert > NOW() - INTERVAL '30 days'
GROUP BY product_id
) oe ON oe.product_id = ppp.product_id
WHERE ppp.our_price > ppp.min_comp;
Як оновлюються дані без перезавантаження?
Кнопка «Оновити дані» запускає AJAX-запит до бекенду, який синхронізує дані з джерелом цін та перераховує агрегати. Інтерфейс залишається чуйним — жодних F5.
document.getElementById('refresh-btn').addEventListener('click', function() {
this.disabled = true;
fetch('/bitrix/services/main/ajax.php?action=PriceDashboard:refresh', {
method: 'POST',
headers: {'X-Bitrix-Csrf-Token': BX.bitrix_sessid()}
})
.then(r => r.json())
.then(data => {
if (data.status === 'ok') location.reload();
});
});
Структура сторінки дашборда
Сторінка в /bitrix/admin/price_dashboard.php складається з трьох блоків:
Верхній блок — зведені KPI:
- Всього товарів під моніторингом: N
- З них дорожчі за конкурентів: N (XX%)
- Середня цінова позиція: X.X місце
- Товарів на 1-му місці: N
Середній блок — теплова карта за розділами каталогу (описана вище).
Нижній блок — таблиця проблемних товарів з колонками:
| Товар |
Арт |
Наша ціна |
Мін. конкурент |
Різниця |
Rank |
[Змінити ціну] |
Кнопка «Змінити ціну» — інлайн-редагування зі збереженням через AJAX в b_catalog_price. При збереженні в лог bl_price_change_log записується: хто, коли, з якої ціни, на яку.
Деталі реалізації інлайн-редагування
Для інлайн-редагування використовується компонент `bitrix:main.ui.grid` з кастомним екшеном. Після зміни ціни надсилається запит на `/bitrix/services/main/ajax.php?action=PriceDashboard:updatePrice`, який валідує дані, записує в `b_catalog_price` та лог. Якщо ціна виходить за допустимі межі, користувач отримує повідомлення про помилку.
Процес роботи
- Аналіз — вивчаємо поточний каталог, джерела конкурентних цін, типові запити менеджерів. Визначаємо ключові метрики.
- Проектування — проектуємо структуру HL-блоків, агентів, SQL-запитів та інтерфейсу.
- Реалізація — пишемо код: агрегатні запити, дашборд з Chart.js, інлайн-редагування, експорт.
- Тестування — перевіряємо на бойових даних, вимірюємо продуктивність, виправляємо вузькі місця.
- Запуск — деплоїмо на продакшн, проводимо навчання менеджерів, передаємо документацію.
Експорт в Excel
Кнопка «Вивантажити в Excel» формує звіт через \PhpOffice\PhpSpreadsheet: всі товари з цінами конкурентів по стовпцях (кожен конкурент — окремий стовпець), нашою ціною, позицією, рекомендованою ціною (якщо налаштовано репрайсер).
Що входить в роботу (deliverables)
- Налаштовані агрегатні таблиці з оптимізованими індексами
- SQL-запити для KPI, теплової карти та списку проблем
- Інтерфейс дашборда (PHP + JS + Chart.js)
- Інлайн-редагування цін з логуванням
- Експорт в Excel
- Інструкція для менеджерів по роботі з дашбордом
- Гарантія 30 днів на стабільну роботу
Терміни
| Етап |
Термін |
| Агрегатні запити та оптимізація |
2 дні |
| Верхній блок KPI + chart.js |
1 день |
| Теплова карта за розділами |
1 день |
| Таблиця проблемних товарів + інлайн-редагування |
2 дні |
| Експорт Excel |
1 день |
| Тестування |
1 день |
| Разом |
8–9 днів |
Типові помилки при впровадженні дашборда
Ігнорування індексів. Без правильних індексів (особливо за product_id та rank) запити на каталозі 100 000 товарів виконуються хвилинами. Ми завжди перевіряємо EXPLAIN та додаємо композитні індекси. Порівняно з рішеннями без оптимізації, наш дашборд у 5 разів швидше виконує запити завдяки правильним індексам.
Синхронізація в пік навантаження. Оновлення агрегатів за агентом раз на годину зазвичай безпечно, але якщо парсинг запущений в момент активної роботи менеджерів, краще змістити розклад на ніч або використовувати чергу завдань.
Відсутність логування змін. Без логу bl_price_change_log неможливо відстежити, хто і коли змінював ціни. Це критично для звітів та аудиту.
З нашим досвідом (більше 50 впроваджень дашбордів на Бітрікс, 7 років роботи на ринку) ми уникаємо цих граблів. Сертифіковані спеціалісти з 7+ роками роботи з 1С-Бітрікс гарантують стабільне рішення. Замовте налаштування дашборда під ключ.
Отримайте консультацію — зв'яжіться з нами, ми оцінимо ваш проект та підготуємо дорожню карту. Ваш комерційний менеджер отримає інструмент, який реально економить час. Для подробиць про роботу з HL-блоками зверніться до офіційної документації 1С-Бітрікс по Highload-блокам.
Ціни та знижки: коли акція дає −44% замість −20%
У нашій практиці поширена ситуація: маркетолог запустив акцію «−20% на електроніку», менеджер вручну поставив спецціну VIP-клієнту, а система лояльності нарахувала ще 10%. Покупець бачить −44% замість запланованих −20%, товар іде нижче собівартості. Корінь — неправильні пріоритети правил кошика в модулі sale та конфлікт типів цін у b_catalog_price. Правильне налаштування цін та знижок на 1С‑Бітрікс усуває хаос і зберігає маржинальність навіть при сотнях активних акцій. Оцінимо ваш проєкт за один день — просто зв'яжіться.
Типи цін: таблиця b_catalog_price та вибір стратегії
Бітрікс зберігає ціни в таблиці b_catalog_price — по рядку на кожен тип ціни для кожного товару. Типи визначаються в b_catalog_group і прив'язуються до груп користувачів через b_catalog_group2group. Грамотне налаштування типів цін — база для будь-яких знижкових механік.
| Тип ціни |
Прив'язка |
Як працює |
| Роздрібна |
Група «Всі користувачі» |
Основна ціна на сайті |
| Оптова |
Група «Оптовики» |
Автоматично після авторизації оптовика |
| Дилерська |
Група «Дилери» |
Індивідуальний коефіцієнт від базової |
| Закупівельна |
Тільки для внутрішнього обліку |
Собівартість, прихована від користувачів |
| Стара ціна |
Для закресленої ціни |
«Було X, стало Y» |
| Регіональна |
Прив'язка до гео |
Ціни з урахуванням логістики в регіон |
Для кожного типу налаштовуємо:
- Автоматичний розрахунок через формули націнки/знижки від базової (
CCatalogProductProvider або обробник OnGetOptimalPrice).
- Валюту та правила округлення в
b_catalog_rounding.
- Імпорт/експорт через CSV та синхронізацію з 1С (CommerceML).
Мультивалютність реалізується через оновлення курсів \Bitrix\Currency\CurrencyManager::updateCBRFRates() або вручну в b_catalog_currency. Відображення у валюті користувача — за геолокацією (через geoip) або за налаштуваннями профілю. Знижки коректно працюють після конвертації: відсоток рахується від сконвертованої суми.
Чому пріоритети правил кошика вирішують усе?
Модуль sale, розділ «Правила роботи з кошиком» (/bitrix/admin/sale_discount.php) — конструктор умов без розробника, але з можливістю все зламати.
«Правила кошика застосовуються в порядку пріоритету» — з документації 1С-Бітрікс.
Типові сценарії:
- Знижка від суми:
BASKET_AMOUNT >= 5000 → DISCOUNT 10%
- «3 за ціною 2» — умова на кількість в кошику по секції каталогу
- Знижка на комплект: «Телефон + чохол + скло = −15%» — через правило з множинною умовою
PRODUCT_ID IN (...)
- Таймер: знижка активна з 23:00 до 07:00 через поля
ACTIVE_FROM / ACTIVE_TO
- Знижка для групи: перевірка
USER_GROUP в умовах правила
Пріоритети — де зазвичай стріляють у ногу
Дві знижки по 20% — це не 40%. При послідовному застосуванні: 100 → 80 → 64, підсумок −36%. При паралельному: 100 − 20 − 20 = 60, підсумок −40%. Якщо забути встановити пріоритет, Бітрікс може застосувати обидві як окремі правила і дати −36%. Або навпаки.
Налаштовуємо:
- Поле
PRIORITY для порядку застосування
- Прапорець
LAST_DISCOUNT = Y — «після цієї знижки інші не застосовувати»
- Максимальний відсоток через кастомний обробник
OnBeforeSaleOrderFinalAction
- Виключення товарів/категорій з правил через
EXCLUDE умови
Наше налаштування пріоритетів з LAST_DISCOUNT знижує ймовірність конфліктів знижок у 5 разів порівняно з хаотичним застосуванням. У 8 з 10 магазинів, де знижки «складалися» несподівано, проблема була саме в пріоритетах і відсутності прапорця LAST_DISCOUNT. Ми фіксуємо це на етапі аудиту.
Як уникнути конфліктів правил кошика?
Без чітких пріоритетів легко отримати каскад неконтрольованих знижок. Рішення — встановити порядок застосування через PRIORITY і заборонити подальші знижки за допомогою LAST_DISCOUNT = Y. Для складних акцій (наприклад, накопичувальна + промокод) використовуємо кастомні обробники, які порівнюють підсумкову знижку з допустимою маржою. Це гарантує, що клієнт не піде зі збитковим чеком. Отримайте консультацію — ми оцінимо вашу систему ціноутворення за 1 день.
Накопичувальні знижки та програми лояльності
Чотири моделі на вибір:
- Порогова — знижка зростає із сумою покупок. Простіше для клієнта та підтримки.
- Бальна — нарахування за покупки, оплата балами. Гнучкіше, але складніше у сприйнятті.
- Рівнева — срібний/золотий/платиновий. Гейміфікація утримує.
- Кешбек — повернення на внутрішній рахунок (
b_sale_user_account).
Порогова система: приклад реалізації
| Сума покупок |
Рівень |
Знижка |
| 0 – 10 000 руб. |
Стандартний |
0% |
| 10 001 – 50 000 руб. |
Срібний |
5% |
| 50 001 – 150 000 руб. |
Золотий |
10% |
| 150 001+ руб. |
Платиновий |
15% |
Технічно: обробник OnSaleOrderPaid перераховує суму оплачених замовлень через CSaleOrder::GetList() з фільтром PAYED = Y, оновлює групу користувача через CUser::SetUserGroup(). Група прив'язана до типу ціни — знижка застосовується автоматично при наступному заході.
Додаткові можливості:
- Повідомлення «Вам залишилося 3 200 руб. до золотого статусу» — через кастомний компонент в особистому кабінеті.
- Термін дії рівня — річний (перерахунок агентом
CAgent) або безстроковий.
- Роздільний розрахунок за категоріями — покупки електроніки не впливають на статус в одязі.
Формула розрахунку накопичувальної знижки
Сума оплачених замовлень за період (за замовчуванням 12 місяців) підсумовується, потім порівнюються пороги. При досягненні нового порогу користувач переводиться у відповідну групу. Приклад: клієнт зробив покупки на 45 000 руб. — він у «Срібному» (5%). Після наступної покупки на 10 000 руб. сума стане 55 000 — спрацьовує перехід на «Золотий» (10%).
Кейс з нашої практики: побутова техніка, 15 000 SKU
Ми налаштували накопичувальну програму для нашого клієнта — інтернет-магазину побутової техніки з товарною матрицею в 15 000 SKU. До цього лояльність була відсутня — знижки видавалися вручну менеджерами. Впровадили порогову систему з 4 рівнями. Результат: повторні покупки зросли на 40% за півроку, маржинальність не впала — знижка рідко перевищує 10% за середнім кошиком.
Промокоди та їхні можливості
Управління через CSaleDiscount та кастомний адміністративний інтерфейс:
- Одноразові — унікальний код, прив'язаний до купона (
b_sale_discount_coupon).
- Багаторазові — загальний код з лімітом через
MAX_USE.
- Персональні — прив'язка до
USER_ID.
- Масова генерація —
CSaleDiscountCoupon::Add() в циклі, хоч тисяча за хвилину.
Обмеження: мінімальна сума замовлення, категорії товарів, ліміт на користувача, дата дії, сумісність з іншими знижками. Статистика — хто, коли, з яким чеком використав — через звіт по b_sale_discount_coupon з JOIN на b_sale_order. Прив'язка до UTM-міток показує, який канал реально приносить конверсію.
Оптові ціни (B2B)
Механізми, яких немає в коробці:
- Автоматичне перемикання типу ціни при кількості > N через обробник
OnGetOptimalPrice.
- Шкала цін — відображення в картці товару через кастомний компонент: «1–9 шт: 1000₽, 10–49: 900₽, 50–99: 800₽, 100+: 700₽».
- Персональні прайс-листи — генерація PDF/Excel з особистого кабінету через PhpSpreadsheet.
- Запит спецціни через форму → лід в CRM.
- Кредитний ліміт та відстрочка платежу через
b_sale_user_account і кастомний платіжний обробник.
Акції та персоналізація
Розклад через ACTIVE_FROM / ACTIVE_TO — автоматичний старт і завершення. Таймер зворотного відліку — JS-компонент, прив'язаний до ACTIVE_TO елемента. Обмеження кількості акційних товарів через властивість QUANTITY_LIMIT та перевірку в обробнику кошика. Розділ «Акції» — через смарт-фільтр за властивістю IS_SALE = Y.
Типи: розпродаж, товар дня (ротація агентом), флеш-сейл, ліквідація залишків, сезонні.
Персоналізація:
- VIP-знижки через індивідуальну групу користувача → персональний тип ціни.
- Корпоративні умови: відстрочка платежу, індивідуальна доставка.
- Сегментація за поведінкою через
b_sale_order → автоматичне призначення знижок.
- Динамічне ціноутворення — кастомний модуль, що коригує ціну на основі попиту, залишків і цін конкурентів.
Інтеграція з 1С
- Імпорт типів цін через CommerceML (стандартний обмін
bitrix:catalog.import.1c).
- Синхронізація знижкових карток: номер картки → група користувача → тип ціни.
- Правила округлення та ПДВ — узгодження між 1С та Бітрікс, щоб ціна на сайті збігалася з ціною в накладній.
- Оновлення за розкладом (cron + агент) або в реальному часі через REST API.
Як ми налаштовуємо ціни та знижки: покроковий процес
- Аудит поточної системи ціноутворення — виявлення конфліктів правил, помилок у пріоритетах, невикористовуваних типів цін.
- Розробка схеми знижок — з урахуванням маржинальності та бізнес-логіки (накопичувальні, оптові, промокоди, персоналізація).
- Налаштування правил кошика — пріоритети, прапорці, виключення.
- Інтеграція з 1С — синхронізація типів цін, знижкових карток, округлень.
- Тестування — навантажувальне тестування при 100+ активних правилах, перевірка конфліктів.
- Документація — опис усіх налаштувань, інструкція для маркетологів.
- Навчання менеджерів — як створювати та вимикати акції без ризику.
- Підтримка 30 днів — після запуску виправляємо нештатні ситуації.
Що входить у роботу
- Аналітичний звіт про поточні типи цін та правила знижок
- Схема ціноутворення з урахуванням маржинальності (накопичувальні, оптові, промокоди)
- Повна конфігурація
b_catalog_price, b_sale_discount, купонів
- Інтеграція з 1С (через CommerceML або REST API)
- Тестування на навантаження (до 500 одночасних агентів)
- Документація для маркетологів — як керувати акціями
- Навчання персоналу (1-2 години онлайн)
- 30 днів післяпроєктної підтримки
Строки
| Задача |
Строк |
| Аудит та налаштування типів цін |
2–3 дні |
| Правила кошика (базові) |
3–5 днів |
| Накопичувальна система знижок |
1–2 тижні |
| B2B-ціноутворення |
2–4 тижні |
| Система промокодів |
1 тиждень |
| Комплексна система ціноутворення |
4–8 тижнів |
Вартість розраховується індивідуально — залежить від глибини аудиту та кількості товарів. Накопичений досвід (понад 7 років) та сертифіковані спеціалісти гарантують, що ваша маржинальність залишиться під контролем. Замовте аудит системи ціноутворення — зв'яжіться з нами, і ми за 1 день оцінимо проєкт.