Разработка компонента 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка компонента 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1165
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    563
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    743
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Разработка компонента 1С-Битрикс

Стандартная библиотека компонентов Битрикс покрывает 80% типовых задач, но когда проект выходит за пределы шаблонного функционала — нужен собственный компонент. Задача разработчика: не просто написать PHP-код, который работает, а создать компонент по правилам платформы — с поддержкой кеширования, параметров, событий, мультисайтовости и возможностью обновления шаблона без изменения логики.

Анатомия компонента Битрикс

Компонент располагается в /local/components/{namespace}/{component.name}/ или /bitrix/components/. Обязательная структура:

/local/components/custom/my.component/
├── .parameters.php          # описание параметров компонента
├── .description.php         # метаданные: название, категория
├── component.php            # основная логика (бизнес-слой)
└── templates/
    └── .default/
        ├── template.php     # шаблон вывода
        ├── style.css        # стили компонента
        ├── script.js        # клиентская логика
        └── result_modifier.php  # опционально: постобработка $arResult

.description.php — минималистичный файл:

<?php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
$arComponentDescription = [
    'NAME'        => 'Мой компонент',
    'DESCRIPTION' => 'Описание функционала компонента',
    'ICON'        => '/images/icon.gif',
    'CACHE_PATH'  => 'Y',
    'SORT'        => 20,
];

component.php: правила написания бизнес-логики

component.php — не просто скрипт, а файл, который выполняется в контексте объекта $this (экземпляр класса компонента). Это даёт доступ к API кеширования, параметрам и дочерним компонентам.

Минимальная структура component.php:

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

/** @var CBitrixComponent $this */

// Подготовка параметров с дефолтами
$arParams = array_merge([
    'IBLOCK_ID'  => 0,
    'CACHE_TIME' => 3600,
    'COUNT'      => 10,
], $arParams);

// Проверка обязательных параметров
if (!(int)$arParams['IBLOCK_ID']) {
    ShowError('Параметр IBLOCK_ID обязателен');
    return;
}

// Кеширование через StartResultCache / EndResultCache
if ($this->StartResultCache($arParams['CACHE_TIME'], false, '/custom/my.component/')) {
    // Выборка данных
    $res = CIBlockElement::GetList(
        ['SORT' => 'ASC'],
        ['IBLOCK_ID' => $arParams['IBLOCK_ID'], 'ACTIVE' => 'Y'],
        false,
        ['nTopCount' => $arParams['COUNT']],
        ['ID', 'NAME', 'PREVIEW_TEXT', 'PREVIEW_PICTURE', 'DETAIL_PAGE_URL']
    );

    $arResult = ['ITEMS' => []];
    while ($el = $res->GetNext()) {
        $arResult['ITEMS'][] = $el;
    }

    $this->arResult = $arResult;
    $this->IncludeComponentTemplate();
    $this->EndResultCache();
}

Вызов $this->StartResultCache() — это не просто кеш HTML. Битрикс кеширует $arResult и повторно вызывает IncludeComponentTemplate() с кешированными данными, не выполняя тело кеша повторно. При изменении данных кеш сбрасывается через BXClearCache(true, '/custom/my.component/').

.parameters.php: описание параметров

Этот файл делает компонент настраиваемым через визуальный редактор Битрикс («Настройки компонента»). Без него компонент работает, но не удобен для нетехнических пользователей.

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

$arIblockList = [];
$res = CIBlock::GetList(['SORT' => 'ASC'], ['ACTIVE' => 'Y', 'SITE_ID' => SITE_ID]);
while ($ib = $res->Fetch()) {
    $arIblockList[$ib['ID']] = '[' . $ib['ID'] . '] ' . $ib['NAME'];
}

$arComponentParameters = [
    'GROUPS' => [
        'DATA'    => ['NAME' => 'Настройки данных'],
        'DISPLAY' => ['NAME' => 'Настройки отображения'],
    ],
    'PARAMETERS' => [
        'IBLOCK_ID' => [
            'PARENT'  => 'DATA',
            'NAME'    => 'Инфоблок',
            'TYPE'    => 'LIST',
            'VALUES'  => $arIblockList,
            'DEFAULT' => '',
        ],
        'COUNT' => [
            'PARENT'  => 'DISPLAY',
            'NAME'    => 'Количество элементов',
            'TYPE'    => 'STRING',
            'DEFAULT' => '10',
        ],
        'CACHE_TIME' => ['DEFAULT' => 3600],
    ],
];

template.php: разделение логики и отображения

В шаблоне — только разметка. Никаких запросов к базе, никакой бизнес-логики:

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

/** @var array $arResult */
/** @var array $arParams */
/** @var CBitrixComponentTemplate $this */
?>
<div class="my-component">
    <?php foreach ($arResult['ITEMS'] as $item): ?>
        <div class="item">
            <a href="<?= htmlspecialchars($item['DETAIL_PAGE_URL']) ?>">
                <?= htmlspecialchars($item['NAME']) ?>
            </a>
        </div>
    <?php endforeach; ?>
</div>

Стили и скрипты компонента подключаются через Asset в template.php:

\Bitrix\Main\Page\Asset::getInstance()->addCss($this->getFolder() . '/style.css');
\Bitrix\Main\Page\Asset::getInstance()->addJs($this->getFolder() . '/script.js');

Класс компонента вместо процедурного кода

Для сложных компонентов — наследование от CBitrixComponent:

<?php
// /local/components/custom/my.component/class.php
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();

class MyComponent extends CBitrixComponent {
    public function onPrepareComponentParams($arParams): array {
        $arParams['IBLOCK_ID'] = (int)($arParams['IBLOCK_ID'] ?? 0);
        $arParams['COUNT']     = max(1, (int)($arParams['COUNT'] ?? 10));
        return $arParams;
    }

    public function executeComponent(): void {
        if ($this->StartResultCache()) {
            $this->arResult = $this->getData();
            $this->IncludeComponentTemplate();
            $this->EndResultCache();
        }
    }

    private function getData(): array {
        // Логика выборки
        return ['ITEMS' => []];
    }
}

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

Инвалидация кеша при изменении данных

Кеш компонента нужно сбрасывать при изменении элементов инфоблока, которые он отображает. Иначе после редактирования в админке изменения появятся только после истечения CACHE_TIME:

// В init.php или в обработчике событий инфоблока
AddEventHandler('iblock', 'OnAfterIBlockElementUpdate', function($arFields) {
    if ($arFields['IBLOCK_ID'] == MY_IBLOCK_ID) {
        BXClearCache(true, '/custom/my.component/');
    }
});

Для тегированного кеша (более точная инвалидация) используется \Bitrix\Main\Data\TaggedCache.

Сроки

Тип компонента Что входит Срок
Простой (список, детальная) Логика + шаблон + параметры + кеш 2–5 дней
Средний (AJAX, форма, события) + обработка POST, события, инвалидация 1–2 недели
Комплексный (класс, несколько шаблонов) + ORM, дочерние компоненты, права 2–4 недели

Компонент, написанный по правилам Битрикс, легко переносить между проектами, перекрывать шаблоны на уровне сайта и кастомизировать без редактирования ядра.