Разработка оптового раздела интернет-магазина на 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С, нужен механизм выгрузки в формате «контрагент → товар → цена». Стандартный обмен этого не поддерживает — пишется отдельный скрипт обмена.
Оптовый раздел — это всегда доработка, а не настройка из коробки. Объём работ зависит от глубины интеграции с учётной системой и требований к документообороту.







