Розробка модуля передзамовлення 1С-Бітрікс
Передзамовлення — це можливість оплатити товар до його появи у продажу: новинку, яка ще не надійшла на склад, або лімітоване видання із закритою датою старту продажів. На відміну від «сповістити про надходження», передзамовлення передбачає реальний платіж або резервування коштів. Стандартний b_sale_order не підтримує стан «товар недоступний, але прийнято передзамовлення» — немає статусу відкладеного виконання, немає дедлайну, немає масової активації.
Модель даних
Модуль vendor.preorder:
-
b_vendor_preorder_campaign— кампанії передзамовлення: id, iblock_element_id (товар), sku_id, name, available_from (дата початку продажів), preorder_from, preorder_to, limit_qty (ліміт передзамовлень), reserved_qty, payment_type (full/deposit), deposit_amount, deposit_percent, status (draft/active/closed/fulfilled) -
b_vendor_preorder_order— передзамовлення: id, campaign_id, user_id, order_id (посилання на b_sale_order), qty, paid_amount, status (pending/paid/confirmed/shipped/cancelled), created_at -
b_vendor_preorder_notify_queue— черга сповіщень при активації
Кампанія передзамовлення
Кампанія прив'язана до конкретного товару або SKU. Параметри:
- Тип оплати: повна передоплата або завдаток (фіксована сума або відсоток від ціни)
-
Ліміт: максимальна кількість передзамовлень —
limit_qty. При досягненні ліміту форма закривається -
Період:
preorder_from/preorder_to— коли приймаються передзамовлення -
Дата поставки:
available_from— коли товар реально надійде, відображається покупцю
Створення передзамовлення
class PreorderService
{
public function create(int $campaignId, int $userId, int $qty): PreorderResult
{
$campaign = CampaignTable::getById($campaignId)->fetch();
if ($campaign['STATUS'] !== 'active') {
return PreorderResult::error('Кампанія неактивна');
}
if ($campaign['LIMIT_QTY'] && ($campaign['RESERVED_QTY'] + $qty) > $campaign['LIMIT_QTY']) {
return PreorderResult::error('Ліміт передзамовлень вичерпано');
}
// Визначаємо суму для оплати
$productPrice = $this->getProductPrice($campaign['SKU_ID']);
$payAmount = $campaign['PAYMENT_TYPE'] === 'deposit'
? ($campaign['DEPOSIT_AMOUNT'] ?: $productPrice * $campaign['DEPOSIT_PERCENT'] / 100)
: $productPrice * $qty;
// Створюємо замовлення в sale з кастомним статусом
$order = \Bitrix\Sale\Order::create(SITE_ID, $userId);
$order->setField('STATUS_ID', 'PRE'); // кастомний статус «Передзамовлення»
// ...додаємо товар у кошик...
$order->save();
PreorderOrderTable::add([
'CAMPAIGN_ID' => $campaignId,
'USER_ID' => $userId,
'ORDER_ID' => $order->getId(),
'QTY' => $qty,
'PAID_AMOUNT' => $payAmount,
'STATUS' => 'pending',
]);
// Атомарно збільшуємо лічильник резерву
CampaignTable::incrementReserved($campaignId, $qty);
return PreorderResult::success($order->getId());
}
}
Активація передзамовлень при надходженні товару
Коли товар надходить на склад, менеджер переводить кампанію в статус fulfilled. Агент масово обробляє передзамовлення:
public static function activateCampaign(int $campaignId): void
{
$preorders = PreorderOrderTable::getList([
'filter' => ['CAMPAIGN_ID' => $campaignId, 'STATUS' => 'paid'],
'order' => ['CREATED_AT' => 'ASC'], // першими підтверджуємо раніше оформлені
])->fetchAll();
foreach ($preorders as $preorder) {
// Змінюємо статус основного замовлення на стандартний «В обробці»
$order = \Bitrix\Sale\Order::load($preorder['ORDER_ID']);
$order->setField('STATUS_ID', 'N');
$order->save();
PreorderOrderTable::update($preorder['ID'], ['STATUS' => 'confirmed']);
// Ставимо в чергу сповіщення покупцю
NotifyQueueTable::add(['PREORDER_ID' => $preorder['ID']]);
}
}
Відображення на картці товару
Компонент vendor:preorder.button:
- Якщо кампанія активна: показує форму передзамовлення з ціною, датою поставки, кількістю місць, що залишилися
- Якщо ліміт вичерпано: «Передзамовлення закрито» з кнопкою підписки на звичайне сповіщення
- Зворотній відлік до дати старту продажів (JavaScript)
- Прогрес-бар заповнення ліміту: «Зарезервовано 47 із 100»
Адміністративний інтерфейс
- Створення та управління кампаніями
- Список передзамовлень по кампанії з фільтром по статусу оплати
- Кнопка «Активувати кампанію» — запускає масове підтвердження
- Експорт списку передзамовлень у CSV для логіста
- Статистика: конверсія в оплату, середній чек передзамовлення
Терміни розробки
| Етап | Термін |
|---|---|
| ORM-таблиці, модель кампаній | 1 день |
| Сервіс створення передзамовлень, атомарний резерв | 2 дні |
| Інтеграція з b_sale_order, кастомний статус | 1 день |
| Активація кампанії, агент масового підтвердження | 2 дні |
| Віджет картки товару | 1 день |
| Адміністративний інтерфейс | 2 дні |
| Тестування | 1 день |
Разом: 10 робочих днів. Для завдатку з доплатою при активації — додаткова інтеграція з платіжною системою: +2 дні.







