Налаштування дашборду порівняння цін з конкурентами у 1С-Бітрікс
Категорійний менеджер не повинен щоразу відкривати картку товару, щоб зрозуміти, де є цінова проблема. Дашборд — це зведений екран, який за 30 секунд показує: які товари програють за ціною, наскільки, скільки таких товарів, і дозволяє прийняти рішення прямо там. Мета дашборду — скоротити час від виявлення проблеми до дії.
Джерела даних
Дашборд будується на трьох таблицях:
-
bl_competitor_prices— актуальні ціни конкурентів -
bl_product_price_position— агрегати (мін/макс/середнє конкурентів, наш ранг) -
b_catalog_price— наші поточні ціни
Дані в агрегатну таблицю оновлюються агентом після кожної синхронізації цін конкурентів.
Ключові метрики дашборду
Цінова позиція — розподіл товарів за місцями:
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;
Структура сторінки дашборду
Сторінка /bitrix/admin/price_dashboard.php складається з блоків:
Верхній блок — зведені KPI:
- Всього товарів під моніторингом: N
- З них дорожчих за конкурентів: N (XX%)
- Середня цінова позиція: X.X місце
- Товарів на 1-му місці: N
Середній блок — теплова карта за розділами каталогу:
// Запит агрегатів за розділами
$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();
Кожен розділ — рядок із колірною індикацією: зелений (>70% товарів на 1 місці), жовтий (50–70%), червоний (<50%).
Нижній блок — таблиця проблемних товарів із кнопками дій:
| Товар | Арт | Наша ціна | Мін. конкурент | Різниця | Rank | [Змінити ціну] |
|---|
Кнопка «Змінити ціну» — inline-редагування зі збереженням через AJAX у b_catalog_price. При збереженні в лог bl_price_change_log записується: хто, коли, з якої ціни, на яку.
AJAX-оновлення даних
Дашборд оновлюється без перезавантаження сторінки — кнопка «Оновити дані» ініціює синхронізацію з джерелом цін:
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();
});
});
Експорт у Excel
Кнопка «Вивантажити в Excel» формує звіт через \PhpOffice\PhpSpreadsheet: усі товари з цінами конкурентів по стовпцях (кожен конкурент — окремий стовпець), нашою ціною, позицією, рекомендованою ціною (якщо налаштований репрайсер).
Терміни
| Етап | Термін |
|---|---|
| Агрегатні запити та оптимізація | 2 дні |
| Верхній блок KPI + chart.js | 1 день |
| Теплова карта за розділами | 1 день |
| Таблиця проблемних товарів + inline-редагування | 2 дні |
| Експорт Excel | 1 день |
| Тестування | 1 день |
| Разом | 8–9 днів |







