Архитектура проектов на 1С-Битрикс
Неправильно выбранный тип хранения — и каталог на 80К товаров отдаёт страницу за 5 секунд. Не предусмотрели вынос сессий — и при добавлении второго веб-сервера пользователи начинают «вылетать» из корзины. Архитектурные ошибки в Битриксе не прощаются — они накапливаются и через год превращаются в капитальный рефакторинг.
Инфоблоки vs Highload-блоки: решение, которое нельзя отменить
Это первое и самое дорогое архитектурное решение. Миграция с инфоблоков на Highload потом — это переписывание всех компонентов, шаблонов, фильтров и поисковых индексов.
Обычные инфоблоки работают через таблицы b_iblock_element и b_iblock_element_property. Свойства хранятся в EAV-модели — каждое значение в отдельной строке b_iblock_element_property. При 50 свойствах и 100К элементов получаем 5 миллионов строк в одной таблице. MySQL начинает задыхаться на JOIN-ах при фильтрации.
Инфоблоки хороши для:
- Контента до 10-50К элементов — статьи, новости, акции
- Сущностей, где нужен визуальный редактор и SEO-модуль
- Элементов с наследованием свойств от разделов
Highload-блоки — плоские таблицы. Одна сущность — одна таблица с колонками. Никакого EAV. Фильтрация по индексированным колонкам работает на порядок быстрее. Каталог на 200К товаров с фасетным индексом (b_catalog_sm_*) отдаёт фильтр за 50ms вместо 3 секунд.
Когда Highload обязателен:
- Каталоги > 50К товаров
- Справочники, которые дёргаются при каждой загрузке (города, бренды, характеристики)
- Данные с частой записью — логи, заявки, история
- Сущности, где нужны прямые SQL-запросы и агрегации
D7 ORM и свои таблицы — для бизнес-логики, которая не лезет в модель инфоблоков. Связи many-to-many, вычисляемые поля, кастомные агрегации. Bitrix\Main\ORM\Data\DataManager даёт типобезопасность, валидацию и систему событий. Но придётся писать админку с нуля.
| Критерий | Инфоблоки | Highload | D7 ORM |
|---|---|---|---|
| Объём данных | До 50K | 50K-10M+ | Любой |
| Скорость фильтрации | Деградирует с ростом | Стабильная | Максимальная |
| Гибкость структуры | Высокая (EAV) | Средняя (фиксированная) | Полная |
| Админка из коробки | Да | Да | Нет |
| Поддержка SEO-модуля | Да | Ограниченная | Нет |
Масштабирование: как не лечь в Чёрную пятницу
Горизонтальное масштабирование — тема, на которой горят 90% проектов. Потому что думают о нём, когда сайт уже лежит.
Первый шаг — сессии из файлов в Redis. Без этого второй веб-сервер бесполезен: пользователь авторизовался на сервере A, следующий запрос уходит на сервер B, сессия не найдена — разлогин. В .settings.php:
'session' => ['value' => ['mode' => 'redis', 'host' => '127.0.0.1', 'port' => 6379]]
Далее:
- nginx upstream или HAProxy раскидывает запросы. Модуль «Веб-кластер» Битрикс поддерживает кластеризацию, но нужно лицензия «Бизнес» или выше
-
CDN для статики —
/upload/, JS, CSS. Сервер перестаёт тратить ресурсы на отдачу картинок -
Репликация MySQL — master для записи, slave для чтения. Битрикс поддерживает до 9 slave-соединений через настройку в
.settings.php. Но есть лаг репликации — товар добавили, а на slave он появится через 0.5-2 секунды
Вертикальное масштабирование — дешевле и быстрее на старте:
-
EXPLAINна каждый тяжёлый запрос. Один составной индекс наb_iblock_element_property(IBLOCK_PROPERTY_ID, VALUE) ускоряет фильтрацию в 10 раз - Многоуровневый кэш: управляемый кэш Битрикс → memcached → композитный сайт. Проверяем
hit rateв панели «Производительность» — если ниже 90%, что-то не так - OPcache с JIT на PHP 8.1+ — бесплатное ускорение на 15-30%
Микросервисы поверх монолита
Битрикс — монолит, и это нормально. Ломать его на микросервисы — безумие. А вот вынести тяжёлые процессы — правильный ход.
Импорт/экспорт — самая частая боль. Обмен с 1С через CIBlockCMLImport блокирует таблицы инфоблоков на время импорта. 100К товаров — это 20-40 минут, когда фильтрация на сайте тормозит. Решение: вынести импорт в отдельный воркер через RabbitMQ, писать в промежуточную таблицу, потом атомарно переключать.
-
Поиск — Elasticsearch вместо штатного
search.title. Полнотекстовый и фасетный поиск, автодополнение, исправление опечаток. Нагрузка с MySQL снимается полностью -
Уведомления — push, SMS, email через очередь.
CEvent::Send()синхронный — пока письмо не уйдёт, пользователь ждёт ответ сервера. Очередь решает это - Генерация отчётов — PDF, Excel на больших объёмах. В отдельный процесс, результат — ссылка на скачивание
API-first: REST, GraphQL, вебхуки
REST API Битрикса (/rest/) покрывает CRM, задачи, диск, но не покрывает каталог и инфоблоки в нужном объёме. Для SPA на React/Vue приходится писать свои эндпоинты через Bitrix\Main\Engine\Controller.
- GraphQL — для мобильных приложений, где трафик дорогой. Клиент запрашивает только нужные поля
- Вебхуки — событийная модель: новый заказ → POST на внешний URL. Не нужно опрашивать API каждые 5 минут
-
Версионирование —
/api/v1/,/api/v2/. Без этого обновление API ломает всех потребителей одновременно - OpenAPI/Swagger — автогенерация документации. API без документации через месяц не помнит даже автор
Документация: ADR вместо Word-файлов
- ADR — Architecture Decision Records. Короткий файл: контекст, решение, последствия. «Почему выбрали Highload для каталога?» — через год новый разработчик откроет ADR и поймёт за 5 минут, вместо того чтобы гадать три дня
- Диаграммы — серверы, потоки данных, точки интеграций. PlantUML или Mermaid, хранятся в репозитории рядом с кодом
-
ER-диаграммы — инфоблоки, свойства, связи. Без схемы даже автор через полгода не вспомнит, почему свойство
LINKED_PRODUCTSссылается на другой инфоблок через привязку, а не через Highload-справочник - Runbook — деплой, откат, масштабирование, действия при аварии. Потому что авария случится в субботу ночью, когда архитектора нет на связи
Техдолг: старое ядро, прямые SQL, логика в шаблонах
Техдолг в Битриксе специфичен. Три главных источника:
-
Старое ядро вместо D7 —
CIBlockElement::GetList()вместо\Bitrix\Iblock\Elements\ElementTable::getList(). Старое ядро не поддерживает ORM-фичи, медленнее, и Битрикс рано или поздно его задепрекейтит -
Прямые SQL в шаблонах компонентов —
$DB->Query("SELECT...")прямо вtemplate.php. Переносим в сервисные классы, заменяем на ORM -
Бизнес-логика в
result_modifier.php— файл, который должен готовить данные для шаблона, а не считать скидки и проверять права доступа
Подход: PHPStan level 5+ для выявления проблем, матрица «влияние на бизнес / стоимость фикса», поэтапный рефакторинг по спринтам. Не всё сразу — но тренд должен быть нисходящим.
Наш процесс
- Сбор требований (3-5 дней) — нагрузка, планы роста, интеграции, бюджет
- Проектирование (1-2 недели) — структура данных, схема интеграций, ADR по ключевым решениям
- Прототипирование (1 неделя) — нагрузочные тесты на реальных объёмах. Highload-блок с 200К записей и 30 свойств — выдержит ли фильтрация?
- Документирование (3-5 дней) — диаграммы, runbook, спецификации API
- Ревью (2-3 дня) — внутреннее, потом с заказчиком
На выходе — архитектурный документ, на который можно опираться при разработке, оценке сроков и масштабировании.







