Налаштування прогнозування попиту на товари в 1С-Бітрікс
Склад замовляє товари за інтуїцією менеджера: якщо минулий місяць продали 100 одиниць — замовили 120. В результаті сезонні товари закінчуються на піку, а несезонні замораживають оборотні кошти. Прогнозування попиту — це не ML-магія, це статистика за історичними даними продаж, які уже є у b_sale_order_basket.
Джерело даних: історія продаж у Бітрікс
Усі продажі зберігаються у b_sale_order_basket (позиції в замовленнях) та b_sale_order (заголовки замовлень). Для прогнозування потрібні завершені замовлення — ті, де b_sale_order.STATUS_ID відповідає фінальним статусам (зазвичай F — виконано).
Базовий запит для отримання історії продаж за товаром:
SELECT
DATE_TRUNC('month', o.DATE_INSERT) AS sale_month,
ob.PRODUCT_ID,
SUM(ob.QUANTITY) AS qty_sold
FROM b_sale_order_basket ob
JOIN b_sale_order o ON o.ID = ob.ORDER_ID
WHERE o.STATUS_ID IN ('F', 'D') -- завершені та доставлені
AND o.CANCELED = 'N'
AND ob.PRODUCT_ID = :product_id
AND o.DATE_INSERT >= NOW() - INTERVAL '24 months'
GROUP BY 1, 2
ORDER BY 1;
24 місяці — мінімальний горизонт для виявлення річної сезонності.
Прості методи прогнозування
Для більшості інтернет-магазинів достатньо трьох методів без ML:
Просте скользящое середнє (SMA). Прогноз на наступний місяць = середнє за останні N місяців. N = 3–6 для стабільного попиту, N = 2 для волатильного.
Зважене скользящое середнє (WMA). Останній місяць має вагу 3, попередній — 2, третій — 1. Швидше реагує на тренди.
Метод Хольта-Вінтерса (тройне експоненціальне згладжування). Враховує тренд та сезонність. Складніше в реалізації, але значно точніше для товарів з вираженою сезонністю.
function forecastSimpleMA(array $monthlySales, int $periods = 3): float
{
$recent = array_slice($monthlySales, -$periods);
return array_sum($recent) / count($recent);
}
function forecastWMA(array $monthlySales, int $periods = 3): float
{
$recent = array_slice($monthlySales, -$periods);
$weights = range(1, $periods);
$total = array_sum($weights);
$sum = 0;
foreach ($recent as $i => $qty) {
$sum += $qty * $weights[$i];
}
return $sum / $total;
}
Коефіцієнт сезонності
Для товарів із сезонністю (зимовий одяг, дачний інвентар, шкільні приналежності) скользящое середнє буде систематично помилятися. Коефіцієнт сезонності розраховується на основі 2+ років даних:
// Середньомісячний обсяг продаж за 2 років
$annualAvg = array_sum($monthlySales) / count($monthlySales);
// Коефіцієнт сезонності для кожного місяця
$seasonalIndex = [];
for ($month = 1; $month <= 12; $month++) {
$monthData = array_filter(
$monthlySales,
fn($m) => (int)date('m', strtotime($m['date'])) === $month
);
$monthAvg = array_sum(array_column($monthData, 'qty')) / max(count($monthData), 1);
$seasonalIndex[$month] = $annualAvg > 0 ? $monthAvg / $annualAvg : 1.0;
}
// Прогноз із врахуванням сезонності
$baseForecast = forecastSimpleMA($rawSales, 3);
$targetMonth = (int)date('m', strtotime('+1 month'));
$adjustedForecast = $baseForecast * $seasonalIndex[$targetMonth];
Збереження прогнозів та точка рекомендованого замовлення
Результати прогнозів зберігаються у власну таблицю:
CREATE TABLE bl_demand_forecast (
id SERIAL PRIMARY KEY,
product_id INT NOT NULL,
forecast_month DATE NOT NULL,
forecast_qty NUMERIC(10,2),
method VARCHAR(50),
created_at TIMESTAMP DEFAULT NOW(),
UNIQUE (product_id, forecast_month)
);
На основі прогнозу розраховується рекомендований обсяг закупки: forecast_qty * safety_factor - current_stock. safety_factor = 1.2–1.5 (буфер на неточність прогнозу та час поставки).
Агент Бітрікс перераховує прогнози раз в тиждень та записує у bl_demand_forecast. Адміністративний інтерфейс показує товари, у яких поточний остаток нижче рекомендованого рівня замовлення.
Що налаштовуємо
- Виборку історії продаж з
b_sale_order_basketіз фільтром за фінальними статусами - Алгоритм SMA/WMA для товарів зі стабільним попитом
- Розрахунок коефіцієнтів сезонності за 24-місячною історією
- Таблицю
bl_demand_forecastта агент щотижневого перерахунку - Адміністративний звіт: товари нижче порога рекомендованого замовлення
- Експорт рекомендацій у Excel або вивантаження в 1С для автоматичного формування заявок







