БесплатноБесплатный прототип ключевой страницы и черновик ТЗ при старте проекта

Создание своего компонента в 1С-Битрикс

Создание своего компонента в 1С-Битрикс: структура файлов, класс на D7 и шаблон

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

Это практическое руководство: как устроен компонент, где его размещать, как написать класс на D7, описать параметры, вывести данные в шаблон, настроить кэширование и AJAX. Материал — для разработчиков и техлидов, которые хотят делать поддерживаемый код, а не «костыли». Если нужна не теория, а готовое решение, посмотрите нашу услугу автоматизации на 1С.

Коротко

  • Свой компонент нужен, когда штатные не покрывают логику; размещать его надо в /local/components/ со своим namespace.
  • Логика живёт в class.php (наследник CBitrixComponent, D7-ORM), вывод — в template.php через $arResult.
  • Параметры описываются в .parameters.php, тяжёлые выборки оборачиваются в управляемый кэш с корректным ключом.
  • Интерактив делают через ajax-действия компонента, а шаблоны штатных компонентов переопределяют в шаблоне сайта.

Когда нужен свой компонент

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

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

Простой и комплексный компонент

В Битрикс есть два типа компонентов, и важно выбрать правильный.

КритерийПростой компонентКомплексный компонент
ЗадачаОдин блок / одна страницаЦелый раздел из нескольких страниц
МаршрутизацияНетСвоя, через ЧПУ
ПримерБлок «Похожие товары»Каталог: список, раздел, детальная
ВложенностьСамостоятеленМожет вызывать простые внутри

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

Обмен данными сайта с 1С Сайткаталог, заказытовары, заказыОбменочередь / APIДанные идут в обе стороны по расписанию или по событию
Схема: сайт и 1С обмениваются данными в обе стороны — по расписанию или по событию. Товары и остатки приходят на сайт, заказы уходят обратно.

Структура файлов компонента

Компонент — это папка со строго заданной структурой, размещённая в пространстве имён. Правильное место — /local/components/namespace/component.name/, где namespace — ваш префикс (студия, проект). Каталог /local/ отделён от ядра и переживает обновления. Минимальный состав:

Такая структура — не формальность: она разделяет логику, параметры и вывод, и именно поэтому компонент легко поддерживать. Namespace защищает от конфликтов со штатными и сторонними компонентами.

Класс компонента на D7

Сердце компонента — класс в class.php, наследующий CBitrixComponent с методом executeComponent(). Именно он выполняется при подключении компонента. Внутри вы:

  1. Готовите входные параметры. В onPrepareComponentParams() приводите $arParams к нужным типам и значениям по умолчанию.
  2. Выбираете данные. Через D7-ORM собираете нужное и складываете в $arResult.
  3. Оборачиваете в кэш. Тяжёлую выборку помещаете между startResultCache() и endResultCache().
  4. Подключаете шаблон. Вызываете includeComponentTemplate() для вывода.

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

Правило разделения: class.php отвечает на вопрос «какие данные», template.php — «как показать». Никаких запросов к базе в шаблоне и никакого HTML в классе. Это делает компонент тестируемым и переносимым.

Описание параметров

Файл .parameters.php описывает входные параметры компонента для визуального редактора Битрикс. Благодаря ему контент-менеджер настраивает компонент через удобный интерфейс, а не правит код. В параметрах задают:

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

Шаблон и вывод $arResult

Шаблон template.php получает готовый массив $arResult, сформированный в классе, и превращает его в HTML. Здесь действуют простые правила хорошего тона:

Разделение «класс — данные, шаблон — вывод» позволяет менять внешний вид независимо от логики и наоборот. Один компонент может иметь несколько шаблонов под разные места использования.

Кэширование результата

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

  1. Оберните выборку. Поместите её между startResultCache() и endResultCache().
  2. Соберите корректный ключ. В кэш-ключ включите всё, что влияет на результат: раздел, язык, группу пользователя, страницу, значимые параметры.
  3. Подключите теговый кэш. Регистрируйте теги кэша, чтобы он сбрасывался при изменении связанных данных.
  4. Кладите в кэш только нужное. В $arResult — минимум данных для шаблона, без «мусора».

Самая частая ошибка — неполный ключ кэша: если группа пользователя или страница не учтены, часть посетителей увидит чужой «прилипший» результат. Кэш ускоряет сайт только тогда, когда он корректен. Тему производительности мы продолжаем в статье про хостинг и инфраструктуру BitrixVM, а инженерную выкладку изменений — в материале про CI/CD и деплой на Битрикс.

AJAX-действия компонента

Интерактив — подгрузку, фильтрацию, отправку форм — реализуют через механизм ajax-действий компонента. Это класс с методами-действиями, которые вызываются с фронтенда через BX.ajax.runComponentAction. Преимущества перед «самопальными» обработчиками:

Внутри действия обязательно проверяйте права и валидируйте вход — это публичный endpoint, к нему применимы те же требования безопасности, что и к любому API. Подробнее — в статье про REST, вебхуки и безопасность в Битрикс.

Подключение и переопределение шаблона

Готовый компонент подключается на странице стандартным вызовом с указанием пути и параметров. А чужой (штатный или сторонний) компонент кастомизируют, не трогая его самого: шаблон копируют в шаблон сайта /local/templates/ваш_шаблон/components/... и правят там.

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

