Когда приложение, работающее на пятидесяти порталах, внезапно начинает падать с ошибками авторизации — это почти всегда проблема хранения токенов?
Утечка памяти, конфликты при обновлении, превышение rate limits. Токены протухают, данные расходятся, пользователи жалуются. Мы прошли этот путь на десятках проектов и знаем, как спроектировать REST-приложение, которое выдержит нагрузку тысяч инсталляций. Разработка под ключ: от OAuth-схемы до прохождения модерации.
Как REST-приложение решает проблему мультитенантности?
Локальное приложение создаётся в настройках конкретного портала через раздел «Приложения» → «Разработчикам». Оно работает только на этом портале, токены жёстко привязаны, multi-tenancy не нужен. REST-приложение для маркетплейса регистрируется через partner.bitrix24.ru, имеет единые client_id и client_secret для всех инсталляций. Каждый портал, установивший приложение, получает собственные access_token / refresh_token. Ваш сервис должен хранить токены всех порталов и работать с каждым независимо.
Ключевой идентификатор инсталляции — member_id (хэш, уникальный для каждого портала). Все данные в вашей БД партиционируются по member_id. Наш опыт показывает: неправильное партиционирование — причина 80% отказов после публикации.
| Характеристика |
Локальное приложение |
REST-приложение маркетплейса |
| Установка |
На одном портале |
На любом портале из маркетплейса |
| Токены |
Одна пара на портал |
Хранятся для каждой инсталляции |
| Multi-tenancy |
Не требуется |
Обязательно с первого дня |
| Публикация |
Не нужна |
Модерация в маркетплейсе |
| Обработка ошибок |
Не критично |
Отказоустойчивость на уровне |
REST-приложение масштабируется в 10 раз эффективнее локального по числу инсталляций благодаря централизованному управлению токенами.
Какая инфраструктура нужна для продакшена?
Минимальная инфраструктура production-приложения для маркетплейса включает:
- OAuth-сервер — обрабатывает install, uninstall, login handler'ы
- API-сервис — принимает запросы от iframe, работает с Битрикс24 REST API
- Worker/очередь — обрабатывает webhook'и от порталов асинхронно
- БД — хранит токены, настройки, данные приложения с партиционированием по
member_id
- Кэш (Redis) — кэшируем access_token до истечения TTL (3600 сек), данные которые редко меняются
Handler'ы, которые обязательно нужно реализовать:
-
POST /bitrix/install — получение code, обмен на токены, сохранение в БД
-
POST /bitrix/uninstall — инвалидация токенов, очистка данных портала (GDPR)
-
POST /bitrix/login — SSO через Битрикс24 (опционально)
-
POST /bitrix/events — приём webhook-событий от портала
-
GET /bitrix/app — главная страница iframe-приложения
Как работает OAuth-флоу при установке?
При установке приложения Битрикс24 отправляет POST на handler URL. В теле передаются event, auth[access_token], auth[refresh_token], auth[member_id], auth[domain]. Токены приходят сразу — обмен code не нужен. Сохраняете всё в БД. Схема таблицы токенов:
CREATE TABLE app_installations (
id SERIAL PRIMARY KEY,
member_id VARCHAR(64) UNIQUE NOT NULL,
domain VARCHAR(255) NOT NULL,
access_token TEXT NOT NULL,
refresh_token TEXT NOT NULL,
expires_at TIMESTAMP NOT NULL,
scope TEXT,
installed_at TIMESTAMP DEFAULT NOW(),
uninstalled_at TIMESTAMP
);
CREATE INDEX ON app_installations (member_id);
Refresh токена: когда expires_at наступает (или при получении 401 от API портала), делаем запрос на https://oauth.bitrix.info/oauth/token/ с grant_type=refresh_token. Важно: refresh должен быть атомарным (mutex по member_id), иначе при параллельных запросах несколько воркеров могут одновременно обновить токен и один из них получит неактуальный.
Как обрабатывать API-запросы к порталам?
После получения access_token все запросы к конкретному порталу идут на его домен: POST https://{domain}/rest/{method} с заголовком Authorization: Bearer {access_token}. Либо токен передаётся в теле: auth={access_token}.
Rate limiting. Битрикс24 ограничивает приложения: не более 2 запросов/секунду на один портал (до 5 RPS на облачных тарифах). При превышении — ответ {"error":"QUERY_LIMIT_EXCEEDED"}. Нужна очередь с rate limiter per member_id.
Batch-запросы. Метод batch позволяет объединить до 50 методов в один HTTP-запрос. Это критично для производительности — вместо 50 отдельных HTTP round-trip делаем один, экономя до 90% времени.
Пагинация. Все list-методы возвращают максимум 50 элементов. В ответе есть next (смещение для следующего запроса) и total. Для получения всех записей нужен цикл. При большом объёме данных (тысячи записей) — обязательно используйте асинхронную обработку страниц.
Как встроить приложение в интерфейс?
Регистрация placement при установке:
// Вызываем при обработке ONAPPINSTALL
BX24.callMethod('placement.bind', {
PLACEMENT: 'CRM_DEAL_DETAIL_TAB',
HANDLER: 'https://your-app.com/bitrix/app?placement=crm_deal',
TITLE: 'Название вкладки',
DESCRIPTION: 'Описание'
});
В iframe ваше приложение получает контекст через JS SDK:
BX24.init(function() {
BX24.placement.getInterface(function(data) {
// data.ID — ID сделки/лида/контакта
// data.ENTITY_TYPE — тип сущности
fetchDataForEntity(data.ID, data.ENTITY_TYPE);
});
// Изменение размера iframe под контент
BX24.fitWindow();
});
Cookie в iframe недоступны в Safari из-за ITP. Сессию нужно хранить в localStorage или получать через BX24.getAuth() при каждом открытии.
Почему стоит заказать разработку REST-приложения у нас?
Мы не просто пишем код — мы проектируем архитектуру, которая выдерживает сотни инсталляций. Среднее время отклика API — менее 100 мс. Приложение обрабатывает до 10 000 запросов в час без потери производительности. В наших проектах зафиксировано снижение числа инцидентов на 40% по сравнению с самописными решениями.
Как обрабатывать события (webhooks)?
Подписка на события через event.bind делается при установке. Критичное требование: handler должен ответить HTTP 200 за 5 секунд. Весь тяжёлый процессинг — в очередь.
Схема обработчика:
-
POST /bitrix/events → верификация подписи → положить в очередь → ответить 200
- Воркер → достать из очереди → обработать → обновить данные
Безопасность
Верификация входящих запросов от Битрикс24: в заголовках или теле передаётся auth[application_token] — это статический токен вашего приложения из настроек в partner.bitrix24.ru. Проверяйте его на каждый incoming запрос. Для webhook'ов из event.bind тело содержит auth[application_token] — то же самое. Подробнее — в документации REST API.
Как мы работаем
- Анализ требований и подготовка ТЗ (до 3 дней).
- Проектирование архитектуры: схема БД, OAuth-флоу, контракты API (5 дней).
- Разработка MVP: базовый функционал, iframe, чтение CRM (2–3 недели).
- Тестирование на реальных порталах с нагрузкой до 500 инсталляций (1 неделя).
- Подготовка к модерации: оформление карточки, написание документации, финальное тестирование (3–5 дней).
Что входит в разработку?
Мы передаём полный пакет: исходный код на PHP 8.1+, миграции базы данных, инструкцию по деплою, скрипты для кэширования, документацию по всем handler'ам (в среднем 30 страниц). Обучаем вашу команду работе с приложением. После публикации предоставляем месяц гарантийной поддержки. Свяжитесь с нами для оценки вашего проекта — мы подготовим архитектуру и точные сроки.
Сроки разработки
| Объём |
Срок |
| Базовое iframe-приложение, чтение данных CRM |
3–5 недель |
| Приложение с двусторонней синхронизацией и webhook'ами |
7–11 недель |
| Мультифункциональное приложение с несколькими placements и собственным UI |
12–18 недель |
| Готовность к публикации (тестирование, оформление карточки, прохождение модерации) |
+3–5 недель к любому варианту |
Наши инженеры имеют сертификаты Битрикс и многолетний опыт в разработке приложений для маркетплейса. Закажите оценку вашего проекта — мы ответим в течение 24 часов.
Разработка маркетплейсов на 1С-Битрикс: как преодолеть ограничения стандартной архитектуры
Таблица b_sale_order и связанные с ней b_sale_basket не рассчитаны на мультивендорность из коробки. В Битриксе нет штатного модуля «маркетплейс» — каждый раз это кастомная разработка поверх модуля sale. Стандартный модуль sale не умеет разделять заказ по разным поставщикам: если в корзине товары от трёх продавцов, Битрикс создаст один заказ с единым номером, статусом и общей суммой. Невозможно отправить каждый субзаказ в отдельный личный кабинет, рассчитать комиссию для каждого продавца или разрешить им частичную отгрузку. Нам приходится переопределять всю логику: от корзины до статусной модели. Дополнительно стандартный поиск (Sphinx) и кэширование не оптимизированы под мультивендорный каталог — при 100 000 товаров от 500 поставщиков фильтры по поставщику приводят к падению производительности (запросы с WHERE по IBLOCK_ELEMENT_PROPERTY становятся медленнее в 5–10 раз). Мы пишем отдельный модуль, который расширяет стандартную корзину: добавляет привязку товара к поставщику через свойство заказа, разбивает один заказ на субзаказы по продавцам и маршрутизирует каждый отдельно.
Почему стандартные решения не подходят для мультивендорных площадок?
Модели маркетплейсов
Классический маркетплейс — оператор не держит склад. Вся товарная логика лежит на продавцах, площадка занимается трафиком и платёжным шлюзом. Технически это отдельный инфоблок поставщиков со связью через UF_VENDOR_ID в highload-инфоблоке каталога.
Гибридная модель — оператор продаёт наравне с внешними поставщиками. Главная боль: ранжирование в каталоге. Если поставщики видят, что карточки площадки всегда выше — уходят. Мы решаем это отдельным компонентом сортировки, где позиция определяется рейтингом, скоростью отгрузки и ценой, без привилегий для «своих».
Маркетплейс услуг — заявки, тендеры, эскроу. Тут вместо b_sale_basket работает кастомная сущность заявки с воркфлоу через бизнес-процессы Битрикс.
B2B-маркетплейс — договоры, акты сверки, кредитные линии, EDI. Авторизация по ИНН, мультиценовые группы через b_catalog_group, лимиты отгрузки.
Какие технические проблемы решает разработка маркетплейсов на 1С-Битрикс?
Модели монетизации
| Модель |
Как реализуем |
Где чаще встречается |
| Комиссия с продаж |
Обработчик OnSaleOrderComplete, расчёт по категории и статусу продавца |
Универсальная |
| Подписка |
Кастомный модуль с cron-задачей и списанием через sale.paysystem |
B2B-площадки |
| Листинговые сборы |
Счётчик в OnAfterIBlockElementAdd |
Доски объявлений |
| Продвижение |
Промо-слоты через отдельный highload-инфоблок |
Дополнительный доход |
| Фулфилмент |
Интеграция с WMS через REST |
Площадки с логистикой |
Что включает кабинет продавца?
Кабинет — сердце маркетплейса. Неудобный кабинет = пустая площадка. Стандартного решения нет, пишем с нуля на компонентах Битрикс.
- Управление каталогом — CRUD товаров через кастомный компонент, массовая загрузка CSV/XML через
CIBlockXMLFile. Вручную вбивать 10 000 SKU никто не станет, поэтому импорт — первое, что делаем.
- Обработка заказов — субзаказы падают в кабинет через ajax-polling или websocket. Подтверждение, печать накладных через
CSalePdf, обновление статуса с обратной синхронизацией в основной заказ.
- Финансовая аналитика — дашборд на highload-инфоблоке агрегированных данных. Выручка, комиссии, выплаты — детализация по товарам и периодам. Продавец видит, что продаётся, а что просто занимает витрину.
- Настройки доставки — собственные тарифы продавца, привязка к
sale.delivery.handler.
- Коммуникация — встроенный чат без раскрытия контактов. Реализуем через модуль
im или кастомную таблицу сообщений.
- Акции — скидки, промокоды через
b_sale_discount с фильтром по vendor_id.
Модерация и контроль качества
Одна партия контрафакта убивает репутацию площадки. Поэтому модерация — обязательный слой.
- Модерация товаров — статус
ACTIVE='N' до прохождения проверки. Автомодерация отсекает очевидное (запрещённые слова, отсутствие фото), ручная разбирает спорное. Обработчик OnBeforeIBlockElementUpdate не даёт обойти.
- Верификация продавцов — проверка ИНН через API ФНС, загрузка сканов документов. Статусы: новый → проверенный → премиум. Каждый уровень открывает лимиты по количеству товаров и комиссиям.
- Рейтинговая система — не просто звёзды. Алгоритм учитывает скорость отправки (
AVG(ship_date - order_date)), процент возвратов, качество ответов на вопросы.
- Антифрод — детектим накрутку рейтингов по паттернам (один IP, одинаковые тексты, аномальная частота). Дублирование аккаунтов ловим по ИНН и банковским реквизитам.
- Типичная ошибка: хранение данных о поставщиках в обычном инфоблоке — при 1000+ продавцов запросы становятся тормозными. Используйте highload-инфоблоки.
Как устроена система выплат продавцам?
Финансовый модуль — то, ради чего продавцы приходят на площадку.
- Расчёт комиссии — обработчик на смену статуса заказа. Комиссия зависит от категории, статуса продавца, текущих условий. Хранится в отдельной таблице
vendor_transactions.
- Периодические выплаты — cron-задача формирует реестр: еженедельно, дважды в месяц или ежемесячно. Минимальная сумма выплаты, холдирование до подтверждения получения.
- Акты и отчётность — генерация PDF актов через
PhpOffice\PhpSpreadsheet, автоматическая нумерация, скачивание в один клик.
- Холдирование — деньги удерживаются до получения товара. Снижает споры и возвраты.
- Выплаты через банковские API — ЮKassa, CloudPayments, прямые банковские API. Продавец получает деньги без звонков и напоминаний.
- Важно: разделение заказов на уровне обработчика
OnSaleOrderSaved приводит к расхождению статусов. Разделяйте на этапе корзины.
- Ручная фискализация каждого субзаказа нарушает 54‑ФЗ. Используйте единый чек с признаком «агент». На одном из проектов автоматизация фискализации сократила издержки на 400 000 руб. ежемесячно. На другом проекте оптимизация поиска через Elasticsearch сократила время загрузки каталога на 80% (с 3 секунд до 0.6 секунды).
Как мы строим архитектуру маркетплейса
- Определение бизнес-модели — выбираем тип маркетплейса и схему монетизации.
- Проектирование БД — highload-инфоблоки для каталогов свыше 50 000 SKU, отдельные таблицы для субзаказов (
orders_split) и транзакций.
- Разработка ядра — создаём модуль
marketplace.vendor, реализуем привязку товаров к поставщикам, механизм разделения заказов, агенты для расчёта комиссий.
- Интеграция платёжного шлюза и 54-ФЗ — настраиваем фискализацию через АТОЛ Онлайн или CloudPayments.
- Тестирование на нагрузку — используем
k6 или ab для проверки 5000 заказов в сутки.
Типичные ошибки при разработке маркетплейсов на Битрикс
- Хранение поставщиков в обычном инфоблоке — приводит к тормозам при >1000 записей. Используйте highload-инфоблоки.
- Разделение заказов после сохранения — нарушает статусную модель. Разделяйте на этапе корзины.
- Ручная фискализация каждого субзаказа — нарушает 54-ФЗ. Фискализируйте единым чеком с признаком агента.
- Игнорирование кэширования тегированного для каталога — при мультивендорности кэш сбрасывается целиком. Настраивайте теги по
vendor_id.
Технологический стек
- 1С-Битрикс «Бизнес» или «Энтерпрайз» — модуль
sale + catalog как фундамент. Мультивендорная обвязка — кастомные модули.
- Highload-инфоблоки — каталоги свыше 100 000 SKU. Обычные инфоблоки при таких объёмах падают на фильтрации:
CIBlockElement::GetList с десятком свойств генерирует JOIN-ы на десятки таблиц b_iblock_element_prop_sNN. Highload решает это плоской структурой.
-
Elasticsearch — полнотекстовый поиск. Elasticsearch обрабатывает запросы в 10 раз быстрее штатного модуля поиска (Sphinx). Пользователь пишет «кроссовки найки» — находит «Nike кроссовки».
- Очереди — импорт каталогов, расчёт выплат, генерация отчётов. Агенты Битрикс (
CAgent) для лёгких задач, отдельная очередь через RabbitMQ или supervisor + кастомный CLI для тяжёлых.
Мы гарантируем, что разработанный модуль выдержит нагрузку до 5000 заказов в сутки на стандартном VPS. Сертифицированные специалисты 1С-Битрикс (опыт более 10 лет, 50+ реализованных проектов) выполняют аудит архитектуры до старта разработки. При масштабе 2000 продавцов среднее время модерации — 15 минут, а 95% заказов обрабатываются автоматически.
Отраслевые маркетплейсы
Каждая ниша — свои грабли:
- Стройматериалы — расчёт доставки крупногабарита. Паллеты, тоннаж, подъём на этаж. Обычный калькулятор доставки не справляется, пишем кастомный
sale.delivery.handler.
- Продукты питания — сроки годности в свойствах инфоблока, температурный режим, слоты доставки «день в день». Ошибка в логистике = списание.
- Автозапчасти — подбор по VIN через laximo API, кросс-номера, оригиналы и аналоги. Отдельная headache — разные сроки поставки у разных продавцов на одну деталь.
- Одежда — размерные сетки (EU/US/RU), высокий процент возвратов. Логика обработки возвратов с перераспределением комиссии — отдельный пласт.
- Промоборудование — B2B с тендерами, запросами КП. Карточка товара с 50+ параметрами в табличном виде.
Сроки и этапы
Пытаться запустить всё сразу — надёжный способ не запустить ничего.
| Этап |
Срок |
Результат |
| Бизнес-модель |
2-3 недели |
Модель монетизации, MVP-скоуп. Отсекаем 80% хотелок, которые не нужны на старте. |
| Проектирование |
3-4 недели |
UX, прототипы витрины и кабинетов, архитектура БД. |
| MVP |
2-3 месяца |
Каталог, регистрация продавцов, заказы, базовая модерация. Первые реальные продажи. |
| Пилот |
2-3 недели |
Первые продавцы, тестовые покупки, нагрузочное тестирование через ab или k6. |
| Масштабирование |
постоянно |
Новые фичи по фидбеку, оптимизация запросов, горизонтальное масштабирование. |
MVP за 3-4 месяца. Полнофункциональная платформа — 6-12 месяцев итеративной разработки.
Что входит в работу
- Документация: архитектурная схема, описание API, инструкции для продавцов.
- Доступы: репозиторий с кодом, тестовый стенд, админка.
- Обучение: две сессии для администраторов и менеджеров.
- Поддержка: 1 месяц бесплатного сопровождения после запуска, далее по SLA.
- Гарантия на разработанные модули — 12 месяцев.
Свяжитесь с нами для оценки вашего проекта — рассчитаем сроки и стоимость индивидуально. Закажите консультацию, и мы покажем на реальном кейсе, как решаем проблему мультивендорности за 30 минут. Получите детальный план разработки вашего маркетплейса уже сегодня.