ФиксИнтернет-магазин на 1С-Битрикс под ключ за 30 дней по фиксированной цене

Антипаттерны в архитектуре интернет-магазина

Антипаттерны в архитектуре интернет-магазина на 1С-Битрикс: правки ядра, логика в шаблонах, запросы в цикле

Магазин запустился, продаёт, всех устраивает. А через год каталог вырос, трафик поднялся — и сайт начал тормозить, обновления стали страшными, а любая доработка превращается в лотерею «что сломается на этот раз». Знакомо? Чаще всего дело не в платформе, а в архитектурных решениях, которые поначалу работали, но были антипаттернами — заложенными на старте минами замедленного действия.

В этой статье разберём типовые антипаттерны в архитектуре интернет-магазина на 1С-Битрикс: правки ядра, бизнес-логику в шаблонах, запросы в цикле, игнорирование кэша и версионирования. Для каждого — почему это плохо и как правильно. Цель не пристыдить, а дать карту грабель, на которые не стоит наступать. Разбор и исправление таких проблем — это наш аудит и оптимизация решения на 1С.

Коротко

  • Антипаттерн опасен тем, что поначалу работает, а расплата приходит при росте трафика, каталога и команды.
  • Правки ядра и логика в шаблонах убивают обновляемость и переиспользование — выносите доработки в модули и события.
  • Запросы в цикле (N+1) и отсутствие кэша роняют скорость на большом каталоге.
  • Разгребать накопленное нужно итеративно, по приоритету влияния, под прикрытием бэкапов и тестов.

Что такое антипаттерн и чем он опасен

Антипаттерн — это типовое решение, которое выглядит рабочим и даже удобным в моменте, но на дистанции создаёт больше проблем, чем решает. Его коварство именно в отложенности расплаты: магазин запускается, работает, продаёт, и кажется, что всё сделано правильно.

Проблемы всплывают позже и по нарастающей. Вырос каталог — вылезли тяжёлые запросы. Понадобилось обновиться — мешают правки ядра. Пришёл второй разработчик — начались конфликты из-за отсутствия версионирования. Каждый антипаттерн — это технический долг, проценты по которому платятся скоростью, стабильностью и стоимостью поддержки.

Правки ядра платформы

Классика жанра — поправить файл прямо в папке bitrix, чтобы «быстро сделать как надо». Работает ровно до первого обновления платформы, которое затрёт правку и, в худшем случае, сломает магазин.

Ядро 1С-Битрикс обновляется целиком, и любые изменения в нём не переживают апдейт. Правильные способы дорабатывать платформу существуют и хорошо документированы:

Как аккуратно упаковать доработки в переживающий обновления код, мы разбираем в статье про разработку модуля под 1С-Битрикс.

Слои приложения на 1С-Битрикс (D7) ЗапросбраузерКомпонентшаблон, логикаAPI-ядро D7бизнес-логикаДанныеинфоблоки, БДСлои разделены: шаблон не лезет в базу напрямую, логика — в ядре D7
Схема: запрос обрабатывает компонент, бизнес-логика живёт в ядре D7, а данные — в инфоблоках. Чёткие слои держат код поддерживаемым и тестируемым.

Бизнес-логика в шаблонах

Второй распространённый антипаттерн — писать бизнес-логику прямо в template.php компонента. Посчитать цену, сходить в базу, принять решение о скидке — всё это оказывается вперемешку с версткой.

Проблема в том, что шаблон отвечает за вывод, а не за вычисления. Логика в шаблоне не переиспользуется, не тестируется и дублируется по разным шаблонам, где со временем расходится. Изменение бизнес-правила требует правок в куче мест, и что-то обязательно забывают.

Правильно: бизнес-логику выносят в отдельный слой — классы, модули, сервисы, — а шаблон делают тонким, отвечающим только за отображение готовых данных. Тогда правило меняется в одном месте и не ломает вёрстку.

Современный инструмент для такого слоя — D7 и ORM, о котором мы пишем в статье про D7 ORM в 1С-Битрикс: данные и логика работы с ними живут в классах, а не в шаблонах.

Запросы в цикле и проблема N+1

Убийца производительности номер один — запросы к базе в цикле. Выбрали список товаров, а потом в цикле по каждому лезете в базу за ценой, остатком, свойством. На десятке товаров незаметно, на тысячах — сайт встаёт.

Это классическая проблема N+1: один запрос на список плюс по запросу на каждый элемент. Число запросов растёт пропорционально числу элементов, и страница каталога генерирует их сотнями.

  1. Заметьте симптом. Профилирование показывает, что число запросов растёт вместе с числом товаров на странице.
  2. Выбирайте пакетно. Связанные данные (цены, остатки, свойства) берите одним запросом на весь список, а не по одному.
  3. Используйте возможности ORM. Ссылки и предзагрузка связанных сущностей вместо ручных запросов в цикле.
  4. Проверьте под объёмом. Тестируйте не на десяти, а на тысячах товаров — там антипаттерн виден.

