В 1С-Битрикс на индексной странице каталога обычно выводится список разделов инфоблока. За это, как правило, отвечает компонент bitrix:catalog.section.list, который подключается в файле sections.php комплексного компонента каталога.
Но иногда требуется другая логика: вместо разделов нужно вывести товары, которые в административной части Битрикса находятся в значении «Раздел: Верхний уровень».
Важно правильно понять, что означает это значение. Речь идёт не о товарах, которые находятся в разделах первого уровня, а о товарах, которые вообще не привязаны ни к одному разделу инфоблока.
Что значит «Раздел: Верхний уровень» в Битрикс
В админке Битрикса у элементов инфоблока есть фильтр по разделам. Если выбрать значение «Раздел: Верхний уровень», будут показаны элементы, которые не находятся ни в одном разделе.
То есть товар существует в инфоблоке, но не имеет привязки к разделу.
Для выборки таких элементов в коде используется условие:
'SECTION_ID' => falseИменно это условие позволяет получить товары верхнего уровня инфоблока.
Исходная ситуация
В стандартном файле sections.php на индексной странице каталога может быть подключён список разделов:
$APPLICATION->IncludeComponent(
"bitrix:catalog.section.list",
"sections_list",
$sectionListParams,
$component,
($arParams["SHOW_TOP_ELEMENTS"] !== "N" ? array("HIDE_ICONS" => "Y") : array())
);
Такой код выводит именно разделы каталога. Если же нужно вывести товары верхнего уровня, компонент bitrix:catalog.section.list не подходит, потому что он предназначен для вывода списка разделов.
Задача
Нужно изменить поведение индексной страницы каталога только для одного инфоблока, например для инфоблока с ID 65.
Требуемая логика:
Если открыт индекс каталога инфоблока 65, нужно вывести товары, которые не привязаны ни к одному разделу.
Для всех остальных инфоблоков нужно оставить прежнее поведение — вывод списка разделов.
Почему простое подключение catalog.section может сломать стили
На первый взгляд, можно просто подключить компонент bitrix:catalog.section и передать в него фильтр:
$APPLICATION->IncludeComponent(
"bitrix:catalog.section",
"",
array(
"IBLOCK_ID" => $arParams["IBLOCK_ID"],
"FILTER_NAME" => "arrTopLevelProductsFilter",
),
$component
);Но у такого варианта часто возникает проблема: товары выводятся, но выглядят не так, как обычный список элементов каталога.
Причина в том, что второй параметр компонента отвечает за шаблон вывода. Если указать пустую строку "", Битрикс подключит шаблон по умолчанию, а не тот шаблон, который используется на обычной странице раздела.
В результате могут отличаться сетка, отступы, стили карточек, кнопки, цены и другие элементы оформления.
Правильный подход
Лучше не подключать catalog.section вручную с новым шаблоном, а использовать тот же файл вывода, который уже применяется на странице обычного раздела каталога.
Например, в файле section.php комплексного компонента может быть такая логика:
if ($isVerticalFilter)
{
include($_SERVER["DOCUMENT_ROOT"] . "/" . $this->GetFolder() . "/section_vertical.php");
}
else
{
include($_SERVER["DOCUMENT_ROOT"] . "/" . $this->GetFolder() . "/section_horizontal.php");
}
Это значит, что сам файл section.php не выводит карточки товаров напрямую. Он подключает файл section_horizontal.php или section_vertical.php, где уже находится нужный вызов компонента bitrix:catalog.section с правильным шаблоном и нужными CSS-классами.
Поэтому для индексной страницы каталога можно использовать тот же файл, но предварительно задать фильтр по товарам верхнего уровня.
Код для sections.php
В файл sections.php после подключения текстовой области каталога можно добавить условие для инфоблока с ID 65.
<?php
if ((int)$arParams["IBLOCK_ID"] === 65)
{
$GLOBALS["arrTopLevelProductsFilter"] = array(
"IBLOCK_ID" => (int)$arParams["IBLOCK_ID"],
"ACTIVE" => "Y",
"SECTION_ID" => false,
);
$arParams["FILTER_NAME"] = "arrTopLevelProductsFilter";
$arParams["USE_FILTER"] = "N";
$arParams["INCLUDE_SUBSECTIONS"] = "N";
$arParams["SHOW_ALL_WO_SECTION"] = "Y";
$arResult["VARIABLES"]["SECTION_ID"] = 0;
$arResult["VARIABLES"]["SECTION_CODE"] = "";
$arCurSection = array();
include($_SERVER["DOCUMENT_ROOT"] . "/" . $this->GetFolder() . "/section_horizontal.php");
return;
}
?>После этого ниже можно оставить стандартный вывод разделов для остальных инфоблоков:
$APPLICATION->IncludeComponent(
"bitrix:catalog.section.list",
"sections_list",
$sectionListParams,
$component,
($arParams["SHOW_TOP_ELEMENTS"] !== "N" ? array("HIDE_ICONS" => "Y") : array())
);Что делает этот код
Сначала проверяется ID текущего инфоблока:
if ((int)$arParams["IBLOCK_ID"] === 65)
Если это инфоблок 65, создаётся глобальный фильтр:
$GLOBALS["arrTopLevelProductsFilter"] = array(
"IBLOCK_ID" => (int)$arParams["IBLOCK_ID"],
"ACTIVE" => "Y",
"SECTION_ID" => false,
);Главная строка здесь:
"SECTION_ID" => falseОна означает: выбрать товары, которые не привязаны ни к одному разделу инфоблока. Именно такие товары в административной части Битрикса отображаются как элементы из раздела «Верхний уровень».
Далее имя фильтра передаётся в параметры:
$arParams["FILTER_NAME"] = "arrTopLevelProductsFilter";После этого отключается фильтр раздела и подставляются пустые значения текущего раздела:
$arResult["VARIABLES"]["SECTION_ID"] = 0;
$arResult["VARIABLES"]["SECTION_CODE"] = "";Затем подключается тот же файл вывода, который используется на обычной странице раздела:
include($_SERVER["DOCUMENT_ROOT"] . "/" . $this->GetFolder() . "/section_horizontal.php");
В конце используется return, чтобы остановить дальнейшее выполнение файла sections.php и не вывести дополнительно список разделов.
return;Важный момент с FILTER_NAME
Чтобы фильтр действительно применился, в файле section_horizontal.php в вызове компонента bitrix:catalog.section должен передаваться параметр FILTER_NAME.
В параметрах компонента должна быть такая строка:
"FILTER_NAME" => $arParams["FILTER_NAME"],
Если этой строки нет, глобальный фильтр $GLOBALS["arrTopLevelProductsFilter"] не будет использоваться компонентом, и товары могут выводиться неправильно.
Итоговая логика
После доработки логика индексной страницы каталога становится такой:
Для инфоблока с ID 65 выводятся товары, которые находятся в админке в разделе «Верхний уровень», то есть товары без привязки к разделам.
Для всех остальных инфоблоков поведение остаётся прежним: на индексной странице выводится список разделов через компонент bitrix:catalog.section.list.
Преимущество такого решения
Главное преимущество этого подхода в том, что не нужно заново писать стили или подбирать шаблон карточек товара.
Мы используем тот же файл вывода, который уже применяется на странице раздела каталога. Поэтому товары верхнего уровня выглядят так же, как обычный список элементов: сохраняются сетка, карточки, кнопки, цены, отступы и остальные стили шаблона.
Краткое резюме
Если нужно вывести в Битрикс товары из значения «Раздел: Верхний уровень», не нужно искать разделы первого уровня. Такие товары вообще не привязаны к разделам.
Для их выборки используется фильтр:
"SECTION_ID" => false
А чтобы сохранить внешний вид карточек, лучше подключать не новый шаблон catalog.section, а тот же файл вывода, который используется на обычной странице раздела каталога, например section_horizontal.php.



