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







