Как создать свой компонент на 1С-Битрикс с class.php и IncludeComponent?

Как создать свой компонент на 1С-Битрикс с class.php и IncludeComponent?

Вы скопировали шаблон bitrix:catalog.section в /bitrix/components и после обновления потеряли правки. Или написали component.php по старому гайду — блок есть через IncludeComponent, но в визуальном редакторе его нет: типичная проблема, когда логика живёт не в /local. На практике путь к своему компоненту в 1С-Битрикс: Управление сайтом — /local/components, class.php и $APPLICATION->IncludeComponent. К концу материала у вас будет рабочий каркас, который переживёт обновление CMS.

Свой компонент живёт только в /local/components/vendor/name, а не в /bitrix. Логику пишите в class.php с методом executeComponent, описание для редактора - в .description.php с массивом PATH. Подключение - $APPLICATION->IncludeComponent('vendor:name', '', $arParams). Если блок пустой или не виден в редакторе - проверьте namespace, точку в имени .description.php и сброс кэша компонентов.

Речь про коробочную CMS на вашем сервере, не про облачный портал Bitrix24. Компонент — PHP-блок, который собирает данные и отдаёт их в шаблон. Штатные лежат в /bitrix/components/bitrix/, ваши — в /local/components/свой_вендор/. Система сначала ищет /local, потом ядро — кастом не затирается при обновлении. Поля формы редактора разобраны в гайде по .parameters.php — здесь только создание с нуля.

Определите, когда нужен свой компонент, а когда хватит шаблона

Таблица сравнения: когда хватит шаблона bitrix, а когда нужен свой компонент

Часто хватает переопределения шаблона bitrix:* в /local/templates/ваш_шаблон/components/ - меняете вёрстку, логика остаётся в ядре.

Ситуация Достаточно шаблона bitrix:* Нужен свой компонент
Другая вёрстка каталога Да - template.php для catalog.section Нет
Своя выборка из инфоблока с нестандартной логикой Нет Да - class.php + ORM или CIBlockElement
Блок для переиспользования на 10 страницах Риск копипасты IncludeComponent Да - один vendor:name в редакторе
Интеграция с внешним API Нет Да - логика в executeComponent

Для каталога штатно смотрите bitrix:catalog.section. Свой компонент - когда логика не укладывается в параметры bitrix:*.

Делайте: начинайте с шаблона, если меняется только HTML/CSS. Не делайте: не клонируйте весь catalog.section в /local ради одного поля - поддержка станет дороже обновления ядра.

Создайте структуру папок в /local/components

Схема шагов создания структуры папок компонента в /local/components

Имя в коде - vendor:name, папка - /local/components/vendor/name/. Вендор - ваш бренд (mycompany), не bitrix - иначе конфликт с системными компонентами. Минимальный набор:

  • .description.php - имя и путь в дереве визуального редактора (файл с точкой в начале).
  • class.php - класс, наследник CBitrixComponent, метод executeComponent.
  • templates/.default/template.php - HTML-вывод по $arResult.
  1. Выберите vendor (например mycompany) и имя (hello.card).
  2. Создайте каталог /local/components/mycompany/hello.card/.
  3. Добавьте .description.php с NAME, DESCRIPTION и PATH.
  4. Создайте class.php с классом HelloCardComponent extends CBitrixComponent.
  5. Сделайте templates/.default/template.php для вывода.
  6. Проверьте в браузере, что hello.card отдаёт HTML без фатальных ошибок.

Каркас быстрее собрать консолью: php bitrix.php make:component Mycompany:HelloCard --local.

Делайте: свой vendor в /local/components/. Не делайте: не правьте файлы в /bitrix/components - обновление CMS перезапишет изменения.

Настройте .description.php, чтобы компонент появился в редакторе

Чеклист настройки .description.php для появления компонента в визуальном редакторе

