Разработка кастомного модуля оптового заказа для 1С-Битрикс решает проблему обработки заказов с сотнями позиций. Табличный ввод с AJAX-поиском, импорт Excel/CSV и черновики заменяют ручной поиск через фильтр. Стандартный компонент bitrix:sale.basket для этого не годится — мы создаём модуль под ключ с резервированием остатков и интеграцией с 1С. Обмен данными с ERP реализован через стандарт CommerceML. При 100 заказах в месяц экономия времени составляет 50 часов, что при ставке менеджера 600 руб./час даёт 30 000 руб. экономии ежемесячно.
Быстрый ввод заказа: три сценария
Табличный ввод с автодополнением. Пользователь вводит артикул в строке, поле автодополняется через AJAX-запрос к кастомному обработчику, который ищет по b_iblock_element с индексом по CODE и XML_ID. После выбора позиции поля цены, остатка и единицы измерения заполняются автоматически. Строк в таблице — сколько нужно, добавляются динамически через JS.
Импорт из Excel/CSV. Файл загружается через компонент файлового поля, парсится на сервере через PhpSpreadsheet или fgetcsv. Ожидаемый формат: артикул, количество, опционально комментарий. Результат парсинга — список позиций с найденными и не найденными артикулами. Не найденные показываются отдельно для ручного сопоставления. Найденные добавляются в черновик заказа.
Повтор заказа. Кнопка «Повторить заказ» в истории — берёт CSaleOrder::GetByID(), итерирует по CSaleBasket::GetList() с ORDER_ID, проверяет текущее наличие каждой позиции. Позиции с нулевым остатком помечаются предупреждением, но не блокируют создание черновика.
Кастомный модуль обрабатывает импорт 5000 позиций за 2 секунды, тогда как стандартная корзина — за 30 секунд (в 15 раз быстрее). Получите консультацию по вашему проекту — мы рассчитаем сроки и бюджет.
Архитектура модуля
Модуль размещается в 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() с явным указанием цен из черновика. Стандартный пересчёт цен отключается для этих позиций — иначе персональные цены могут быть перезаписаны. Официальная документация Bitrix\Sale\Order описывает создание через 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. В оптовом интерфейсе покупатель выбирает единицу — количество пересчитывается автоматически, цена — тоже.
Сравнение возможностей: стандартная корзина vs кастомный модуль
| Функция |
Стандартная корзина |
Кастомный модуль |
| Табличный ввод |
Нет |
Да, с AJAX-поиском |
| Импорт Excel/CSV |
Нет |
Да (PhpSpreadsheet) |
| Черновики заказов |
Нет |
Да (D7 сущность) |
| Резервирование |
Нет |
Да, двухуровневое |
| Объёмные цены |
Через квантованные цены (сложно) |
Кастомные правила на HL-блоке |
Как мы разрабатываем модуль: пошагово
- Анализ бизнес-процессов оптового отдела.
- Прототипирование интерфейса табличного ввода.
- Разработка модуля с черновиками и импортом.
- Интеграция с 1С через CommerceML.
- Тестирование на вашем ассортименте (до 50 000 товаров).
- Передача с документацией и обучением.
Что входит в работу
- Разработка модуля с табличным вводом, импортом и черновиками.
- Настройка резервирования и ценообразования.
- Интеграция с 1С через CommerceML.
- Тестирование на вашем ассортименте (до 50 000 товаров).
- Документация по API модуля и инструкция для менеджеров.
- Передача доступов и обучение (2 часа созвон).
- Гарантия на код 6 месяцев.
Сроки
| Компонент |
Срок |
| Табличный ввод с AJAX-поиском |
2-3 недели |
| Импорт Excel/CSV |
1-2 недели |
| Черновик заказа (D7 сущность + API) |
2-3 недели |
| Контроль остатков и резервирование |
1-2 недели |
| Объёмное ценообразование |
1-2 недели |
| Интеграция с модулем согласования |
1-2 недели |
Итого: 8-14 недель включая тестирование и приёмку. Свяжитесь для консультации — мы обсудим ваш проект и рассчитаем точную стоимость. Закажите разработку модуля оптового заказа.
B2B-порталы на 1С-Битрикс
Наша специализация — разработка B2B-порталов на 1С-Битрикс. Не просто «интернет-магазинов для оптовиков». Тут другая вселенная: у каждого контрагента свой прайс, свой кредитный лимит, свой набор документов и свой менеджер в Краснодаре. Розничный покупатель выбирает по картинке и отзывам. Оптовик вбивает 50 артикулов в форму быстрого заказа и ждёт счёт через 30 секунд.
У нас 10+ лет опыта в этой нише, более 50 проектов внедрения. Гарантия на работы — 12 месяцев. Сертифицированные специалисты 1С-Битрикс. Свяжитесь с нами — мы проанализируем вашу текущую структуру цен и предложим архитектуру портала под ваш бизнес.
Как устроено ценообразование в B2B-портале?
Если в рознице одна цена для всех, то в B2B — матрица. Типы цен в b_catalog_price умножаются на группы контрагентов, накопительные скидки, валютные пересчёты и договорные условия. Именно здесь проект либо взлетает, либо тонет в багах.
Типы цен и прайс-листы. В Битрикс типы цен задаются через CCatalogGroup. Стандартный набор: розничная, мелкооптовая, оптовая, дилерская, дистрибьюторская. Каждый контрагент привязан к группе пользователей, группа — к типу цены. Но реальность сложнее: один дилер может видеть оптовые цены на электронику и дистрибьюторские на аксессуары. Это уже не штатный механизм — нужна кастомная логика через обработчик OnSaleBasketItemBeforePriceSave.
Скидки — прогрессивная шкала по объёму (от 100 штук — минус 5%, от 500 — минус 12%), накопительные за период, сезонные, по категориям. Скидки комбинируются через приоритеты в b_sale_discount. Порядок применения — отдельная головная боль: скидка может быть до или после фиксированной; приоритеты настраиваются в «Правилах работы с корзиной». При 20+ правилах отладка превращается в квест.
Кредитные лимиты. Контрагенту устанавливается порог отгрузки в кредит. Текущая задолженность синхронизируется с 1С через регистр РасчетыСКонтрагентами. Превышение лимита → блокировка оформления заказа. Без этого менеджеры отгружают в долг, а бухгалтерия потом разгребает дебиторку.
Договорные цены — прайс привязан к конкретному договору: сроки действия, номер, условия пролонгации. Договор истёк — цены переключаются на базовые автоматически. Реализуется через пользовательские свойства заказа и обработчик OnSaleComponentOrderProperties.
Валюта — для ВЭД обязательно. Пересчёт по курсу ЦБ (парсинг cbr.ru через CCurrencyRates::ConvertCurrency()) или фиксированный курс контракта.
Что входит в дилерский кабинет?
Заказы — полная история с фильтрацией по статусам, датам, суммам. Повтор предыдущего заказа в один клик — для регулярных закупок это экономит часы. Шаблоны заказов для типовых позиций.
Финансы — сальдо взаиморасчётов, акт сверки, история оплат. Всё, что бухгалтер обычно запрашивает по email и ждёт три дня — в кабинете мгновенно. Данные тянутся из 1С через REST или CommerceML.
Документы — счета, накладные, счета-фактуры, УПД, акты. Формируются в 1С, PDF пушится на портал через интеграцию. Скачивание одним кликом. Никакого «пришлите повторно, потерялось в почте».
Управление сотрудниками дилера — администратор создаёт учётки с разграничением прав. Менеджер по закупкам формирует заказы, бухгалтер видит только финансы, руководитель — общую картину. Реализуется через расширение стандартных групп пользователей Битрикс.
Быстрый заказ: артикул + количество = счёт
B2B-клиент знает, что ему нужно. Каталог с красивыми карточками ему не нужен — нужна форма: артикул, количество, следующая строка.
- Форма быстрого заказа — автоподстановка наименования и цены при вводе артикула. Используем AJAX-поиск по
b_iblock_element.XML_ID или PROPERTY_ARTICLE. 50 позиций за 3 минуты
- Импорт из Excel/CSV — клиент выгрузил из своей системы, загрузил на портал. Автосопоставление артикулов, проверка наличия, формирование заказа. Парсинг через
PHPExcel или PhpSpreadsheet
- Корзина с полной информацией — вес, объём, количество мест, ориентировочная стоимость доставки до оформления
Почему интеграция с 1С критична для B2B-портала?
Без актуальных данных из 1С портал бесполезен. Менеджер Иванов изменил цену на гвозди — через 15 минут дилер в Красноярске должен видеть новую цену.
| Данные |
Направление |
Механизм |
| Каталог, характеристики |
1С → Портал |
CommerceML или REST, 15–60 мин |
| Цены по типам и контрагентам |
1С → Портал |
REST API, по событию или расписанию |
| Остатки по складам |
1С → Портал |
REST, 5–15 мин или реалтайм через HTTP-сервис 1С |
| Заказы |
Портал → 1С |
REST, реальное время |
| Статусы, отгрузки |
1С → Портал |
По событию |
| Взаиморасчёты |
1С → Портал |
1–2 раза в день |
| Документы (PDF) |
1С → Портал |
По событию |
CommerceML проще: штатный модуль обмена, XML-файлы, минимум настройки. Но он медленный на больших каталогах и не поддерживает кастомные сущности (кредитные лимиты, сальдо). REST API через HTTP-сервис 1С — гибче, быстрее, но требует доработки на стороне 1С. На практике часто используем гибрид: CommerceML для каталога, REST для цен, остатков и документов. Согласно официальной документации 1С-Битрикс, для B2B-порталов критично настроить синхронизацию справочников и остатков в реальном времени. Подробнее о CommerceML и REST API 1С-Битрикс.
ЭДО: юридически значимый обмен без бумаги
Для крупных B2B-проектов:
- Провайдеры — Контур.Диадок, СБИС, Калуга Астрал. Счета-фактуры, акты, накладные в электронном виде с юридической силой
- КЭП — квалифицированная электронная подпись. Контрагент подписывает акт прямо в кабинете
- Роуминг между операторами — без этого половина партнёров, у которых другой оператор ЭДО, останется за бортом
Многофилиальность
- Региональные склады — клиент видит остатки ближайшего склада, может выбрать склад отгрузки. Товар есть в Новосибирске, но нет в Москве — портал покажет оба варианта с разными сроками
- Автоназначение менеджера — дилер из Краснодара работает с Иваном, из Екатеринбурга — с Мариной. По полю
UF_REGION в карточке контрагента
- Локальные условия — минимальная сумма заказа, условия доставки, сроки — отличаются по регионам
Процесс разработки B2B-порталов
Разработка B2B-порталов включает пять этапов. Ниже таблица с ориентировочными сроками и результатами.
| Этап |
Срок |
Результат |
| Аудит процессов |
1–2 недели |
Схема бизнес-процессов, карта интеграций |
| Проектирование |
2–3 недели |
Архитектура, прототипы, спецификация обмена с 1С |
| Разработка |
4–8 недель |
Кабинеты, ценовые механики, интеграции, документооборот |
| Тестирование |
1–2 недели |
Функциональное, интеграционное, нагрузочное на реальных данных |
| Пилот |
2–3 недели |
5–10 дилеров, обратная связь, доработки |
Что входит в работу:
- Полная проектная документация (ТЗ, архитектурная схема, протоколы интеграции)
- Настройка серверного окружения и развёртывание (On-Premise или облако)
- Перенос всех пользовательских данных и конфигураций
- Обучение администраторов портала (2 занятия онлайн)
- Гарантийная поддержка 12 месяцев с реакцией до 4 часов
После запуска — техподдержка и развитие. B2B-портал — живая система, которая эволюционирует вместе с бизнесом.
Средняя экономия времени менеджера на обработке заказов — до 20 часов в неделю.
На старте проверьте корректность типов цен и групп пользователей, ограничьте количество скидочных правил (не более 3–4), протестируйте интеграцию с 1С на реальных данных, выдайте дилерам доступы и проведите нагрузочное тестирование на 50 одновременных пользователей.
Закажите разработку B2B-портала и получите консультацию специалиста. Свяжитесь с нами для обсуждения вашего проекта — мы подготовим предварительный расчёт и предложим оптимальное решение.