Платформа 1С-Битрикс предоставляет разработчикам возможности для создания различных компонентов, которые расширяют функционал сайта. Ранее для создания компонента использовался файл component.php
, однако с появлением нового ядра D7 структура и подходы к разработке компонентов претерпели значительные изменения. Вместо component.php
теперь используется class.php
, что позволяет значительно улучшить организацию кода, повысить его читаемость и использовать объектно-ориентированные принципы разработки.

В этой статье мы рассмотрим создание компонента для отображения и добавления комментариев к статьям, используя два подхода: старый — через файл component.php
и новый — через файл class.php
. Мы также сравним оба подхода, включая добавление стилей и скриптов.
Полная структура компонента
Для создания компонента будет использоваться пространство имен Esprimo
. Компонент будет хранить комментарии в инфоблоке и иметь возможность их отображать и добавлять.
/local/components/
esprimo/
comment/
.description.php (Описание компонента)
.parameters.php (Параметры компонента)
class.php (Логика компонента)
template/
.default/
template.php (Шаблон компонента)
class.php
— главный файл компонента, где пишется бизнес-логика (например, добавление и вывод комментариев)..description.php
— описание компонента..parameters.php
— параметры компонента, которые могут быть настроены в административной панели.template.php
— файл шаблона для вывода данных.
Теперь давайте разберемся, как будет выглядеть создание компонента на старом и новом подходах.
Подход 1: Создание компонента через component.php
(старый подход)
Ранее для создания компонента в 1С-Битрикс использовался файл component.php
, который содержал как логику компонента, так и его вывод. Это означало, что бизнес-логика и шаблон компонента находились в одном файле.
1. Описание компонента (файл .description.php
)
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arComponentDescription = array(
"NAME" => "Комментарии",
"DESCRIPTION" => "Компонент для добавления и отображения комментариев",
"PATH" => array(
"ID" => "custom",
"NAME" => "Мои компоненты"
),
);
?>
2. Логика компонента (файл component.php
)
Ранее бизнес-логика и вывод компонента находились в одном файле component.php
. В нем мы добавляли комментарии и выводили их:
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
class EsprimoCommentComponent extends CBitrixComponent
{
public function executeComponent()
{
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["comment_text"])) {
$this->addComment($_POST["comment_text"]);
}
$this->arResult["COMMENTS"] = $this->getComments();
$this->includeComponentTemplate();
}
private function addComment($text)
{
Loader::includeModule("iblock");
$element = new CIBlockElement();
$fields = array(
"IBLOCK_ID" => 1, // ID инфоблока с комментариями
"NAME" => "Комментарий",
"PREVIEW_TEXT" => $text,
"ACTIVE" => "Y",
);
$element->Add($fields);
}
private function getComments()
{
Loader::includeModule("iblock");
$comments = [];
$res = CIBlockElement::GetList(
array("SORT" => "ASC"),
array("IBLOCK_ID" => 1), // ID инфоблока с комментариями
false,
false,
array("ID", "NAME", "PREVIEW_TEXT")
);
while ($ob = $res->GetNextElement()) {
$fields = $ob->GetFields();
$comments[] = $fields;
}
return $comments;
}
}
?>
3. Шаблон компонента (файл template.php
)
<?php if (!empty($arResult["COMMENTS"])): ?>
<div class="comments">
<?php foreach ($arResult["COMMENTS"] as $comment): ?>
<div class="comment">
<div class="comment-text"><?= htmlspecialchars($comment["PREVIEW_TEXT"]) ?></div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<form method="POST">
<textarea name="comment_text" required></textarea>
<button type="submit">Добавить комментарий</button>
</form>
4. Добавление стилей и скриптов
Стили и скрипты подключались в шаблоне с помощью AddEventHandler()
или напрямую через \Bitrix\Main\Page\Asset::getInstance()->addCss()
и addJs()
в component.php
:
<?php
\Bitrix\Main\Page\Asset::getInstance()->addCss('/local/components/esprimo/comment/style.css');
\Bitrix\Main\Page\Asset::getInstance()->addJs('/local/components/esprimo/comment/script.js');
?>
Подход 2: Создание компонента через class.php
(новый подход)
С введением нового ядра D7, структура компонента изменилась. Теперь основным файлом компонента является class.php
. В нем описывается только логика компонента, а шаблон и стили подключаются отдельно. Это позволяет лучше организовать код и использовать объектно-ориентированные подходы.
1. Описание компонента (файл .description.php
)
Файл .description.php
не изменился, он по-прежнему описывает компонент в административной панели.
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arComponentDescription = array(
"NAME" => "Комментарии",
"DESCRIPTION" => "Компонент для добавления и отображения комментариев",
"PATH" => array(
"ID" => "custom",
"NAME" => "Мои компоненты"
),
);
?>
2. Логика компонента (файл class.php
)
В class.php
используется объектно-ориентированный подход. Мы создаем класс компонента, который инкапсулирует логику работы с комментариями.
<?php
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Main\ArgumentException;
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
class EsprimoCommentComponent extends \CBitrixComponent
{
public function executeComponent()
{
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["comment_text"])) {
$this->addComment($_POST["comment_text"]);
}
$this->arResult["COMMENTS"] = $this->getComments();
$this->includeComponentTemplate();
}
private function addComment($text)
{
Loader::includeModule("iblock");
try {
$element = new \Bitrix\Iblock\Element();
$element->setFields([
"IBLOCK_ID" => 1, // ID инфоблока с комментариями
"NAME" => "Комментарий",
"PREVIEW_TEXT" => $text,
"ACTIVE" => "Y",
]);
$element->save();
} catch (ArgumentException $e) {
\Bitrix\Main\Diag\Debug::writeToFile($e->getMessage(), "", "/log/");
}
}
private function getComments()
{
Loader::includeModule("iblock");
$comments = [];
$res = ElementTable::getList([
"filter" => ["IBLOCK_ID" => 1], // ID инфоблока с комментариями
"order" => ["SORT" => "ASC"],
]);
while ($comment = $res->fetch()) {
$comments[] = $comment;
}
return $comments;
}
}
?>
3. Шаблон компонента (файл template.php
)
Шаблон компонента не изменился. Он по-прежнему отвечает за вывод комментариев и формы добавления.
<?php if (!empty($arResult["COMMENTS"])): ?>
<div class="comments">
<?php foreach ($arResult["COMMENTS"] as $comment): ?>
<div class="comment">
<div class="comment-text"><?= htmlspecialchars($comment["PREVIEW_TEXT"]) ?></div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<form method="POST">
<textarea name="comment_text" required></textarea>
<button type="submit">Добавить комментарий</button>
</form>
4. Добавление стилей и скриптов
В отличие от старого подхода, стили и скрипты в новом подходе добавляются через Asset
в шаблоне компонента.
<?php
\Bitrix\Main\Page\Asset::getInstance()->addCss('/local/components/esprimo/comment/style.css');
\Bitrix\Main\Page\Asset::getInstance()->addJs('/local/components/esprimo/comment/script.js');
?>
Сравнение подходов
- Основной файл компонента:
- Старый подход (component.php): вся логика и вывод компонента находятся в одном файле.
- Новый подход (class.php): логика компонента вынесена в отдельный класс, а шаблон компонента находится отдельно.
- Ограничения старого подхода:
- Мешание бизнес-логики и шаблона в одном файле делает код громоздким и трудным для поддержки.
- Прямое подключение стилей и скриптов в
component.php
может привести к избыточности и неудобству управления.
- Преимущества нового подхода:
- Ясное разделение логики и шаблонов.
- Использование объектно-ориентированного подхода в классе
class.php
. - Удобное подключение стилей и скриптов через
Asset
.
Заключение
С переходом на ядро D7 в 1С-Битрикс компоненты стали более организованными и удобными для разработки. Использование class.php
вместо component.php
позволяет лучше структурировать код, улучшить его читаемость и упростить поддержку.