Розробка функціоналу передзамовлення на 1С-Bitrix
Товар ще не поступив на склад, але карточка вже є в каталозі. Стандартна поведінка Bitrix — кнопка «Немає в наявності» й сповіщення про поступлення. Це втрачає гарячого клієнта: він хоче купити зараз, а не отримати листа через тиждень. Передзамовлення розв'язує завдання: клієнт оформляє замовлення на відсутній товар, фіксує ціну й місце в черзі, магазин отримує прогнозований попит.
Чим передзамовлення відрізняється від «Сповіщення про поступлення»
Модуль catalog.subscribe у Bitrix — це підписка на наявність. Користувач залишає email, при зміні CATALOG_AVAILABLE = Y отримує лист. Ніякого замовлення, ніякої фіксації ціни, ніякої черги.
Передзамовлення — це повноцінне замовлення зі спеціальним статусом. Товар резервується за клієнтом, оплата може бути повною, частковою (задаток) або відкладеною. Коли товар поступає — замовлення переводиться в обробку.
Механіка на рівні каталогу
Управління передзамовленням починається з властивості товара. Створюємо властивість інфоблока PREORDER_AVAILABLE (тип: список, значення: Y/N). Вона визначає, доступний лі товар для передзамовлення, коли CATALOG_AVAILABLE = N.
У шаблоні catalog.element логіка кнопки змінюється:
- Якщо
CATALOG_AVAILABLE = Y— стандартна «Купити». - Якщо
CATALOG_AVAILABLE = NйPREORDER_AVAILABLE = Y— кнопка «Передзамовлення». - Якщо обидва
N— «Немає в наявності» + підписка.
Кнопка «Передзамовлення» додає товар в кошик з міткою. Міцку зберігаємо у властивості елемента кошика: \Bitrix\Sale\BasketItem::setField('PROPS', ...) — додаємо властивість IS_PREORDER = Y.
Обхід перевірки наявності
Головна технічна проблема: Bitrix не дозволяє додати в кошик товар з нульовим залишком. Метод \Bitrix\Catalog\Product\Basket::addProduct() перевіряє CATALOG_AVAILABLE й повертає помилку.
Два підходи:
1. Віртуальний склад передзамовлень. Створюємо окремий склад у Магазин → Склади з назвою «Передзамовлення». Коли товар помічений як доступний для передзамовлення — встановлюємо на цьому складі кількість, рівну ліміту передзамовлень (наприклад, 100). Товар стає CATALOG_AVAILABLE = Y, але реальний склад пуст. При обробці замовлення менеджер бачить, що товар зарезервований на складі «Передзамовлення», й розуміє ситуацію.
Перевага: не потрібно модифікувати ядро. Працює зі стандартним оформленням замовлення. Недолік: спотворює залишки в звітах, потребує дисципліни при обміні з 1С.
2. Обробник события. Підписуємось на OnBeforeBasketAdd або OnSaleBasketItemBeforeSaved й перехоплюємо перевірку наявності. Якщо товар помічений PREORDER_AVAILABLE = Y — пропускаємо валідацію залишків. Цей спосіб чистіший, але потребує тестування з кожним оновленням Bitrix, так як механізм перевірки наявності змінювався між версіями модуля sale.
Статуси замовлень
Для передзамовлень створюємо додаткові статуси у Магазин → Статуси замовлень:
| Код | Назва | Описання |
|---|---|---|
| PP | Передзамовлення прийнято | Замовлення створено, товар відсутній |
| PW | Очікування поставки | Товар замовлено у постачальника |
| PR | Товар поступив | Можна переводити в збірку |
Автоматизація переходу PP → PR реалізується через обробник OnStoreProductUpdate. При зміні залишку на основному складі перевіряємо, є лі замовлення зі статусом PP з цим товаром. Якщо залишку достатньо — змінюємо статус на PR й відправляємо сповіщення клієнту.
Оплата передзамовлення
Три стратегії:
Повна передоплата. Клієнт платить одразу. Проста схема, але ризикована для покупця — якщо поставка зійде нанівець, потрібен повернення.
Задаток. При оформленні передзамовлення створюємо оплату на фіксовану суму (наприклад, 10-20% від вартості). Реалізується через кастомне правило кошика або через створення двох Payment у замовленні: перший — задаток (активний), другий — решта (відкладений). Метод \Bitrix\Sale\Payment::setField('SUM', $depositAmount).
Оплата при поступленні. Замовлення створюється без оплати. Коли товар приходить — менеджер активує платіж, клієнт отримує посилання на оплату. Для онлайн-оплати використовуйте метод \Bitrix\Sale\PaySystem\Service::initiatePay(), який генерує платіжну форму.
Ліміти й черга
Без лімітів передзамовлення перетворюється на проблему: 500 клієнтів оформили передзамовлення, а поставка — 50 одиниць. Ліміт задається через властивість товара PREORDER_LIMIT й перевіряється при додаванні в кошик. Поточна кількість передзамовлень лічиться запитом до b_sale_basket з фільтром за властивістю IS_PREORDER = Y й привязкою до незавершених замовлень.
Черга формується за датою створення замовлення. При поступленні товара пріоритет надається ранніх замовленням. Реалізується сортуванням ORDER BY DATE_INSERT ASC при виборі передзамовлень для переводу в статус PR.
Строки
| Масштаб | Що входить | Строк |
|---|---|---|
| Базовий | Кнопка передзамовлення, віртуальний склад, статуси | 4-5 днів |
| Повний | Задаток, автосмена статусів, ліміти, сповіщення, інтеграція з 1С | 8-12 днів |







