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

Здесь я постараюсь не акцентировать внимание на стандартных «worst practice» при программировании на PHP, типа наплевательского отношения к выборам имен переменных и функций, излишних запросов к БД в цикле, отсутствия проверок пользовательских данных в формах, игнорирование комментариев и тому подобного. Я попытаюсь коснуться именно моментов, свойственных разработке на Битриксе, которые в последствии позволят избежать негодования и проклятий в ваш адрес от программиста, которому выпало сопровождать ваш код. И да, нередко этим программистом будете оказываться вы сами через год, или более, когда уже совершенно забудете, зачем вы вставляли сюда тот или иной костыль.
«Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте» (с) Джон Ф. Вудс
Первое, и самое, на мой взгляд, важное — ради всего святого, используйте папку local. Это просто жизненно необходимо при использовании системы контроля версий – все, что вам нужно – добавить в исключения папку /bitrix/. Всё. Далее практически вся разработка ведется только в ней. Это заметно упрощает поиск нужных файлов и компонентов в последствии, помогает не засорять репозиторий лишними файлами, да и вообще – приводит дерево проекта в более опрятный, «человеческий» вид.

Не модифицируйте ядро. Даже если вы уверены, что оно не будет обновляться. Даже если так быстрее. Даже если вам лень. Забудьте эту мысль, как страшный сон. Если необходимо изменить логику работы стандартного компонента – перенесите его в новое пространство имен /local/components/modify/ и работайте с ним. То же самое касается модулей, гаджетов и activities бизнес-процессов.

Не засоряйте файл init.php. Объединяйте функции для работы с каким-то конкретным модулем или функционалом в класс, весь этот класс записывайте в отдельный файл, а в init.php просто подключайте эти файлы и прописывайте обработчики событий. Мне встречались файлы init.php по 500Kb, где в кашу были смешаны функции, определение констант, классы и инициализация обработчиков. Разумеется, когда приходилось разбираться в этих файлах, я сыпал проклятиями на своих предшественников.

Следующий пункт не касается случая разработки готовых решений для Marketplace, когда целью ставится сделать максимально настраиваемый функционал из публичной части для конечного потребителя. Если вы работаете над конкретным проектом, по конкретному ТЗ – не стоит пытаться сделать унифицированный шаблон для компонента на все случаи жизни. Лично я придерживаюсь философии – лучше несколько простых шаблонов, использующихся для разных целей, чем один универсальный, но в котором сам черт потом ногу сломит. Разумеется, в каждом конкретном случае нужно отталкиваться от того, что есть – техзадание, варианты реализации и тому подобное, но забывать про «Бритву Оккама» все-таки не стоит. Как пример приведу один проект лизинговой компании, который мне довелось править. Сам проект, конечно, был реализован ужасно, на настоящий ужас был в страницах раздела каталога услуг. У каждого из пяти разделов была собственная верстка, на которых отличалось как положение блоков на странице, так и в принципе наличие некоторых из них. И для всех пяти страниц использовался один шаблон с кучей if-else, дублированием вызовов компонентов, подключением стилей и скриптов, которые, к тому же, периодически конфликтовали друг с другом. Как итог – огромный файл, в котором разобраться «без поллитры» было смерти подобно. Хотя, казалось бы, что мешало сделать 5 разных шаблонов и не создавать трудностей на ровном месте?

Используйте API. Не изобретайте велосипеды там, где это не нужно. Юзайте документацию – весь продукт довольно хорошо описан, а так же каждую функцию можно посмотреть детально на bxapi.ru.

Избегайте прямых запросов к базе. Это частный случай предыдущего пункта – используйте API. Необдуманные, незащищенные запросы могут привести к порче, утере или даже к компрометации данных.

Не используйте компоненты с ЧПУ из корня сайта. Последствия, как правило, довольно печальны, так как ЧПУ использует файл обработчика адресов, попытка использовать его из корня легко ломает вам адресацию других компонентов, а так же 404 страницы. Ничего страшного не будет, если статьи у вас будут адресоваться относительно папки /articles/, а товары относительно /catalog/.

Подключайте css и js с помощью API. До сих пор повсеместно встречаю подключение скриптов и стилей с помощью html-тегов. Используйте объект класса \Bitrix\Main\Page\Asset и функции addJs() и addCss(). Это позволит объединять файлы и, в последствии, кешировать их одним нажатием чекбокса в настройках главного модуля

Ну и напоследок, ошибка касается не только Битрикса, но уж больно часто я стал встречать проблемы, связанные с ней. Проверяйте на пустоту массив с результатами выборки. Как пример, последний раз встретился с данной проблемой при работе с одним интернет-магазином. Жалоба: страницы иногда грузятся по 16 секунд. С чем связано – не ясно. Методом проб и ошибок выяснил, что страницы грузятся неприлично долго только тогда, когда корзина пустая. Казалось, с чего бы? Как выяснилось, у корзины при наведении появлялось всплывающее окно, в котором отображались изображения товара, положенного в корзину. Ну что сделал предыдущий разработчик? Взял результат работы компонента «маленькая корзина» и в файле result_modifier.php сделал вызов GetList() товаров для выборки изображений с фильтром из массива ID товаров, потом из результатов выборки в массив соответствующего товара добавлял src изображения. В итоге, когда товаров в корзине не было, фильтр уходил пустой, и в выборку попадал ВЕСЬ каталог товаров. Ну а дальше цикл по каждому и… имеем то, что имеем. Ясно, что на этапе разработки при тестовых 15 товарах это было незаметно, и проблемы возникли уже в боевых условиях. Хотя, казалось бы, чего стоило поставить проверку на empty($arResult[‘ITEMS’])…