Без корректного .description.php компонент не попадёт в панель «Мои компоненты», даже если IncludeComponent на странице работает. Ключ PATH задаёт раздел в дереве редактора. В реальном проекте типичная ошибка — файл description.php без точки в начале имени.

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
    die();
}

$arComponentDescription = [
    'NAME' => 'Приветственная карточка',
    'DESCRIPTION' => 'Выводит заголовок и текст из параметров',
    'PATH' => [
        'ID' => 'mycompany',
        'NAME' => 'Мои компоненты',
    ],
];

Если не виден: файл без точки (description.php вместо .description.php), нет PATH, не сброшен кэш компонентов в админке.

Делайте: проверяйте имя файла .description.php буквально с точкой. Не делайте: не кладите компонент в /local/components/bitrix/ - выберите свой ID в PATH.

Напишите логику в class.php вместо legacy component.php

Старые гайды учат component.php. Сейчас логику пишут в class.php: класс extends CBitrixComponent, вход - executeComponent(). Если оба файла в папке, ядро берёт class.php и игнорирует component.php.

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
    die();
}

use Bitrix\Main\Loader;

class HelloCardComponent extends CBitrixComponent
{
    public function onPrepareComponentParams($arParams)
    {
        $arParams['TITLE'] = trim((string)($arParams['TITLE'] ?? 'Привет'));
        $arParams['CACHE_TIME'] = (int)($arParams['CACHE_TIME'] ?? 3600);
        return $arParams;
    }

    public function executeComponent()
    {
        if ($this->startResultCache()) {
            $this->arResult['TITLE'] = $this->arParams['TITLE'];
            $this->arResult['TEXT'] = 'Компонент mycompany:hello.card работает.';
            $this->endResultCache();
        }
        $this->includeComponentTemplate();
    }
}

onPrepareComponentParams - дефолты и типы. В executeComponent заполняйте $this->arResult, затем includeComponentTemplate(). Шаблон только выводит данные. Параметры формы - в .parameters.php, разбор в гайде по .parameters.php; для hello.card хватит TITLE в IncludeComponent.

Делайте: один вход в логику через class.php. Не делайте: не подключайте .parameters.php вручную из class.php - дефолты задавайте в onPrepareComponentParams.

Схема workflow:
IncludeComponent передаёт $arParams → onPrepareComponentParams нормализует → executeComponent заполняет $arResult → includeComponentTemplate подключает templates/.default/template.php → браузер получает HTML

Подключите компонент через IncludeComponent на странице

Вызов на PHP-странице или в шаблоне сайта:

<?php
$APPLICATION->IncludeComponent(
    'mycompany:hello.card',
    '',
    [
        'TITLE' => 'Заголовок с страницы',
        'CACHE_TYPE' => 'A',
        'CACHE_TIME' => '3600',
    ],
    false
);
?>

Аргументы: vendor:name, имя шаблона ('' = .default), массив в $arParams, false без обёртки div. Шаблон:

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
    die();
}
?>
<div class="hello-card">
    <h3><?= htmlspecialcharsbx($arResult['TITLE']) ?></h3>
    <p><?= htmlspecialcharsbx($arResult['TEXT']) ?></p>
</div>

В режиме правки перетащите блок из раздела «Мои компоненты» редактора. Нет вывода — включите ошибки по settings.php и проверьте class.php.

Делайте: совпадение ключей в IncludeComponent и в onPrepareComponentParams. Не делайте: не вызывайте includeComponentTemplate до заполнения $arResult - шаблон получит пустой массив.

Проверьте вывод, кэш и типичные ошибки

Чек-лист перед сдачей задачи в прод:

  1. Страница: блок виден, TITLE из параметров попадает в HTML.
  2. Редактор: компонент в дереве PATH, перетаскивание создаёт корректный IncludeComponent.
  3. Кэш: после правки template.php очистите кэш; при startResultCache пустой результат лучше обрабатывать через abortResultCache.
  4. Namespace: папка не в /local/components/bitrix/, vendor в коде совпадает с папкой.
  5. Файлы: .description.php с точкой, class.php с executeComponent и includeComponentTemplate в конце.

