Настройка прогнозирования спроса на товары 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка прогнозирования спроса на товары 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка прогнозирования спроса на товары 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С для автоматического формирования заявок