Меню в системе 1С-Битрикс: общие сведения

1. Классификация навигационных элементов

Навигационная система в 1С-Битрикс реализуется через иерархию типов меню, где каждый тип определяется:

  • Позиционированием (вертикальное/горизонтальное)
  • Уровнем вложенности
  • Источником данных
  • Логикой отображения

Базовые типы (left, right) могут быть расширены через механизм кастомных типов в разделе: Настройки продукта → Настройки модулей → Управление структурой

2. Статическая конфигурация меню

2.1. Структура файла .тип.menu.php

Файлы статического меню содержат массив $aMenuLinks со строго типизированной структурой:

global $USER;
$aMenuLinks = array(
    array(
        'TEXT' => 'Создание сайтов',
        'LINK' => '/services/create-sites/',
        'SELECTED' => array('/current/path/'),
        'PARAMS' => array(
            'IBLOCK_META' => 1,
            'DEPTH_LEVEL' => 1,
            'CSS_CLASS' => 'nav-parent'
        ),
        'CONDITION' => '$USER->IsAuthorized()' // показываем пункт только авторизованному пользователю
        // или показываем пункт только пользователю из группы 9
        'in_array(9, CUser::GetUserGroup(\$GLOBALS[\"USER\"]->GetID()))'
    )
);

Элементы массива:

  1. Текст пункта (string)
  2. Абсолютный/относительный URL (string)
  3. Массив URL-масок для активации пункта (array)
  4. Пользовательские параметры (key-value array)
  5. PHP-выражение для условного отображения (eval)

2.2. Пример структуры массива с подпунктами

.тип.menu.php

<?php
$aMenuLinks = array(
    // Родительский пункт меню
    array(
        "Создание сайтов",
        "/services/create-sites/",
        array("/services/create-sites/"),
        array(
            "FROM_IBLOCK" => 1,
            // Пункт является родительским
            "IS_PARENT" => 1,
            // Уровень вложенности 1
            "DEPTH_LEVEL" => 1
        ),
        ""
    ),
    // Дочерний подпункт
    array(
        "Создание Landing Page",
        "/services/create-sites/landing-page/",
        array("/services/create-sites/landing-page/"),
        array(
            "FROM_IBLOCK" => 1,
            // Пункт не является родительским
            "IS_PARENT" => 0,
            // Уровень вложенности 2
            "DEPTH_LEVEL" => 2
        ),
        ""
    ),
    array(
        "Виды услуг",
        "/services/optimization/",
        array(),
        array(),
        ""
    )
);

2.3. Механизм наследования

Система использует каскадную модель наследования:

/bitrix/php_interface/тип.menu.php 
→ /local/php_interface/тип.menu.php 
→ /section_dir/тип.menu.php

Приоритет имеет файл из текущего раздела. Для переопределения необходимо создать локальную копию с последующей модификацией.

3. Динамическая генерация меню

3.1. Файлы _ext.php

Динамические меню реализуются через файлы .тип.menu_ext.php, которые:

  • Подключаются при активации опции "Использовать динамическое меню"
  • Модифицируют глобальный массив \$aMenuLinks
  • Поддерживают кеширование через API Битрикс

Пример интеграции с инфоблоками:

$aMenuLinksExt = $APPLICATION->IncludeComponent(
    "bitrix:menu.sections",
    "",
    array(
        "IBLOCK_TYPE" => "content",
        "IBLOCK_ID" => 18,
        "DEPTH_LEVEL" => 3,
        "CACHE_TIME" => 3600,
        "SECTION_URL" => "/catalog/#SECTION_CODE#/",
        "SEF_MODE" => "Y"
    )
);
$aMenuLinks = array_merge($aMenuLinksExt, $aMenuLinks);

3.2. Генерация из элементов инфоблока

$rsElements = CIBlockElement::GetList(
    ["SORT" => "ASC"],
    ["IBLOCK_ID" => 24, "ACTIVE" => "Y"],
    false,
    false,
    ["ID", "NAME", "DETAIL_PAGE_URL"]
);

while ($arElement = $rsElements->Fetch()) {
    $aMenuLinksExt[] = array(
        $arElement['NAME'],
        $arElement['DETAIL_PAGE_URL'],
        array(),
        array("ELEMENT_ID" => $arElement['ID']),
        ""
    );
}

4. Расширенные сценарии использования

4.1. Контекстно-зависимое меню

$currentSection = CIBlockSection::GetByID($SECTION_ID)->Fetch();
if ($currentSection['DEPTH_LEVEL'] == 2) {
    $aMenuLinks = CustomMenuBuilder::getNestedMenu($SECTION_ID);
}

4.2. Мультиязычная поддержка

$aMenuLinks = array(
    array(
        GetMessage('MENU_ITEM_1'),
        LANG_DIR.'/services/',
        array(),
        array(),
        ""
    )
);

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