Розроблення модуля оптового замовлення в 1С-Бітрікс
Оптовий покупець не працює через кошик. Він завантажує список артикулів зі своєї ERP, вказує кількість та чекає підтвердження. Якщо портал пропонує йому шукати кожну позицію вручну через фільтр та додавати по одній — він піде до конкурента, у якого є Excel-імпорт.
Швидкий ввід замовлення: три сценарії
Стандартний компонент bitrix:sale.basket не підходить для оптових замовлень. Розробляється окремий модуль з трьома режимами введення позицій:
Табличний ввід з автозаповненням. Користувач вводить артикул у рядку, поле автозаповнюється через AJAX-запит до bitrix:catalog.search або до кастомного обробника, який шукає в b_iblock_element з індексом за CODE та XML_ID. Після вибору позиції — поля ціни, остатку та одиниці вимірювання заповнюються автоматично. Рядків у таблиці — скільки потрібно, додаються динамічно через JavaScript.
Імпорт з Excel/CSV. Файл завантажується через стандартний компонент файлового поля, парситься на сервері через PhpSpreadsheet (або fgetcsv для CSV). Очікуваний формат: артикул, кількість, опціонально — коментар. Результат парсингу: список позицій із знайденими/ненайденими артикулами. Ненайдені — показуються окремо з можливістю ручного сопоставлення. Знайдені — додаються в чернетку замовлення.
Повтор замовлення. Кнопка «Повторити замовлення» в історії — бере CSaleOrder::GetByID(), ітерує по CSaleBasket::GetList() з ORDER_ID, перевіряє поточне наявність кожної позиції. Позиції з нульовим остатком помічаються попередженням, але не блокують створення чернетки.
Архітектура модуля
Модуль розміщується в local/modules/project.wholesale/. Структура:
install/
index.php — установник, реєстрація обробників подій
lib/
OrderDraft.php — сутність чернетки замовлення (D7 DataManager)
Importer.php — парсинг Excel/CSV
PriceProvider.php — пріоритетне ціноутворення
StockChecker.php — перевірка остатків
options.php — налаштування модуля в панелі управління
Чернетка замовлення — проміжне сховище до фіксації. Таблиця b_project_order_draft: ID, USER_ID, COMPANY_ID, ITEMS (JSON), STATUS (editing, pending_approval, confirmed), CREATED_AT, UPDATED_AT. JSON-поле ITEMS містить позиції з артикулом, кількістю, ціною на момент створення чернетки та підтвердженою ціною. Це важливо: ціна фіксується в чернетці, щоб не було розходжень при узгодженні.
Конвертація чернетки в замовлення. При підтвердженні чернетки створюється стандартне замовлення через Bitrix\Sale\Order::create(). Всі позиції додаються через Bitrix\Sale\Basket::create() з явним указанням цін із чернетки. Стандартний перерахунок цін відключається для цих позицій — інакше персональні ціни можуть бути перезаписані.
Контроль остатків та резервування
Оптове замовлення без перевірки остатків — джерело конфліктів з відділом постачання. Реалізуємо два рівні:
м'яка перевірка при додаванні позиції в чернетку: запит до CCatalogStoreProduct::GetList() з фільтром за PRODUCT_ID та STORE_ID. Якщо запрошена кількість > доступна — показуємо попередження, але не блокуємо. Покупець бачить: «Доступно: 45, ви запросили: 60. Можлива часткова відгрузка».
Резервування при переводі в статус pending_approval: створюємо запис в b_catalog_store_product з негативною зміною остатку (або в окремій таблиці резервів). При скасуванні замовлення — резерв повертається. Це запобігає подвійному бронюванню одного товару двома покупцями.
Синхронізація з 1С знімає резерви автоматично — при оновленні остатків через CommerceML остатки перераховуються з урахуванням резервів у b_catalog_store_product.QUANTITY_RESERVED.
Ціноутворення в оптовому модулі
Оптові ціни залежать від обсягу: 1-10 одиниць — ціна А, 11-50 — ціна Б, 51+ — ціна В. У стандартному модулі catalog це реалізується через квантовані ціни (CCatalogProductPrice), але інтерфейс управління ними незручний при великому асортименті.
У модулі реалізуємо кастомний інтерфейс управління обсяговими скидками: Highload-блок wholesale_price_rules (UF_IBLOCK_SECTION_ID або UF_PRODUCT_ID, UF_QTY_FROM, UF_QTY_TO, UF_PRICE_TYPE — фіксована або відсоток від базової). При додаванні позиції в чернетку визначаємо кількість та шукаємо відповідне правило.
Робота з одиницями вимірювання
Оптовий каталог часто має кілька одиниць: штука, упаковка (12 шт.), палета (240 шт.). Модуль catalog підтримує міри через CCatalogMeasure та CCatalogMeasureRatio. В оптовому інтерфейсі покупець вибирає одиницю — кількість перераховується автоматично, як і ціна.
Часові рамки
| Компонент | Час |
|---|---|
| Табличний ввід з AJAX-пошуком | 2-3 тижні |
| Імпорт Excel/CSV | 1-2 тижні |
| Чернетка замовлення (D7 сутність + API) | 2-3 тижні |
| Контроль остатків та резервування | 1-2 тижні |
| Обсягове ціноутворення | 1-2 тижні |
| Інтеграція з модулем узгодження | 1-2 тижні |
Разом: 8-14 тижнів включаючи тестування та приймання.







