Перейти к содержанию

Лучшие практики Bitrix Framework

Собрано из курса «Разработчик Bitrix Framework» и официальной документации. Каждый пункт ссылается на страницы этой базы знаний.

Процессы и организация проекта

  1. Никогда не правьте код на боевом сайте. Ведите разработку на копии или используйте маркер «Установка для разработки», всегда имейте доступ по FTP/SSH на случай, если админка станет недоступна, держите свежий бэкап наготове. (курс)
  2. Используйте систему контроля версий, даже если только для файлов проекта. (курс)
  3. Сначала формализуйте требования, потом код. Просмотрите все случаи использования изменяемого блока и только после этого выбирайте инструмент. (курс)
  4. Весь свой код — в папку /local/ (шаблоны, компоненты, модули, php_interface). Она не перезаписывается при обновлениях и отделяет кастомизацию от ядра. (курс, документация)
  5. Не меняйте код ядра/bitrix/modules/ и /bitrix/components/bitrix/. Изменения затрутся при обновлении, лишают техподдержки и ломают систему. (курс)

Кастомизация: порядок выбора средств

От простого к сложному — останавливайтесь на первом работающем варианте (курс):

  1. Редактирование шаблона сайта и CSS.
  2. Редактирование страницы (осторожно: PHP-код на странице легко сломать визуальным редактором).
  3. Шаблон компонента, result_modifier.php, component_epilog.php. (курс: result_modifier.php)
  4. Обработчики событий. (курс)
  5. Кастомизация компонента, свой компонент или модуль — последний вариант. (курс: свой компонент, курс: свой модуль, документация)

Свои компоненты и шаблоны размещайте в собственном пространстве имён — пространство bitrix затирается обновлениями.

Работа с данными: ORM и API

  1. Не обращайтесь к БД напрямую — работайте через API и ORM: структура таблиц меняется между версиями, API сохраняет обратную совместимость. Прямые запросы рискуют целостностью данных. (курс)
  2. Новый код — на ядре D7 (ORM), а не на устаревших конструкциях GetList там, где есть ORM-сущность. (курс: ядро D7, документация: ORM)
  3. Выбирайте только нужные поля в select, ограничивайте выборки фильтрами и постраничностью — лишние поля и PROPERTY_* тормозят страницу и раздувают кэш. (документация: производительность инфоблоков, курс)
  4. Используйте объекты и коллекции ORM (save, fill, wakeUp, групповые действия) вместо ручной сборки запросов. (курс: объекты, курс: коллекции, документация)
  5. Фильтры ORM вместо конкатенации SQL. Если SQL неизбежен — только через подготовленные запросы/SqlExpression, никогда не подставляйте пользовательский ввод в строку запроса. (курс: фильтр ORM, документация: SQL-инъекции, документация: query builder)
  6. Связи между сущностями описывайте в ORM (1:1, 1:N, N:M), а не джойните вручную. (курс, документация)
  7. Транзакции — для операций, которые должны выполняться атомарно. (документация)

Инфоблоки

  1. Понимайте архитектуру инфоблоков (версии хранения свойств 1.0/2.0) перед тем как проектировать структуру каталога. (документация, курс)
  2. Используйте ORM-интеграцию инфоблоков (ElementTable-классы, генерация ORM-классов) вместо CIBlockElement::GetList в новом коде. (курс: ORM в инфоблоках, курс: генерация классов)
  3. Следите за типовыми проблемами производительности инфоблоков заранее, а не когда проект «встал». (документация)

Компоненты и шаблоны

  1. Разделяйте логику и представление: логика — в компоненте, вывод — в шаблоне. Не пишите HTML внутри PHP-логики. (курс)
  2. result_modifier.php — для подготовки данных шаблона; component_epilog.php — для того, что должно выполниться независимо от кэша (установка заголовков, счётчики). (курс)
  3. Штатные шаблоны не править — копировать и кастомизировать в своём пространстве имён. (курс)
  4. При создании своих компонентов сразу закладывайте кэширование и тегированный кэш. (курс: кэширование в своих компонентах, документация: компоненты)

Кэширование

  1. Не полагайтесь на автокэширование — указывайте время кэширования компонентов осознанно, исходя из периодичности обновления данных. Автокэш включайте перед сдачей проекта, на разработке держите выключенным. (курс: кэширование компонентов, курс: junior)
  2. Кэшируйте только нужные данные — избыточный кэш не ускоряет, а замедляет. (курс)
  3. Используйте тегированный кэш (cache.dependencies) для точечного сброса кэша при изменении данных, а не полную очистку. (курс: тегированный кэш, документация: кэширование)
  4. Сброс кэша по событию: меню и списки сбрасывайте через обработчики изменения элементов, а не по таймеру. (курс: проблемы кэширования меню, курс: примеры)
  5. Композитный сайт — для высоконагруженных публичных страниц. (документация)

События и агенты

  1. События — основной механизм расширения штатного поведения: обработчики не ломаются обновлениями, в отличие от правки ядра. (курс, документация)
  2. Агенты — для периодических фоновых задач; тяжёлые агенты переводите на cron, не на хиты пользователей. (курс, документация: фоновые задачи)
  3. Не плодите в агентах и событиях тяжёлые запросы без кэша — они выполняются на каждом хите/тике.

Производительность

  1. Оптимизируйте запросы к БД: индексы, ограничение выборок, постраничка для больших массивов. (курс: оптимизация запросов, курс: постраничка для массивов, документация)
  2. Ищите узкие места инструментами (SQL-трекер, монитор производительности, отладка), а не догадками. (документация: SQL-трекер, документация: отладка, курс: как сделать сайт быстрым)
  3. Снижайте нагрузку через API и кэш, оптимизируйте JS. (курс: снижение нагрузки через API, курс: оптимизация JS)
  4. Для высоких нагрузок — репликация, кластер, шардирование. (документация, документация, курс: балансировка в кластере)
  5. Храните сессии правильно (hot/cold-режим, шифрованные cookie). (документация, курс: сессии и cookie)

Безопасность

  1. Фильтруйте и экранируйте весь пользовательский ввод — защита от XSS через санитайзер и экранирование вывода. (документация: XSS, документация: санитайзер)
  2. SQL-инъекции: только ORM/подготовленные запросы. (документация)
  3. CSRF/SSRF: проверка check_bitrix_sessid() для форм и действий, ограничение исходящих запросов. (документация)
  4. Проактивная защита и файрвол — включайте штатные механизмы, не изобретайте свои. (документация: проактивная защита, документация: файрвол)
  5. Права доступа — через штатную модульную систему прав, а не самодельные проверки. (документация)
  6. Безопасные cookie и сессии (HttpOnly, Secure, шифрование). (документация)
  7. Персональные данные: согласия, двухфакторная аутентификация для админки. (документация: согласие пользователя, документация: 2FA, курс: безопасная кастомизация)

Обновления, бэкапы, тестирование

  1. Регулярно устанавливайте обновления — это защита от уязвимостей; правильная кастомизация (пп. 4–5) делает обновления безболезненными. (курс, курс: обновление и бэкап)
  2. Резервные копии — не реже раза в день, с проверкой восстановления. (курс, документация: бэкап)
  3. Тестируйте доработки на копии перед переносом на боевой сайт. (курс: тестирование проектов)
  4. Следите за качеством в эксплуатации: логгер, монитор качества. (документация: логгер, документация: монитор качества)