Старая вёрстка на экране - чаще кэш, не "сломанный" Битрикс. После правки template.php сбросьте кэш или CACHE_TYPE = N для отладки.

Нужна помощь с блоком под каталог - обсудим задачу, примеры в портфолио. Делайте: сначала минимальный hello.card. Не делайте: не правьте ядро и /local одновременно.

Автор: Максим Мольков, разработчик 1С-Битрикс.
Источники: docs.1c-bitrix.ru - создание компонента, урок 2305 курса разработчика, урок 2826 - подключение компонента.

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

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

В каталоге /local/components/ваш_вендор/имя_компонента/ на сервере с коробочной CMS. Не в /bitrix/components - там лежит ядро, его перезаписывают при обновлении. Имя в коде: vendor:name, например mycompany:hello.card.

Чем class.php отличается от component.php?

component.php - старый procedural-стиль: код в файле без класса. class.php - ООП-подход D7: класс extends CBitrixComponent, логика в executeComponent. Если оба файла есть, ядро использует class.php. Для новых проектов пишите только class.php.

Зачем класть компонент в local, а не в bitrix?

Папка /local не трогается при обновлении продукта. Система ищет компонент сначала в /local/components, потом в /bitrix/components. Свой vendor изолирует ваш код от штатных bitrix:* и упрощает деплой между серверами.

Как подключить компонент через IncludeComponent?

На PHP-странице вызовите $APPLICATION->IncludeComponent('vendor:name', '', ['КЛЮЧ' => 'значение'], false). Ключи массива станут $arParams в class.php. Пустая строка во втором аргументе подключает шаблон templates/.default/.

Почему компонент не виден в визуальном редакторе?

Проверьте .description.php (имя с точкой в начале), наличие PATH с ID и NAME, свой namespace вместо bitrix. Сбросьте кэш компонентов в админке. Ручной IncludeComponent при этом может работать - редактор смотрит именно на .description.php.

Нужен ли .parameters.php для каждого компонента?

Нет, для минимального блока достаточно передать параметры в IncludeComponent. .parameters.php нужен, когда редактор должен менять настройки через форму без правки PHP. Подробности - в гайде по .parameters.php на mvmolkov.ru.

Читайте также

Интеграции с 1С и API
946 6 мин.

Как настроить регистрацию и личный кабинет покупателя на 1С-Битрикс?

Пошаговая настройка регистрации на сайте битрикс: Главный модуль, main.register, system.auth.form и sale.personal.section с историей заказов и 152-ФЗ.
Интеграции с 1С и API
675 15 мин.

Что такое компонент в Битриксе и как он работает

Каждый разработчик, впервые столкнувшийся с Битриксом, проходит через своеобразный обряд посвящения. Вначале кажется, что это просто CMS, где можно поправить HTML в визуальном редакторе или дописать пару строк CSS. Но однажды наступает момент, когда нужно изменить логику вывода новостей, отфильтровать товары по хитрому свойству или добавить на страницу нечто совершенно новое. И тут он впервые слышит это слово — «компонент». Для многих этот момент становится стеной. Система, казавшаяся понятной, вдруг превращается в черный ящик, полный непонятных файлов и странных переменных. Но стоит лишь раз заглянуть под капот, как эта стена рассыпается, превращаясь в набор удивительно логичных и мощных строительных блоков. Понимание компонентов — это тот самый щелчок, после которого разработка на Битрикс из мучения превращается в творчество.

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

Интеграции с 1С и API
605 2 мин.

Установка Composer в 1С-Битрикс

Установка Composer в проекте на 1С-Битрикс требует учета особенностей платформы, чтобы обеспечить корректную работу и интеграцию с системой.