К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как сделать меню в 1С-Битрикс

Как создать и настроить меню в 1С-Битрикс: типы меню, файлы .menu.php, компонент bitrix:menu, шаблоны, многоуровневые меню и типичные ошибки.

Меню в 1С-Битрикс строится на связке трёх элементов: типа меню, файлов .тип.menu.php в разделах сайта и компонента bitrix:menu, который выводит пункты в шаблоне. Понимание этой связки позволяет собрать как простое одноуровневое меню, так и многоуровневую навигацию с выпадающими подразделами, не прибегая к ручной верстке ссылок.

Основная логика такова: в корне сайта и в каждом разделе лежит файл меню с массивом пунктов, а компонент в шаблоне читает эти файлы снизу вверх и формирует дерево. Пункты можно редактировать через визуальный интерфейс «Редактировать меню» прямо на странице, либо вручную через файловую структуру или административный раздел.

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

Как устроено меню в Битриксе: типы, файлы и компонент

Тип меню — это именованный набор пунктов: например, top для верхнего горизонтального меню и left для бокового. Одна страница может содержать несколько меню разных типов, каждое со своим шаблоном вывода. Список типов задаётся в административном разделе: Настройки → Настройки продукта → Сайты → Список сайтов → открыть нужный сайт → вкладка с полем «Типы меню».

Пункты меню хранятся в файлах вида .top.menu.php (точка, тип меню, слово menu, расширение). Такой файл в корне сайта задаёт пункты верхнего уровня, а одноимённый файл внутри раздела — пункты для этого раздела. Компонент bitrix:menu умеет объединять пункты из файлов разных уровней, формируя дерево заданной глубины.

Важно понимать разницу между статическим и динамическим наполнением. Файлы меню задают пункты вручную, а компонент menu.sections (расширение шаблона) может подставлять разделы инфоблока автоматически — так строятся каталоги, где подпункты меню повторяют структуру товарных разделов.

Создание типа меню и первого файла пунктов

Откройте Настройки → Настройки продукта → Сайты → Список сайтов, выберите сайт и в поле «Типы меню» добавьте нужный тип, например top с пояснением «Верхнее меню». Если тип уже существует в стандартной поставке, этот шаг можно пропустить.

Далее перейдите на публичную страницу сайта, включите режим правки (кнопка «Правка» в панели управления) и наведите курсор на область меню. Появится иконка с пунктом «Редактировать меню» — система создаст файл .top.menu.php в текущем разделе и откроет визуальный редактор, где можно добавить пункты: название, ссылку, условие показа.

Альтернатива — создать файл вручную через Контент → Файлы и папки. Структура файла выглядит так:

<?

$aMenuLinks = Array(

Array(

"Главная",

"/",

Array(),

Array(),

""

),

Array(

"Каталог",

"/catalog/",

Array(),

Array(),

""

),

);

?>

Каждый пункт — это массив из пяти элементов: текст ссылки, URL, массив дополнительных ссылок (для подсветки активного пункта на дочерних страницах), массив параметров и условие на PHP. Если условие возвращает false, пункт не выводится — так скрывают разделы для неавторизованных пользователей.

Порядок создания меню с нуля
  1. 1
    Добавьте тип меню в настройках сайта (Настройки → Сайты → нужный сайт)
  2. 2
    Включите режим правки на публичной странице и выберите «Редактировать меню» или создайте файл .top.menu.php вручную
  3. 3
    Заполните пункты: название, ссылка, при необходимости условие показа
  4. 4
    Разместите компонент bitrix:menu в шаблоне сайта и укажите тип меню
  5. 5
    Проверьте отображение в браузере и сбросьте кеш компонента

Вывод меню компонентом bitrix:menu в шаблоне

Компонент размещают в файле header.php шаблона сайта (для верхнего меню) или в footer.php / колонке (для бокового). В визуальном редакторе он находится в группе «Служебные → Меню». Ключевые параметры вызова:

<?$APPLICATION->IncludeComponent(

"bitrix:menu",

"top_menu",

Array(

"ROOT_MENU_TYPE" => "top",

"MENU_CACHE_TYPE" => "A",

"MAX_LEVEL" => "2",

"CHILD_MENU_TYPE" => "left",

"USE_EXT" => "N",

"DELAY" => "N",

"ALLOW_MULTI_SELECT" => "N"

)

);?>

Параметр ROOT_MENU_TYPE задаёт тип меню корневого уровня, MAX_LEVEL — глубину вложенности, CHILD_MENU_TYPE — тип меню для дочерних уровней. Если MAX_LEVEL равен 1, компонент прочитает только файл корня; при значении 2 и выше он подтянет файлы меню из разделов, совпадающих с URL пунктов первого уровня.

Параметр USE_EXT со значением «Y» включает подключение шаблона menu.sections — так подпункты формируются из разделов инфоблока. Это стандартный способ сделать каталог с автоматически обновляющимся меню: при добавлении раздела в инфоблок пункт появляется в меню без ручной правки файлов.

Многоуровневое меню и меню из разделов инфоблока

Для двухуровневого меню создайте файл дочернего типа (например, .left.menu.php) внутри папки раздела. Например, пункт «Каталог» ведёт на /catalog/ — тогда файл /catalog/.left.menu.php задаст подпункты, которые компонент покажет при MAX_LEVEL = 2 и CHILD_MENU_TYPE = left.