Пошаговый порядок разработки

  1. Проверьте, нет ли готового. Убедитесь, что штатный компонент задачу не решает.
  2. Создайте структуру. Папка в /local/components/namespace/ с обязательными файлами.
  3. Напишите класс. D7-класс с onPrepareComponentParams() и executeComponent().
  4. Опишите параметры. .parameters.php с типами, дефолтами и полями кэша.
  5. Сделайте шаблон. template.php выводит только $arResult.
  6. Включите кэш. Обёртка с корректным ключом и теговым кэшем.
  7. Добавьте AJAX при необходимости. Через ajax-действия с проверкой прав.
  8. Протестируйте. Разные параметры, группы пользователей, сброс кэша, нагрузка.

Частые ошибки

Чек-лист качества

  1. Размещение верное. Компонент в /local/components/namespace/ со своим префиксом.
  2. Логика в классе. D7-класс отвечает за данные, шаблон — только за вывод.
  3. Параметры описаны. .parameters.php позволяет настраивать компонент без кода.
  4. Кэш корректен. Ключ учитывает все влияющие факторы, есть теговый сброс.
  5. AJAX безопасен. Через ajax-действия с проверкой прав и валидацией.
  6. Шаблон переопределяем. Вывод меняется в шаблоне сайта, ядро не тронуто.
  7. Протестировано. Разные параметры, группы, нагрузка и сброс кэша проверены.

Вывод

Собственный компонент в 1С-Битрикс — это не «хак», а штатный, поддерживаемый способ расширять платформу. Ключ к качеству — дисциплина: размещать код в /local/ со своим namespace, держать логику в D7-классе, а вывод — в шаблоне, аккуратно кэшировать с корректным ключом и делать интерактив через безопасные ajax-действия.

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

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

Когда стоит писать свой компонент, а когда хватит штатного?

Штатных компонентов Битрикс хватает для типовых задач: каталог, корзина, формы, новости. Свой компонент нужен, когда логика уникальна и не покрывается стандартными: особая выборка данных, интеграция с внешним сервисом, нестандартный вывод. Если вы копируете штатный компонент и переписываете половину class.php — это сигнал, что пора делать свой. Начинать всегда стоит с проверки, нет ли готового решения, чтобы не изобретать велосипед.

Чем комплексный компонент отличается от простого?

Простой компонент решает одну задачу и выводит один тип страницы. Комплексный компонент управляет целым разделом с несколькими страницами через ЧПУ и внутреннюю маршрутизацию — например, каталог со списком, разделом и детальной карточкой. Комплексный внутри может вызывать простые компоненты. Для большинства кастомных задач достаточно простого компонента; комплексный оправдан, когда нужен многостраничный раздел с человекопонятными URL.

Где физически размещать свой компонент?

Компоненты хранятся в пространстве имён внутри /local/components/ или /bitrix/components/. Правильное место — именно /local/components/namespace/component.name/, где namespace — ваш префикс (например, название студии или проекта). Каталог /local/ отделён от ядра и не затирается при обновлениях, а свой namespace защищает от конфликтов со штатными и сторонними компонентами. Класть кастомные компоненты в /bitrix/ нельзя.

Обязательно ли писать class.php на D7?

Формально можно обойтись component.php по старому образцу, но правильный современный путь — класс, наследующий CBitrixComponent, с методом executeComponent(). D7-подход даёт чистую структуру, работу с параметрами, управляемое кэширование и тестируемость. Внутри класса вы используете D7-ORM для выборок вместо устаревших методов. Это стандарт для нового кода и то, что ожидают увидеть в поддерживаемом проекте.

Как правильно кэшировать данные в своём компоненте?

Оборачивайте тяжёлую выборку в стандартный механизм кэширования компонента: startResultCache() / endResultCache(), сохраняя в $arResult только то, что нужно шаблону. Обязательно задавайте корректный кэш-ключ, учитывающий все влияющие параметры (раздел, язык, группа пользователя, страница), и подключайте теговый кэш, чтобы сбрасывать его при изменении данных. Без учёта параметров в ключе вы получите «прилипший» неверный кэш для части пользователей.

Как передавать данные из class.php в шаблон?

Через массив $arResult, который формируется в классе компонента и становится доступен в template.php. Логика (выборки, обработка, подготовка данных) живёт в классе, а шаблон только выводит готовый $arResult в HTML. Это ключевой принцип: не делайте запросов к базе в шаблоне и не смешивайте логику с версткой. Тогда компонент легко поддерживать, а шаблон можно менять независимо от логики.

Как сделать AJAX в своём компоненте?

Современный способ — механизм ajax-действий компонента (класс с методами-действиями, вызываемыми через BX.ajax.runComponentAction). Он даёт единую точку входа, проверку сессии и удобную передачу параметров. Так реализуют подгрузку, фильтрацию и другие интерактивные сценарии без отдельных «самопальных» обработчиков. Важно проверять права и валидировать входные данные внутри действия, как и в любом публичном endpoint.

Можно ли переопределить чужой шаблон компонента, не трогая сам компонент?

Да, и это правильный подход. Шаблон компонента копируется в шаблон вашего сайта (/local/templates/ваш_шаблон/components/...) и правится там, а сам компонент остаётся нетронутым. Так вы кастомизируете вывод штатных и сторонних компонентов, не ломая обновляемость. Менять файлы в /bitrix/components/ напрямую нельзя — правки затрутся при обновлении, поэтому переопределение через шаблон сайта — единственный безопасный путь.

Поделиться:

Нужен кастомный компонент без «костылей»?

Напишем поддерживаемый компонент по стандартам 1С-Битрикс: D7, кэш, AJAX, чистая архитектура. Опишите задачу — оценим работу.

Автоматизация на 1С

Редакция B2Bsite

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

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