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

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка комплексного компонента 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

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

Комплексний компонент — це компонент, який управляє набором дочірніх компонентів, визначаючи їхній склад залежно від URL та точки монтування на сторінці. Саме комплексні компоненти реалізують розділи каталогу, блоги, особистий кабінет — коли на одній URL-адресі може бути список, на іншій — детальна сторінка, на третій — форма оформлення. Без розуміння механіки комплексних компонентів неможливо правильно реалізувати багатосторінковий функціонал на Бітрікс.

Чим комплексний компонент відрізняється від звичайного

Звичайний компонент (bitrix:news.detail) виводить один конкретний блок. Комплексний (bitrix:news) — точка монтування розділу. Він сам вирішує, який дочірній компонент викликати: якщо URL /news/ — список новин, якщо /news/title-news/ — детальна сторінка.

Комплексний компонент зв'язує URL з дочірніми компонентами через механізм SEF-URL (Search Engine Friendly) та файл page_templates.php.

Структура комплексного компонента

/local/components/custom/my.section/
├── .description.php
├── .parameters.php
├── component.php              # диспетчер: визначає тип сторінки
├── page_templates.php         # маппінг URL-шаблонів на дочірні компоненти
├── templates/
│   └── .default/
│       ├── template.php       # шаблон обгортки (заголовок, навігація)
│       └── page_templates/    # шаблони дочірніх компонентів
│           ├── list.php
│           └── detail.php

page_templates.php: маппінг URL

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

$arSefTemplates = [
    // список
    'list'   => '',
    // детальна сторінка
    'detail' => '#ELEMENT_CODE#/',
    // розділ
    'section' => '#SECTION_CODE#/',
    // пошук
    'search' => 'search/',
];

Бітрікс порівнює поточну URL-адресу з цими шаблонами та визначає тип сторінки ($arCurrentValues['PAGE_ELEMENT_TYPE']).

component.php комплексного компонента: диспетчер

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

/** @var CBitrixComponent $this */

// Ініціалізація SEF
$this->setFrameMode(true);

if ($arParams['SEF_MODE'] === 'Y') {
    $arSEFUrlTemplates = [];
    $arDefaultSEFUrlTemplates = [
        'list'   => '',
        'detail' => '#ELEMENT_CODE#/',
        'section' => '#SECTION_CODE#/',
    ];
    // ... парсинг поточної URL

    // Визначаємо тип сторінки
    $page = 'list'; // за замовчуванням

    if (isset($arVariables['ELEMENT_CODE']) && $arVariables['ELEMENT_CODE']) {
        $page = 'detail';
    } elseif (isset($arVariables['SECTION_CODE']) && $arVariables['SECTION_CODE']) {
        $page = 'section';
    }
} else {
    // Параметричний режим (не SEF)
    $page = $arParams['PAGE_ELEMENT_TYPE'];
}

// Підключаємо потрібний шаблон сторінки
$this->includePageTemplate($page);

Дочірні компоненти в шаблоні

Файл templates/.default/page_templates/list.php викликає дочірній компонент списку:

<?php
// templates/.default/page_templates/list.php
$APPLICATION->IncludeComponent('custom:my.section.list', '', [
    'IBLOCK_ID'     => $arParams['IBLOCK_ID'],
    'SECTION_ID'    => $arResult['VARIABLES']['SECTION_ID'] ?? 0,
    'SECTION_CODE'  => $arResult['VARIABLES']['SECTION_CODE'] ?? '',
    'PAGE_SIZE'     => $arParams['PAGE_SIZE'],
    'CACHE_TIME'    => $arParams['CACHE_TIME'],
    'SET_TITLE'     => 'Y',
    'SET_BROWSER_TITLE' => 'Y',
], $component);

Параметр $component (посилання на батьківський компонент) — критичний. Без нього кеш дочірнього компонента буде незалежним від батьківського, що порушує інвалідацію.

Параметри комплексного компонента

