Разработка личного кабинета B2B на 1С-Битрикс
Корпоративный покупатель приходит в кабинет не за красивым интерфейсом — ему нужно за 2 минуты найти заказ трёхмесячной давности, скачать накладную и проверить, не вышел ли он за кредитный лимит. Если кабинет этого не даёт, он перезванивает менеджеру. Это и есть метрика провала: количество звонков по вопросам, которые должны решаться самостоятельно.
Принципиальные отличия B2B-кабинета от B2C
В розничном кабинете пользователь видит только свои заказы. В B2B:
- Несколько сотрудников одной компании с разными ролями
- Заказы могут создаваться от имени компании, а не физлица
- Кредитный лимит и задолженность — общие для компании
- Документы (счета, накладные) привязаны к юрлицу
- Согласование заказов до их подтверждения
Стандартный bitrix:sale.personal.orders не покрывает ни один из этих сценариев.
Управление пользователями компании
Центральная сущность — Company, связанная с пользователями Битрикса через Highload-блок b2b_company_users. Поля: UF_COMPANY_ID, UF_USER_ID, UF_ROLE, UF_ACTIVE, UF_CREATED_AT.
Роли задаются через константы в модуле:
-
ROLE_OWNER— полные права, управляет сотрудниками и реквизитами -
ROLE_BUYER— создаёт и видит заказы компании -
ROLE_ACCOUNTANT— только документы и финансы, без создания заказов -
ROLE_VIEWER— только просмотр истории
Приглашение сотрудника: владелец вводит email → генерируется токен → отправляется письмо через CEvent::Send() с шаблоном B2B_COMPANY_INVITE → по ссылке создаётся пользователь Битрикс (или привязывается существующий) → создаётся запись в b2b_company_users.
Заказы: что нужно сверх стандарта
Список заказов компании. Не пользователя — компании. CSaleOrder::GetList() с фильтром по UF_COMPANY_ID (пользовательское поле заказа). Фильтрация по статусу, дате, менеджеру, который создал. Поиск по номеру заказа и артикулу в составе — через CSaleBasket::GetList() с последующим JOIN.
Статусы согласования. Добавляем в b_sale_status кастомные статусы: APPROVAL_PENDING (ждёт согласования), APPROVED (согласован), REJECTED (отклонён). Переходы между статусами — через обработчики событий OnSaleStatusOrderChange. При изменении статуса отправляем уведомление через CEvent::Send().
Комментарии к заказу. Высокозагружаемый элемент коммуникации: покупатель пишет пожелание («доставить на склад №2»), менеджер отвечает. Реализуем через Highload-блок order_comments: UF_ORDER_ID, UF_USER_ID, UF_TEXT, UF_CREATED_AT, UF_IS_INTERNAL (менеджерский комментарий, невидимый покупателю).
Документы из 1С
Интеграция по следующей схеме:
- В 1С настраивается HTTP-сервис (или регулярная выгрузка XML) с документами по контрагенту
- Агент Битрикс (
CAgent::AddAgent) опрашивает сервис каждые 2-4 часа - Результат записывается в Highload-блок
b2b_documents:UF_COMPANY_ID,UF_DOC_TYPE(invoice, waybill, reconciliation),UF_NUMBER,UF_DATE,UF_AMOUNT,UF_FILE_ID(илиUF_EXTERNAL_URL) - В кабинете — список с фильтрами, скачивание PDF
Если 1С отдаёт PDF напрямую — кешируем в /upload/b2b/docs/{company_id}/ с именем по номеру документа. Если отдаёт только метаданные — при клике «Скачать» делаем запрос к 1С и стримим файл через PHP без сохранения на диск (для экономии места).
Финансовая сводка
Блок «Финансы» на главной странице кабинета — агрегированные данные:
- Текущий кредитный лимит и использованная сумма (прогресс-бар)
- Просроченная задолженность с датой возникновения
- Сумма заказов за текущий месяц
Источник — Highload-блок b2b_credit_status, синхронизируется из 1С. Если данные устарели более чем на 6 часов — показываем предупреждение «Данные обновляются».
При наличии просрочки свыше допустимого порога — в шапке кабинета показываем баннер. Кнопка «Создать заказ» блокируется через проверку в компоненте корзины.
Уведомления
Настраиваем два канала:
Email: через почтовые события Битрикс (CEventType, CEvent). События: B2B_ORDER_CREATED, B2B_ORDER_STATUS_CHANGED, B2B_ORDER_APPROVED, B2B_DOCUMENT_READY. Шаблоны редактируются в панели управления администратора.
Внутренние уведомления: счётчик непрочитанных в кабинете. Highload-блок b2b_notifications: UF_USER_ID, UF_TYPE, UF_TEXT, UF_LINK, UF_IS_READ, UF_CREATED_AT. AJAX-запрос каждые 30 секунд или через WebSocket (модуль pull).
Сроки
| Блок | Срок |
|---|---|
| Архитектура ролей и компаний | 2-3 недели |
| Управление заказами компании | 2-3 недели |
| Документы и интеграция с 1С | 2-4 недели |
| Финансовый блок | 1-2 недели |
| Согласование заказов | 2-3 недели |
| Уведомления | 1-2 недели |
| Тестирование | 2-3 недели |
Итого: 12-20 недель. Меньше — при использовании готового каркаса кабинета. Больше — при нестандартной логике согласования или сложном 1С-обмене.







