Розробка оптового розділу інтернет-магазину на 1С-Бітрікс
Оптовий розділ всередині роздрібного магазину — це не окремий вебсайт, а паралельна комерційна логіка для авторизованих B2B-клієнтів. Один каталог, одна адміністративна панель, але різні ціни, правила оформлення та документообіг. У Бітрікс ця задача вирішується через типи цін, групи користувачів та доробку модуля sale.
Типи цін і права доступу: фундамент B2B
Вся цінова архітектура B2B будується навколо таблиці b_catalog_group. Кожна запис — окремий тип ціни: «Роздрібна», «Оптова», «Дилерська», «VIP». Привязка типу ціни до групи користувачів задається у настройках модуля catalog — розділ «Типи цін», колонка «Групи покупців».
Механізм працює так:
- Користувач авторизується та потрапляє у групу (наприклад, «Оптовики»)
- Компонент каталогу викликає
CCatalogProduct::GetOptimalPrice(), який перебирає доступні типи цін для поточного користувача - Повертається найменша з доступних цін (або ціна з найвищим пріоритетом — залежить від настройки)
На практиці одного механізму типів цін недостатньо. Реальні оптові прайс-листи складніші:
-
Індивідуальні скидки — контрагенту А скидка 12%, контрагенту Б — 18%. Рішення: окрема група користувачів на кожного крупного контрагента зі своїм типом ціни, або правила корзини (
sale.discount) з умовою за групою. -
Пороговые ціни — при покупці від 100 штук ціна одна, від 1000 — інша. У стандартному Бітрікс це реалізується через діапазони кількості в цінах товару (
b_catalog_priceпідтримуєQUANTITY_FROM/QUANTITY_TO). -
Валютні ціни — оптові клієнти з різних країн бачать ціни в своїй валюті. Типи цін можна задавати в різних валютах, конвертація — через модуль
currency.
Важливий нюанс: тип ціни не привязується до користувача безпосередньо — лише до групи. Якщо потрібна індивідуальна ціна для 200 контрагентів, створювати 200 груп нераціонально. У таких випадках пишеться обробник події OnGetOptimalPrice, який підтягує ціну з зовнішнього джерела (1С, ERP) через кеш.
| Сценарій | Реалізація у Бітрікс | Обмеження |
|---|---|---|
| 3–5 цінових рівнів | Типи цін + групи користувачів | Стандартний механізм, працює з коробки |
| Порогові ціни за кількістю | Діапазони у b_catalog_price |
Не відображаються у карточці без доробки шаблону |
| Індивідуальний прайс на контрагента | Подія OnGetOptimalPrice + зовнішнє джерело |
Потребує кешування, інакше — запит до 1С на кожний товар |
| Скидка на категорію для групи | Правила корзини sale.discount |
Не видна у каталозі до додавання в кошик |
Мінімальна партія і кратність замовлення
Для оптових товарів необхідні два параметри: мінімальна кількість для замовлення та крок (кратність). У стандартному Бітрікс є поле «Коефіцієнт одиниці виміру» (b_catalog_measure_ratio), але воно працює лише як множник при додаванні в кошик.
Повноцінна реалізація потребує:
- Властивість інфоблока «Мінімальна партія» — перевіряється при додаванні в кошик через обробник
OnSaleBasketItemBeforeUpdate - Властивість «Кратність» — кількість округляється вверх до найближчого кратного значення
- Відображення у карточці товару — замість стандартного поля кількості показується селектор з кроком (10, 20, 30…) або поле з валідацією
Швидкий заказ за артикулом і завантаження з Excel
Оптовий клієнт не листає каталог — він знає артикули. Потрібен інтерфейс швидкого замовлення:
-
Форма «артикул + кількість» — список рядків, куди вбиваються дані. На стороні сервера артикул матчиться з
PROPERTY_CML2_ARTICLEабоXML_IDелемента інфоблока, товар додається в кошик. -
Завантаження Excel/CSV — клієнт експортує файл з своєї системи обліку. Парсер на стороні Бітрікс (бібліотека PhpSpreadsheet, підключена через Composer) розбирає файл, знаходить товари, формує кошик. Невідповідні артикули показуються у звіті.
-
Повтор попереднього замовлення — кнопка у особистому кабінеті, яка копіює склад замовлення в поточну корзину. Реалізується через
Bitrix\Sale\Basket::loadItemsForOrder().
Кредитні лімити та відстрочка платежу
У B2B оплата часто відбувається постфактум. Механізм кредитного лімиту:
- У профілі контрагента (розширені властивості користувача або
UF_*поля) зберігається лімітом та поточна заборгованість - При оформленні замовлення обробник
OnSaleOrderBeforeSavedперевіряє: сума замовлення + поточна заборгованість ≤ кредитний лімітом - Якщо лімітом перевищений — замовлення не оформляється, користувач бачить повідомлення з сумою доступного залишку
- Після оплати (зміна статусу оплати через 1С-обмін або вручну) заборгованість пересчитується
Документообіг у особистому кабінеті
Оптовий клієнт очікує побачити у особистому кабінеті:
-
Рахунки на оплату — генеруються автоматично при створенні замовлення. Шаблон PDF збирається через обробник друку (
sale_print) або зовнішню бібліотеку (TCPDF/mPDF). - Акти звірки — підтягуються з 1С через обмін. Зберігаються як файли, привязані до користувача через highload-блок.
- Накладні та УПД — аналогічно, експортуються з 1С. Для юридичної значимості можуть підписуватися ЕЦП.
-
Історія замовлень з фільтруванням — за період, статусом, сумою. Стандартний компонент
sale.personal.orderдорабляється або замінюється кастомним.
Окремий кошик і розділення контексту
Технічно у Бітрікс кошик один на користувача. Якщо клієнт може купувати і в роздріб, і оптом, потрібне розділення:
-
Варіант 1: тип сайту. Два сайти в одній інсталяції Бітрікс — роздрібний та оптовий. Кошики розділяються за
FUSER_ID+LID(ідентифікатор сайту). Мінус — дублювання настроїв. -
Варіант 2: властивість елемента кошика. Додається кастомна властивість
BASKET_TYPE=wholesale. При оформленні фільтруються лише оптові позиції. Мінус — складніше у реалізації, потрібна доробка шаблону оформлення.
На практиці перший варіант надійніший: два сайти зі спільним каталогом, різними шаблонами та незалежними кошиками. Перемикання між «вітринами» — за поддоменом або розділом URL.
Інтеграція з 1С для оптового розділу
Обмін з 1С для B2B-розділу включає додаткові сутності, які відсутні у стандартному CommerceML:
- Контрагенти — синхронізація карточок контрагентів з 1С з профілями користувачів Бітрікс. Маппінг за ІНН або XML_ID.
- Взаиморасчеты — поточний борг, платежі, кредитний лімітом. Передаються через додаткові XML-вузли або окремий REST-запит.
- Індивідуальні прайс-листи — якщо ведуться у 1С, потрібен механізм експорту у форматі «контрагент → товар → ціна». Стандартний обмін цього не підтримує — пишеться окремий скрипт обміну.
Оптовий розділ — це завжди доробка, а не настройка з коробки. Обсяг робіт залежить від глибини інтеграції з системою обліку та вимог до документообігу.