На этом я заканчиваю свой личный топ «worst practice», касательно разработки на Битрикс. Если хоть кому-то данная информация поможет избежать ошибок в будущем и улучшить свой стиль разработки, значит это было не зря.

Комментарии (20)


  1. IvanTheCrazy
    25.07.2018 23:17

    Всю статью можно сократить примерно так:
    Не надо разрабатывать проекты на битрикс


    1. leotsarev
      26.07.2018 00:03
      +2

      Пропущено тире или двоеточие:
      Как не надо разрабатывать проекты: на Битрикс


      1. IvanTheCrazy
        26.07.2018 00:06

        Ну да, так тоже можно :)


    1. Yaryj Автор
      26.07.2018 07:11
      +2

      Не хотите — не разрабатывайте, никто не заставляет. Однако продукт популярен, сайтов на нем множество и работы хватает, с этим поспорить трудно. Одним словом: не нравится — не ешь.


      1. IvanTheCrazy
        26.07.2018 08:23
        +4

        Популярный — это еще не значит «хороший и его нужно использовать». Это сборник того, как делать не нужно. Потом приходит человек после битрикса и плодит говнокод в нормальном проекте. Так что да, не ем (ел его полтора года — большей гадости не видел) и остальным пропагандирую чтобы не ели.


    1. UnknownUser
      26.07.2018 13:21

      Вы пропустили начало. Начинаться фраза должна так — «Если у вас руки не оттуда растут ...».
      На самом деле, советы довольно универсальны. Практически все что перечислено, с поправкой на специфику, есть в любом нормальном регламенте разработок для SAP, например ).


  1. Atomov
    26.07.2018 07:08

    Git позволяет игнорировать папку, но не игнорировать отдельные папки/файлы в ней.
    Стараться над проектом на Битрикс стоит, если надо будет работать с этим проектом в дальнейшем. А если это разовый заказ на фрилансе, то надо быстрее выполнить заказ и сдать, а что там под капотом заказчик не увидит.


    1. Yaryj Автор
      26.07.2018 07:16
      +2

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


    1. Akuma
      26.07.2018 11:56

      Походу мне всегда на доработку попадались именно такие проекты, которые заказчик не видел :)


    1. AnthonySoprano
      26.07.2018 13:21
      +2

      Git позволяет игнорировать любые файлы и папки, по маскам и по конкретным именам.


  1. usdglander
    26.07.2018 09:49
    +1

    Не используйте компоненты с ЧПУ из корня сайта. Последствия, как правило, довольно печальны, так как ЧПУ использует файл обработчика адресов, попытка использовать его из корня легко ломает вам адресацию других компонентов, а так же 404 страницы. Ничего страшного не будет, если статьи у вас будут адресоваться относительно папки /articles/, а товары относительно /catalog/.

    1. Объясните это seo-шникам.
    2. Разве в 2018 году в Битрикс ещё не завезли нормальную маршрутизацию?


    1. Yaryj Автор
      26.07.2018 13:22

      1. Объясняю — не понимают :)
      2. Не понял вопроса


    1. AsidStorm
      26.07.2018 19:51

      Не скажу за 404 страницы, но если в нужно порядке расположить всё в urlrewrite то совершенно спокойно маршрутизуется ЧПУ в корне сайта.


      1. Mozart
        26.07.2018 20:05

        Любое сохранение компонента с чпу перепишет urlrewrite.


    1. yushkevichv
      27.07.2018 02:28

      Не, не завезли. Также не завезли миграции, mvc, solid, очереди, адекватную событийную модель, присутствие нормальной документации (имеется ввиду актуальной и полной).
      Скажу больше, судя по фичам последнего релиза, скоро начнут отвозить из существующего.


  1. theRavel
    26.07.2018 13:37

    В итоге, когда товаров в корзине не было, фильтр уходил пустой, и в выборку попадал ВЕСЬ каталог товаров

    Я совершенно не в теме Битрикса, но звучит как проблема в API фильтра, а не в руках разработчика (что конечно не отменяет факт тестирования своего кода). Что должен делать некий абстрактный фильтр, если по указанному критерию ему пришел пустой список? Правильно — вернуть пустой список.


    1. Pinkerton42
      26.07.2018 15:20
      +1

      Там фишка в том, что в параметрах выборки записей есть массив по которому фильтруется результат. Если он пуст, то считается, что фильтрации нет и «получите, распишитесь».


  1. medvoodoo
    26.07.2018 17:47
    +1

    И для всех пяти страниц использовался один шаблон с кучей if-else

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


  1. SimkinRoman
    27.07.2018 05:07

    добавить в исключения папку /bitrix/

    Там чуть-чуть сложнее. Папка local не позволяет подцепить кастомный импорт/экспорт данных (тот, что в /php_interface/catalog_export), а также гаджеты рабочего стола и еще ряд редких задач. Поэтому лучше использовать расширенный .gitignore, например, как тут.


  1. fpinger
    27.07.2018 06:12

    Попросили меня оптимизировать сайт на Битрикс. Посмотрел то что предлагает гугл. Понял что большая часть предложений бесполезна. Инлаин js в компонентах сломается если снести из заголовка библиотеки в конец страницы. Пожать инлаин js и css не получится. Объединить css и js файлы из заголовка не получится. Картинки можно оптимизировать, но работа с ними такая, что появятся новые не оптимизированные. Запросы к БД не оптимизировать. И т.д. и т.п. Проще замазать чем отодрать.

    А ещё мне дали пощупать лендинг на Битрикс. Он загружается десяток секунд. Это песня.

    Это правда, что под Битрикс не нужно разрабатывать, но всегда найдутся желающие получить деньги с неумных людей.