На одном из проектов с 60 поставщиками каждый день менеджер тратил 3 часа на синхронизацию остатков через Excel. После внедрения кабинета поставщика время сократилось до 10 минут. Такая же боль — у многих дропшиппинговых магазинов: поставщики не видят свои заказы, обновляют цены через письма, а ошибки при ручном вводе достигают 12%. Разработка отдельного личного кабинета для каждого поставщика на 1С-Битрикс решает эти проблемы: изолированные права, собственные товары и заказы, массовая загрузка CSV. Мы автоматизируем рутину так, что поставщик тратит 15 минут вместо 4 часов — и ошибки стремятся к нулю.
Наш опыт: более 10 лет разработки на Битрикс, 50+ проектов в e-commerce. Гарантируем стабильную работу кабинета при нагрузке до 100 одновременно активных поставщиков. Оценим ваш проект за 2 дня: свяжитесь с нами для консультации.
Как организовать разграничение прав для поставщиков?
В Битрикс разграничение прав реализуется через группы пользователей. Создаём группу «Поставщики» через API:
$groupId = CGroup::Add([ 'ACTIVE' => 'Y', 'NAME' => 'Поставщики', 'STRING_ID' => 'SUPPLIERS', ]); Привязка конкретного поставщика к его товарам — через HL-блок SupplierProduct или свойство инфоблока SUPPLIER_ID типа «Привязка к пользователю» (E). Раздел кабинета поставщика закрывается через проверку группы:
if (!$USER->IsAuthorized() || !$USER->IsInGroup($supplierGroupId)) { LocalRedirect('/auth/?backurl=' . urlencode($_SERVER['REQUEST_URI'])); } Подробнее о группах пользователей — в документации.
Состав кабинета: товары, заказы, цены
Что входит в блок «Мои товары»?
Список товаров поставщика с текущим остатком и ценой. Запрос через CIBlockElement::GetList с фильтром по SUPPLIER_ID:
$userId = $USER->GetID(); $res = CIBlockElement::GetList( ['NAME' => 'ASC'], [ 'IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y', 'PROPERTY_SUPPLIER_ID' => $userId, ], false, false, ['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE', 'PROPERTY_SUPPLIER_ID'] ); Для каждого товара показываем текущий остаток из b_catalog_store_product и цену из b_catalog_price. Каждый поставщик имеет свой склад (b_catalog_store) — это позволяет отслеживать остатки независимо.
Как поставщик обновляет цены и остатки?
Поставщик отправляет AJAX-запрос из формы. Обработчик проверяет принадлежность товара и выполняет обновление:
// /local/ajax/supplier-update.php $productId = (int)$_POST['product_id']; $newPrice = (float)$_POST['price']; $newQty = (int)$_POST['quantity']; $ownerCheck = CIBlockElement::GetProperty( CATALOG_IBLOCK_ID, $productId, 'sort', 'asc', ['CODE' => 'SUPPLIER_ID', 'VALUE' => $USER->GetID()] ); if (!$ownerCheck->Fetch()) { echo json_encode(['error' => 'Доступ запрещён']); die(); } $priceRow = CCatalogPrice::GetList( [], ['PRODUCT_ID' => $productId, 'CATALOG_GROUP_ID' => BASE_PRICE_GROUP_ID] )->Fetch(); if ($priceRow) { CCatalogPrice::Update($priceRow['ID'], ['PRICE' => $newPrice, 'CURRENCY' => 'RUB']); } else { CCatalogPrice::Add([ 'PRODUCT_ID' => $productId, 'CATALOG_GROUP_ID' => BASE_PRICE_GROUP_ID, 'PRICE' => $newPrice, 'CURRENCY' => 'RUB', ]); } $storeProductRow = CCatalogStoreProduct::GetList( [], ['PRODUCT_ID' => $productId, 'STORE_ID' => getSupplierStoreId($userId)] )->Fetch(); if ($storeProductRow) { CCatalogStoreProduct::Update($storeProductRow['ID'], ['AMOUNT' => $newQty]); } else { CCatalogStoreProduct::Add([ 'PRODUCT_ID' => $productId, 'STORE_ID' => getSupplierStoreId($userId), 'AMOUNT' => $newQty, ]); } echo json_encode(['success' => true]); Как поставщик видит свои заказы?
Поставщик видит только те заказы, в которых есть его товары. Прямой запрос к b_sale_order не подходит — нужна связь через корзину:
$supplierId = $USER->GetID(); $connection = \Bitrix\Main\Application::getConnection(); $orders = $connection->query(" SELECT DISTINCT o.ID, o.DATE_INSERT, o.PRICE, o.STATUS_ID, o.USER_ID, u.NAME, u.LAST_NAME, u.EMAIL FROM b_sale_order o JOIN b_sale_basket b ON b.ORDER_ID = o.ID JOIN b_iblock_element_property ep ON ep.IBLOCK_ELEMENT_ID = b.PRODUCT_ID AND ep.IBLOCK_PROPERTY_ID = " . SUPPLIER_PROP_ID . " AND ep.VALUE_NUM = {$supplierId} LEFT JOIN b_user u ON u.ID = o.USER_ID WHERE o.DATE_INSERT >= DATE_SUB(NOW(), INTERVAL 90 DAY) ORDER BY o.DATE_INSERT DESC LIMIT 100 "); В детальной странице заказа поставщик видит только свои позиции корзины.
Подтверждение отгрузки и статусы
Поставщик подтверждает отгрузку своей части заказа через интерфейс. Статус фиксируется в HL-блоке SupplierShipment с полями: UF_ORDER_ID, UF_SUPPLIER_ID, UF_STATUS (pending/confirmed/shipped/delivered), UF_TRACKING, UF_DATE_SHIPPED. Когда все поставщики заказа установили статус shipped, агент автоматически меняет статус заказа Битрикс на «Отправлен».
Массовая загрузка через CSV
Для поставщиков с большим ассортиментом (5000+ позиций) предусмотрена форма загрузки CSV-файла с колонками: артикул, цена, остаток. PHP-обработчик находит товар по CML2_ARTICLE, проверяет принадлежность поставщику, и если всё корректно — обновляет цену и остаток. Лимит на количество строк (до 5000) исключает таймаут PHP. Для более крупных партий используем фоновые агенты.
Сравнение подходов к управлению поставщиками
| Подход | Ручное управление | Наш кабинет поставщика |
|---|---|---|
| Время на обновление 100 товаров | 2 часа | 5 минут |
| Риск ошибок | 12% | <1% |
| Доступ к данным | Полный к админке | Только свои товары и заказы |
| Масштабирование | До 10 поставщиков | До 100+ поставщиков |
Этапы разработки
| Этап | Длительность | Результат |
|---|---|---|
| Аналитика | 1–2 дня | Требования, прототипы, ролевая модель |
| Проектирование | 2–3 дня | Архитектура БД, структура компонентов |
| Реализация | 5–10 дней | Готовый функционал: компоненты, AJAX, интеграции |
| Тестирование | 2–3 дня | Проверка прав, нагрузка до 100 сессий |
| Деплой и документирование | 1–2 дня | Установка, кэширование, обучение менеджеров |
Общие сроки: от 1 до 4 недель в зависимости от сложности (базовый кабинет — 1–1.5 недели, полноценный со складом и CSV — 2–3 недели, мультиязычный с аналитикой — 3–4 недели).
Почему стандартный личный кабинет не подходит?
Встроенный модуль my в Битрикс ориентирован на покупателей: корзина, история заказов, личные данные. Для поставщика нужны другие сущности — управление остатками, массовая загрузка, отслеживание отгрузок. Кроме того, без дополнительных настроек поставщик не может быть ограничен только своими товарами. Поэтому требуется разработка отдельного компонентного решения с собственной системой прав.
Типичные ошибки, которые мы предотвращаем
- Отсутствие проверки прав на AJAX-запросах — злоумышленник может обновлять чужие цены. Все обработчики проверяют SUPPLIER_ID.
- Нет тегированного кэширования — при 100 поставщиках страница грузится более 10 секунд. Используем кэш с тегами пользователя.
- Склад поставщика не создаётся автоматически — остатки всех поставщиков смешиваются. Мы создаём склад при регистрации поставщика через событие OnBeforeUserRegister.
Преимущества автоматизации
Автоматический обмен данными с поставщиками в 5 раз быстрее ручного ввода. Ошибки при ручном обновлении случаются в 12% транзакций — с нашим кабинетом этот показатель стремится к нулю. Каждый поставщик экономит минимум 3 часа в день на сверке остатков.
Получите консультацию по архитектуре кабинета — опишите вашу ситуацию, и мы предложим оптимальное решение. Закажите разработку кабинета поставщика под ключ и начните принимать заказы через 1–2 недели.