Игнорирование кэша и композита

Магазин, который на каждый запрос заново собирает каталог из базы, обречён тормозить под нагрузкой. Отсутствие кэша — антипаттерн, особенно на витрине, где одни и те же страницы отдаются тысячам посетителей.

В 1С-Битрикс есть несколько слоёв ускорения, и их игнорирование — упущенная производительность:

Про то, как композит ускоряет витрину, мы подробно писали ранее, а инфраструктурную сторону скорости разбираем в статье про хостинг и инфраструктуру BitrixVM.

Кэширование персональных данных

Обратная крайность не менее опасна: закэшировать то, что кэшировать нельзя. Если в общий кэш страницы попадает цена конкретного клиента, его корзина или имя, эти данные покажутся другому посетителю. Это и утечка, и просто неверная выдача.

ДанныеКак отдавать
Каталог, категории, карточкиАгрессивный кэш, статика
Цена по группе клиентаДинамически, вне общего кэша
Корзина и профильТолько персонально, никогда в общий кэш
Остатки по складу клиентаДинамически или коротким персональным кэшем

Правило простое: статику кэшируем агрессивно, персональное отдаём динамически. Композитный сайт как раз строится на этом разделении — общий каркас из кэша, персональные блоки догружаются отдельно.

Правки на боевом без версионирования

Редактировать файлы прямо на боевом сервере, без Git и без истории изменений, — антипаттерн, который рано или поздно приводит к катастрофе. Потерянные правки, невозможность откатиться, конфликты между разработчиками, «а кто это менял и зачем».

Даже небольшой магазин выигрывает от нормального процесса:

Как выстроить такой процесс на 1С-Битрикс, мы разбираем в статье про CI/CD и деплой в 1С-Битрикс.

Свойства-свалки и плоская структура

Архитектурные антипаттерны есть и на уровне данных. Частый — валить разнородную информацию в одно текстовое свойство или в описание, вместо структурированных свойств инфоблока.

Последствия: по такому «свойству-свалке» не работает умный фильтр, невозможно сравнение, ломается поиск. Плоская структура без нормальной иерархии разделов и типов свойств делает каталог неуправляемым при росте. Правильно — продуманная структура инфоблоков: отдельные свойства под каждую характеристику, справочники для перечислимых значений, разумная иерархия разделов. Тогда каталог масштабируется и участвует в фильтрации, а не только показывает текст.

Синхронные тяжёлые операции в запросе

Ещё один антипаттерн — выполнять тяжёлую работу прямо в пользовательском запросе. Отправка письма, генерация большого документа, вызов внешнего API, массовый пересчёт — всё это в момент клика заставляет покупателя ждать и роняет страницу при сбое внешнего сервиса.

Безопасную работу с внешними вызовами и вебхуками мы разбираем в статье про REST, вебхуки и безопасность в 1С-Битрикс.

Как выявлять антипаттерны

Симптомы чувствуются в эксплуатации, а причины вскрывает аудит. На что смотреть:

Точную картину даёт технический аудит кода и инфраструктуры: он находит конкретные антипаттерны и оценивает их влияние, превращая расплывчатое «сайт тормозит» в список приоритетных проблем.

Как разгребать накопленное

Если антипаттерны уже накопились, соблазн переписать всё с нуля велик — и обычно ошибочен. Рефакторинг ведут итеративно.

  1. Приоритет по влиянию. Сначала то, что бьёт по деньгам и стабильности: тяжёлые запросы, правки ядра, отсутствие бэкапов.
  2. Прикрытие бэкапами. Прежде чем трогать, убедитесь, что есть рабочие резервные копии и откат.
  3. Маленькими шагами. Выносите логику из шаблонов, чините запросы, настраивайте кэш по частям.
  4. Проверка после каждого шага. Убедились, что магазин работает, — двигаетесь дальше.
  5. Не всё сразу. Работающий магазин важнее идеальной чистоты; чините то, что реально мешает.

Чек-лист здоровой архитектуры

  1. Ядро не тронуто. Доработки живут в событиях, модулях и своих шаблонах, обновления безопасны.
  2. Шаблоны тонкие. Бизнес-логика вынесена в отдельный слой, шаблон только отображает.
  3. Нет запросов в цикле. Связанные данные выбираются пакетно, N+1 отсутствует.
  4. Кэш настроен осознанно. Статика кэшируется, персональное отдаётся динамически.
  5. Композит включён. Витрина использует композитный сайт для мгновенной отдачи.
  6. Версионирование есть. Код в Git, деплой предсказуем, откат возможен.
  7. Структура данных продумана. Характеристики в свойствах инфоблоков, а не в свалке.
  8. Тяжёлое — в фоне. Долгие операции и внешние вызовы вынесены из пользовательского запроса.

Вывод

