Разработка модуля оптового заказа 1С-Битрикс
Оптовый покупатель не работает через корзину. Он загружает список артикулов из своей ERP, указывает количество и ждёт подтверждения. Если портал предлагает ему искать каждую позицию вручную через фильтр и добавлять по одной — он уйдёт к конкуренту, у которого есть Excel-импорт.
Быстрый ввод заказа: три сценария
Стандартный компонент bitrix:sale.basket не подходит для оптовых заказов. Разрабатывается отдельный модуль с тремя режимами ввода позиций:
Табличный ввод с автодополнением. Пользователь вводит артикул в строке, поле автодополняется через AJAX-запрос к bitrix:catalog.search или к кастомному обработчику, который ищет по b_iblock_element с индексом по CODE и XML_ID. После выбора позиции — поля цены, остатка и единицы измерения заполняются автоматически. Строк в таблице — сколько нужно, добавляются динамически через JS.
Импорт из 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 недель включая тестирование и приёмку.







