Налаштування прогнозування попиту на товари 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С-Бітрікс

Склад замовляє товари за інтуїцією менеджера: якщо минулий місяць продали 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С для автоматичного формування заявок