Разработка модуля дилерского кабинета 1С-Битрикс
Дилер, который звонит менеджеру чтобы узнать статус своего заказа или попросить выслать счёт — это звонок, который стоит денег. Умноженный на 200 дилеров и 10 заказов в месяц каждый, получаем 2000 ненужных обращений в месяц. Кабинет дилера закрывает эту нагрузку на менеджеров автоматически.
Что входит в кабинет: минимальный состав
Кабинет дилера — не витрина и не CMS-страница. Это функциональный инструмент со своей логикой доступа и данными, специфичными для каждого партнёра. Минимальный набор разделов:
- Заказы — список с фильтрацией по статусу, дате, сумме. Детальная карточка с позициями, возможностью повтора и скачивания документов
- Прайс-лист — актуальный прайс с дилерскими ценами, экспорт в Excel
- Документы — счета, товарные накладные, акты сверки из 1С
- Финансы — текущий баланс, лимит кредита, просроченная задолженность
- Профиль компании — реквизиты, адреса доставки, контактные лица
Архитектура модуля
Размещается в local/modules/project.dealer_cabinet/. Модуль регистрирует собственные компоненты в пространстве имён project:
local/modules/project.dealer_cabinet/
install/index.php — установщик
lib/
DealerContext.php — контекст текущего дилера (singleton)
Repository/
OrderRepository.php — выборки заказов с учётом дилера
DocumentRepository.php — документы из 1С / Highload
FinanceRepository.php — кредитный лимит, задолженность
Service/
PriceExporter.php — экспорт прайса в Excel
DealerAccessControl.php — проверка прав
DealerContext — центральный объект. При каждом запросе читает из сессии ID дилерской компании и тип дилера. Все репозитории получают этот контекст и применяют соответствующие фильтры. Это исключает ситуацию, когда дилер А видит заказы дилера Б — весь доступ к данным идёт через одну точку.
Управление заказами в кабинете
История заказов берётся из CSaleOrder::GetList() с фильтром по пользовательскому полю UF_DEALER_COMPANY_ID. Все заказы компании — не только созданные текущим пользователем. Если у дилера несколько менеджеров, каждый видит заказы всей компании (с учётом роли: менеджер видит все, закупщик — только свои).
Детальная карточка заказа: позиции через CSaleBasket::GetList(), статусы доставки через CSaleDelivery, документы — по ORDER_ID из Highload-блока документов (синхронизируется с 1С). Кнопка «Скачать накладную» запрашивает PDF из 1С через REST или отдаёт закешированный файл из /upload/dealer/docs/.
Повтор заказа — итерирует позиции предыдущего заказа, проверяет актуальные остатки и цены, создаёт черновик. Позиции, которых нет в наличии, помечаются предупреждением. Дилер сам решает, убирать их или оставить с ожиданием.
Экспорт прайса
Дилеры регулярно скачивают прайс для своих клиентов или для загрузки в собственные системы. Экспорт реализуется через PriceExporter:
- Получаем товары каталога с фильтром по доступным для дилера категориям
- Применяем дилерские цены из
b_catalog_priceпоCATALOG_GROUP_IDдилера - Применяем контрактные цены из Highload-блока (если есть, с приоритетом)
- Генерируем Excel через
PhpSpreadsheetили отдаём CSV
Формат: артикул, название, единица измерения, остаток (опционально), цена. Файл генерируется на лету, не кешируется — цены должны быть актуальными на момент запроса. Если каталог большой (10К+ позиций) — генерируем в фоне через агент и даём ссылку на готовый файл.
Финансовый блок
Данные о кредитном лимите и задолженности не хранятся в Битриксе — они живут в 1С. Синхронизация через агент каждые 2 часа: вызывается REST-сервис 1С, результат записывается в Highload-блок dealer_finances:
UF_DEALER_ID — ID дилерской компании
UF_CREDIT_LIMIT — максимальный лимит
UF_USED_LIMIT — использованный лимит
UF_OVERDUE_AMOUNT — просроченная задолженность
UF_OVERDUE_DAYS — количество дней просрочки
UF_UPDATED_AT — время последней синхронизации
В кабинете данные отображаются с пометкой «Актуально на {время}». Если просрочка > 0 — показываем предупреждение, при превышении допустимого порога — блокируем создание новых заказов через обработчик OnBeforeSaleOrderAdd.
Права доступа внутри компании
Внутри одной дилерской компании разные пользователи имеют разные права. Таблица b_dealer_user_roles:
| Роль | Заказы | Документы | Финансы | Управление пользователями |
|---|---|---|---|---|
owner |
Все | Все | Да | Да |
manager |
Свои | Свои | Нет | Нет |
accountant |
Все (чтение) | Все | Да | Нет |
Проверка прав — через DealerAccessControl::can($action) перед каждым действием. Централизованно, не в шаблонах.
Сроки
| Блок | Срок |
|---|---|
| Архитектура модуля, роли и контекст | 2-3 недели |
| Управление заказами | 2-3 недели |
| Документы и синхронизация с 1С | 2-4 недели |
| Финансовый блок | 1-2 недели |
| Экспорт прайса | 1-2 недели |
| Тестирование | 2-3 недели |
Итого: 10-17 недель. Основная переменная — сложность интеграции с 1С для документов и финансов.







