Практические советы по разработке на 1С-Битрикс

Введение

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

Важно заметить, что разработка на 1С-Битрикс имеет свою специфику, которую в данной статье я не подвергаю критике.

Это всего лишь еще один инструмент для бизнеса, основанного на веб-разработке, и нужно попробовать использовать его на максимум.

Агенты в 1С-Битрикс

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

Обязательно следует установить выполнение фоновых заданий на cron ровно так, как это указано в уроке по CMS. Если же этого не будет сделано, “несчастливым” посетителям придется отправлять почту во время загрузки страницы. Если настроена SMTP-авторизация при отправке писем, то страница будет отдавать 3-5 и более секунд.

Другое неочевидное условие, накладываемое механизмом агентов: задание должно выполниться за 6 минут.

Если ваше задание выполняет долгий парсинг или время выполнения может быть непредсказуемым, будьте готовы, что произойдет дубль задания, так как платформа Битрикс посчитает, что “предыдущая версия” агента зависла и не отработала.

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

Битрикс и объемы данных

Как правило, типовой проект на начальном этапе выглядит так:

  • виртуальный хостинг за 2000 руб. в месяц, хорошо настроенный под Битрикс
  • каталог: 200 000 товаров, 300 свойств
  • требуется интеграция с ERP-заказчика
  • частота обновления данными - как можно чаще
  • заказчик не готов на значительную кастомизацию платформы.

К сожалению, штатный интернет-магазин Битрикс будет работать медленно. Медленно - это 5-8 секунд на страницы без кеша.

Причины следующие:

  • EAT-модель хранения данных в БД
  • Большое количесва legacy-кода в ядре
  • Неоптимальные запросы к БД
  • Противоречивые требования заказчика.

Чтобы решить проблему, нужно:

  • Проработать стратегию изменения данных: определить частоту, минимально-необходимую бизнесу заказчика и позволяющую снихить нагрузку на сайт
  • Проработать механизмы кеширования, вероятно, избавиться от тегированного кеша на часто посещаемых страницах
  • Кастомизировать платформу для возможности работы с in-memory хранилищем данных, например, sphinx, redis
  • Использовать механизм прогрева кеша.

Штатно в Битрикс всего этого нет, удовлетворительную работу можно наблюдать только на малых объемах данных.

Composer и 1C-Битрикс

Автозагрузка в ядре Битрикс, к сожалению, выполнена по PSR-стандарту. Используйте возможности автозагрузки с помощью composer. В последних обновлениях composer официально поддерживается платформой.

Если же у вас старая версия ядра, то рекомендую сделать так, чтобы в файле init.php была только одна строчка

<?php
require /_путь до vendor_//autoload.php;

Не храните папку vendor доступной извне. Лучше выносить за DOCUMENT_ROOT или закрывать через .htaccess или location.

DRY и 1С-Битрикс

Методология Битрикс предполагает, что логику получения и обработки данных нужно делать в компонентах. Шаблоны нужны для вывода информации. Если вывод информации нужно скорректировать, нужно использовать специальный файл result_modifier.php

На практике же получается так: используется штатные компоненты с нестандартной версткой, для которой нужно дополучить много данных в resut_modifier.php. На этапе разработки все хорошо. Но затем сайт начинает жить своей жизнью и разработчиком приходится копировать шаблоны, чтобы изменить, например, вывод списка товаров с таблицы на карусель. Код в result_modifier.php дублируется и приходится поддерживать вдвое больше.

Выносите обработку данных компонентов в свои классы, сократите result_modifier.php до строк:

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
die();
}
\\App\\Component\\Bitrix\\CatalogSection::getInstance()->handleResult($arResult);

Карта сайта и 1С-Битрикс

Если вы включили автогенерацию сайта и у вас тормозит изменение элементов ИБ, то значит, придется перегенерировать изменения вручную, а автосоздание карты сайт отключить.

Причина в том, что в при включении данной опции любое изменение элемента ИБ влечет за собой фактическое изменение карты сайта с записью на жесткий диск.

На момент написания статьи стандартного механизма фоновой генерация карты сайта в платформе нет.

Поиск и 1С-Битрикс

Если заказчик хочет, чтобы на странице результатов поиска товаров был умный фильтр, а товары сортировались по релевантности - вам нужно писать свое решение. Работают связки: Битрикс + Sphinx, Битрикс + ElasticSearch. Штатного решения нет.

Для такой реализации:

  • данные должны индексироваться поисковым движком (желательно фоном)
  • компоненты обращаются к поисковому движку за данными
  • запросы к поисковым движкам будут “сложные” с учетом нетривиальной логики построения фасет для умного фильтра
  • это дорогое решение, так как тянет за собой много нюансов: настройка SEO, работа ЧПУ и так далее.

Используйте запись в cookie одним способом на backend и frontend: или нативными средствами, или API Битрикс. Не стоит писать на js через jquery-плагин, а в php через CApplication, потому что в таком случае не будет контроля над префиксом у ключей cookie, а также путаница при работе с поддоменами.

Штатные функции:

Обновления и 1С-Битрикс

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

К сожалению, бывал в ситуациях, когда обновление “ломало” сайт и восстанавливать приходилось через тех. поддержку вендора. Или приготовьте красивую заглушку с информацией о технических работах на 6 часов. Как это сделать описано в уроке.

Веб-окружение и 1С-Битрикс

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

Типичные ошибки:

  • Параметр mbstring.func_overload очень часто отличается для разных SAPI. Обязательно проверьте настройку при работе php из командной строки
      php -r 'phpinfo();' | grep mbstring
      
    В противном случае можно получить ошибки отправки почты и другие сложно-диагностируемые проблемы работы агентов.
  • Системный пользователь сайта и веб-сервера разный. Если так случилось, то вероятна ситуация, когда, например, фоном будет создан файл с кешем, а веб-сервер не сможет его сбросить, так как для ОС это будет недопустимо из-за ACL.
  • Отсутствует мониторинг. Без мониторинга сайта вы никогда не узнайте, что там скоро закончится место и его не хватило на последнюю резервную копию.
  • Бекап должен быть и должен быть хорошим, целостным, полным и проверяться на валидность по расписанию. Если всего этого нет, то это очень плохо.

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

Контроль версий и 1С-Битрикс

Сталкивался с несколькими идеями по организации разработки c VCS и 1C-Битрикс.

  • Папка .git не в DOCUMENT_ROOT. Плюсы: безопасность. Минусы: репозиторий не переносится вместе с резервной копией.
  • Ядро Битрикс в контроле версий. Плюсы: полный контроль за репозиторием и подрядчиками. Минусы: объем репозитория возрастает, при обновлении Битрикс меняются почти все файлы, поэтому отследить что-то невозможно.

Поэтому считаю оптимальным держать в корне проекта файл .gitignore. Пример файла и папке .git, а также проследить, чтобы к данным файлам не было доступа извне.

php  bitrix  devops  vsc