Антипаттерны опасны своей отложенностью: они не мешают на старте и потому легко проникают в архитектуру магазина, чтобы выстрелить позже — при росте каталога, трафика и команды. Правки ядра ломают обновления, логика в шаблонах делает доработки дорогими, запросы в цикле и отсутствие кэша роняют скорость, а работа на боевом без версионирования грозит потерей данных.

Хорошая новость в том, что все эти грабли известны и обходятся стандартными средствами платформы: события и модули вместо правок ядра, тонкие шаблоны, пакетные выборки, осознанный кэш, композит и нормальный процесс разработки. А если антипаттерны уже накопились — их разгребают итеративно, по приоритету влияния, а не героическим переписыванием всего сразу. Здоровая архитектура — это не роскошь, а то, что делает магазин быстрым, обновляемым и дешёвым в поддержке на годы вперёд.

Частые вопросы

Что такое антипаттерн и почему это важно для магазина?

Антипаттерн — это типовое, на первый взгляд рабочее решение, которое на дистанции создаёт больше проблем, чем решает. В интернет-магазине антипаттерны проявляются как медленный сайт, невозможность обновиться, хрупкость при нагрузке и дорогая поддержка. Опасны они именно тем, что поначалу работают: магазин запускается, продаёт, а расплата приходит позже — при росте трафика, каталога или команды.

Почему нельзя править ядро 1С-Битрикс напрямую?

Потому что при первом же обновлении платформы ваши правки в файлах ядра будут затёрты, а магазин может сломаться. Ядро в папке bitrix обновляется целиком, и любые изменения в нём не переживают апдейт. Правильный путь — события, свои модули, кастомизация шаблонов компонентов копированием в свой шаблон. Тогда доработки живут отдельно от ядра и переживают обновления.

Чем плоха бизнес-логика в шаблонах компонентов?

Шаблон отвечает за вывод, а не за вычисления. Когда в template.php считают цены, ходят в базу и принимают бизнес-решения, логику невозможно переиспользовать, тестировать и менять без риска сломать вёрстку. Она дублируется по разным шаблонам и расходится. Правильно — выносить бизнес-логику в отдельный слой (классы, модули, сервисы), а шаблон оставлять тонким и отвечающим только за отображение.

Что такое проблема N+1 запроса и как её заметить?

Это когда вместо одного запроса на список делается один запрос на список плюс по запросу на каждый элемент — в цикле. На двадцати товарах незаметно, на двух тысячах сайт встаёт. Заметить помогает профилирование и просмотр количества запросов на странице: если оно растёт пропорционально числу элементов, у вас N+1. Лечится выборкой связанных данных пакетно, а не по одному в цикле.

Кэш — это ведь просто «включить и забыть»?

Нет. Отсутствие кэша — антипаттерн, но и бездумный кэш — тоже. Проблемы возникают, когда кэшируют персональные данные (цену клиента, корзину) вместе со статикой, или когда кэш не сбрасывается при изменении данных. В 1С-Битрикс есть слои — кэш компонентов, управляемый кэш, композитный сайт — и их нужно применять осознанно: статику кэшировать агрессивно, персональное отдавать динамически.

Обязательно ли версионирование и CI/CD для магазина?

Для любого проекта сложнее визитки — да. Правки прямо на боевом сервере без системы контроля версий — это антипаттерн, ведущий к потере изменений, невозможности откатиться и конфликтам в команде. Даже небольшой магазин выигрывает от Git и предсказуемого деплоя: понятно, что и когда менялось, можно откатить неудачную правку, несколько разработчиков не затирают друг друга.

Как понять, что в моём магазине есть архитектурные проблемы?

По симптомам: сайт тормозит под нагрузкой, обновление платформы страшно делать, простая доработка требует правок в десяти местах, на боевом периодически что-то ломается после релиза. Точную картину даёт технический аудит: он показывает правки ядра, тяжёлые запросы, отсутствие кэша и другие антипаттерны. Симптомы чувствуются в поддержке и скорости, а причины вскрывает аудит кода и инфраструктуры.

Что делать, если антипаттерны уже накопились?

Не переписывать всё разом, а разгребать по приоритету влияния. Сначала — то, что бьёт по деньгам и стабильности: тяжёлые запросы, правки ядра, мешающие обновлениям, отсутствие бэкапов. Затем — постепенный вынос логики из шаблонов, настройка кэша, внедрение версионирования. Рефакторинг ведут итеративно, под прикрытием тестов и бэкапов, чтобы не сломать работающий магазин в погоне за чистотой.

Поделиться:

Магазин тормозит, а обновления страшно делать?

Проведём технический аудит архитектуры на 1С-Битрикс, найдём антипаттерны и исправим их по приоритету влияния. Рассчитаем работу по вашему проекту.

Игорь Воскресенский

Команда B2Bsite. С 2014 года разрабатываем интернет-магазины и порталы на 1С-Битрикс: проектируем обновляемую архитектуру, оптимизируем производительность и исправляем накопленный технический долг.

← Все статьи блога