Комплексний компонент об'єднує параметри всіх дочірніх — налаштування пагінації, кеширування, SEF-шаблонів:

// .parameters.php
$arComponentParameters = [
    'GROUPS' => [...],
    'PARAMETERS' => [
        'SEF_MODE' => [
            'NAME'    => 'Режим ЧПУ',
            'TYPE'    => 'CHECKBOX',
            'DEFAULT' => 'Y',
        ],
        'SEF_FOLDER' => [
            'NAME'    => 'Папка для ЧПУ',
            'TYPE'    => 'STRING',
            'DEFAULT' => '/news/',
        ],
        'IBLOCK_ID' => ['...'],
        'PAGE_SIZE' => [
            'NAME'    => 'Елементів на сторінці',
            'TYPE'    => 'STRING',
            'DEFAULT' => '12',
        ],
        'DETAIL_URL'  => ['DEFAULT' => '#SITE_DIR##SECTION_CODE#/#ELEMENT_CODE#/'],
        'SECTION_URL' => ['DEFAULT' => '#SITE_DIR##SECTION_CODE#/'],
        'INDEX_URL'   => ['DEFAULT' => '#SITE_DIR#'],
        // ... SEF-шаблони URL
    ],
];

Обробка помилок і 404

Якщо елемент або розділ не знайдено, комплексний компонент повинен повернути коректну помилку 404:

// У дочернему компоненті detail
if (!$element) {
    LocalRedirect(SITE_DIR . '404.php');
    // або:
    \Bitrix\Main\Response\HttpResponse::create()->setStatus('404 Not Found')->send();
    require(Application::getDocumentRoot() . '/404.php');
    die();
}

Права доступу в комплексних компонентах

Якщо розділ вимагає авторизації (особистий кабінет, B2B), комплексний компонент перевіряє права до виклику дочірніх:

// У component.php
global $USER;
if (!$USER->IsAuthorized()) {
    LocalRedirect(SITE_DIR . 'login/?backurl=' . urlencode($APPLICATION->GetCurPage()));
    die();
}
// Перевірка групи користувача
if (!$USER->IsInGroup($arParams['ALLOWED_GROUP_ID'])) {
    $APPLICATION->SetStatus('403 Forbidden');
    $APPLICATION->RestartBuffer();
    require($_SERVER['DOCUMENT_ROOT'] . '/403.php');
    die();
}

Кеширування в комплексних компонентах

Комплексний компонент сам по собі кешується рідко (логіка диспетчера дешева). Кешуються дочірні. Важливо, що ключ кеша дочірнього компонента включає змінні з URL (ELEMENT_CODE, SECTION_CODE), інакше всі сторінки показуватимуть один і той же кешований результат.

У класі дочірнього компонента:

$cacheId = serialize([
    $arParams['IBLOCK_ID'],
    $arParams['ELEMENT_CODE'],
    $USER->GetGroups(), // різні групи бачать різний контент
    LANGUAGE_ID,
]);
if ($this->StartResultCache($arParams['CACHE_TIME'], $cacheId)) {
    // ...
}

Тестування комплексного компонента

Перед здачею — перевірювальний список:

  • Усі сторінки (список, деталь, розділ) працюють у режимах SEF та параметрів
  • 404 повертається при неіснуючому елементі/розділі
  • Кеш інвалідується при оновленні елемента в адміністративній панелі
  • Компонент працює на всіх сайтах в багатосайтовій установці
  • Хлібні крошки коректно відображаються на всіх типах сторінок

Строки

Тип Що входить Строк
2 типи сторінок (список + деталь) SEF, кеш, параметри, шаблони 1–2 тижні
3–4 типи сторінок + розділ, пошук, права 2–4 тижні
Повнофункціональний розділ (ЛК, каталог) + AJAX, авторизація, фільтри 4–8 тижнів

Комплексний компонент — правильна архітектура для будь-якого розділу сайту з кількома типами сторінок. Це не перестраховка, а необхідна умова для сайтів, які планують підтримку та розвиток.