Если подпункты должны совпадать с разделами инфоблока, вместо ручных файлов используют USE_EXT = Y и шаблон menu.sections. В настройках этого шаблона указывают инфоблок и глубину разделов. Условие корректной работы: у пунктов первого уровня URL должен совпадать со страницей раздела инфоблока, иначе компонент не поймёт, к какому пункту привязать дерево.

Проверка результата

После настройки откройте страницу раздела и убедитесь, что подпункты видны, активный пункт подсвечен, а при переходе в соседний раздел дерево перестраивается корректно. Проверьте также страницу детального элемента: частая проблема — меню «схлопывается» до первого уровня, потому что URL элемента не совпадает с URL раздела.

Контрольные точки

Как проверить работу меню

Отображение пунктов
Норма

Все пункты из файла .menu.php видны на странице

Тревожный признак

Часть пунктов пропала — проверьте условия показа и кеш

Подсветка активного пункта
Норма

Текущий раздел выделен, включая дочерние страницы

Тревожный признак

Подсветка пропадает на внутренних страницах — добавьте URL в массив дополнительных ссылок пункта

Вложенность
Норма

Подпункты раздела выводятся на нужной глубине

Тревожный признак

Подпунктов нет — проверьте MAX_LEVEL, CHILD_MENU_TYPE и наличие файла меню в папке раздела

Кастомизация шаблона меню

Стандартный шаблон компонента выводит простой список. Чтобы изменить вёрстку, скопируйте шаблон через кнопку «Копировать шаблон» в режиме правки — он попадёт в папку /local/templates/ваш_шаблон/components/bitrix/menu/имя_шаблона/. Основной файл — template.php, где в массиве $arResult доступны пункты с полями TEXT, LINK, SELECTED, DEPTH_LEVEL и IS_PARENT.

Дополнительные поля пунктов (иконки, картинки, CSS-классы) задаются через файл .тип.menu_ext.php в разделе или через параметры пункта в массиве $aMenuLinks. В шаблоне они доступны в массиве PARAMS каждого пункта. Это безопасный путь: вы не меняете ядро компонента, и обновления Битрикса не затронут вашу кастомизацию.

Типичные ошибки и их устранение

Чаще всего меню не выводится из-за несовпадения типа меню в файле и в параметрах компонента: файл называется .top.menu.php, а в ROOT_MENU_TYPE указано main. Вторая частая причина — кеш: компонент закешировал пустой результат, и новые пункты не появляются до сброса кеша.

Ещё одна проблема — права доступа. Если пункт ведёт в закрытый раздел, а условие показа не задано, неавторизованный посетитель увидит ссылку на страницу авторизации. Проверяйте меню в режиме инкогнито, чтобы увидеть картину глазами гостя.

Типичные ошибки
01
Несовпадение имени файла и типа меню в компоненте — меню выводится пустым
02
Забытый сброс кеша после правки .menu.php — изменения не видны на сайте
03
MAX_LEVEL = 1 при наличии дочерних файлов меню — подпункты не появляются
04
Правка шаблона компонента в папке /bitrix/ — изменения теряются при обновлении
05
URL пункта не совпадает со страницей раздела инфоблока — menu.sections не подставляет подразделы

FAQ

Как скрыть пункт меню от неавторизованных пользователей?

В пятом элементе массива пункта задайте условие, например $USER->IsAuthorized(). Если выражение возвращает false, пункт не попадёт в результат компонента. Аналогично можно проверять группу пользователя через $USER->InGroup().

Почему меню не обновляется после правки файла .menu.php?

Компонент bitrix:menu кеширует результат. Сбросьте кеш через кнопку «Сбросить кеш» в панели управления на странице или через Настройки → Автокеширование. Если меню собирается из инфоблока, дополнительно проверьте кеш самого инфоблока.

Как сделать разные меню для разных разделов сайта?

Создайте отдельный тип меню для каждой зоны и разместите в шаблоне несколько вызовов bitrix:menu с разными ROOT_MENU_TYPE. Либо используйте один тип, но кладите разные файлы .menu.php в папки разделов — компонент подтянет файл, ближайший к текущей странице.

Можно ли сделать меню из страниц, а не из файлов?

Да, в визуальном редакторе меню есть кнопка «Вставить пункты из структуры» — она автоматически добавляет пункты по файлам и папкам раздела. Для полностью автоматического меню по инфоблоку используйте USE_EXT = Y и шаблон menu.sections.

Как добавить иконку или картинку к пункту меню?

Передайте путь к картинке в четвёртом элементе массива пункта (PARAMS), например Array("ICON" => "/images/icon.png"), и выведите значение в кастомном шаблоне через $arItem["PARAMS"]["ICON"]. Альтернатива — файл .тип.menu_ext.php, где можно расширить пункты произвольными полями.

Меню пропадает на странице детального элемента каталога. Что делать?

Причина обычно в том, что URL элемента не совпадает с URL раздела, к которому привязан пункт. Убедитесь, что в настройках ЧПУ инфоблока адрес элемента строится внутри адреса раздела, и проверьте, что компонент меню размещён в общем шаблоне, а не в шаблоне конкретной страницы.

Итог

Что важно запомнить

Меню в Битриксе — это тип меню, файлы .тип.menu.php в разделах и компонент bitrix:menu в шаблоне. Настройте тип, заполните пункты, укажите глубину и тип дочернего меню, кастомизируйте только скопированный шаблон и не забывайте сбрасывать кеш после правок.