Разработка модуля оптового заказа 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка модуля оптового заказа 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1169
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    743
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Разработка модуля оптового заказа 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 недель включая тестирование и приёмку.