В работе с CMS 1С-Битрикс часто возникает необходимость управления привязками элементов к разделам. Например, бывает нужно удалить элементы, которые старше определенного срока, из определенного раздела, или наоборот — добавить элементы в нужные разделы. В этой статье мы разберем, как получить список разделов, к которым привязан элемент, и обновить эту привязку.

Шаг 1: Получение списка элементов по фильтру
Для того чтобы извлечь элементы, соответствующие определенному критерию (например, элементы, созданные более 3 месяцев назад и привязанные к разделу "Новинки"), мы используем метод CIBlockElement::GetList
. Фильтрация будет происходить по дате создания элементов и идентификатору раздела.
Пример кода для фильтрации элементов:
$section_new = 123; // Идентификатор раздела "Новинки"
$objDateTime = new \Bitrix\Main\Type\DateTime();
$objDateTime->add('-3 month'); // Устанавливаем фильтр по дате, элементы старше 3 месяцев
$arSelect = array("ID", "IBLOCK_ID", "PROPERTY_CATEG"); // Список полей, которые нам нужно получить
$arFilter = array(
"IBLOCK_ID" => CATALOG_IBLOCK_ID, // Идентификатор инфоблока
"ACTIVE" => "Y", // Только активные элементы
">DATE_CREATE" => $objDateTime->format("Y-m-d"), // Дата создания больше 3 месяцев назад
"SECTION_ID" => array($section_new) // Элементы, привязанные к разделу "Новинки"
);
$res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect); // Выполняем запрос
$elIds = [];
while($ob = $res->GetNextElement()){
$arFields = $ob->GetFields();
$elIds[] = $arFields['ID']; // Собираем ID элементов в массив
}
В данном примере мы отфильтровываем элементы по их дате создания и привязке к разделу "Новинки". Для фильтрации по разделу используем параметр SECTION_ID
, который принимает массив значений, если нам нужно выбрать элементы, привязанные хотя бы к одному из указанных разделов.
Шаг 2: Получение привязанных разделов для каждого элемента
После того как мы получили ID нужных элементов, следующим шагом будет получение списка разделов, к которым привязан каждый элемент. Для этого используется метод CIBlockElement::GetElementGroups
.
Пример кода:
// Получаем список привязанных разделов для каждого элемента
if (!empty($elIds)) {
$result = CIBlockElement::GetElementGroups($elIds, true, array('ID', 'IBLOCK_ELEMENT_ID')); // Получаем группы разделов
$arElUpdSect = [];
while ($ar = $result->Fetch()) {
$arElUpdSect[$ar['IBLOCK_ELEMENT_ID']][] = $ar['ID']; // Формируем массив с ID разделов
}
$bs = new CIBlockElement;
foreach ($elIds as $elId) {
// Удаляем раздел "Новинки", если он присутствует
if (count($arElUpdSect[$elId]) > 1 && ($key = array_search($section_new, $arElUpdSect[$elId]))) {
unset($arElUpdSect[$elId][$key]); // Удаляем из массива ID раздела "Новинки"
// Обновляем список разделов для элемента
$arUpdFields['IBLOCK_SECTION'] = $arElUpdSect[$elId]; // Новый массив с привязками
$bs->Update($elId, $arUpdFields, 'N', true, true); // Обновляем элемент
}
}
}
В этом фрагменте кода для каждого элемента мы получаем все разделы, к которым он привязан, и из этого списка удаляем раздел "Новинки", если элемент был к нему привязан. Затем с помощью метода Update
обновляем привязку элемента к оставшимся разделам.
Шаг 3: Метод CIBlockElement::GetElementGroups
Метод GetElementGroups
используется для получения всех разделов, в которых находится элемент. Этот метод возвращает результат, который содержит информацию о разделах, а также дополнительную информацию о самих элементах.
Пример кода функции GetElementGroups
:
public static function GetElementGroups($ID, $bElementOnly = false, $arSelect = array())
{
global $DB;
$arFields = array(
"ID" => "BS.ID",
"NAME" => "BS.NAME",
"IBLOCK_SECTION_ID" => "BS.IBLOCK_SECTION_ID",
"IBLOCK_ID" => "BS.IBLOCK_ID",
"ACTIVE" => "BS.ACTIVE",
"SORT" => "BS.SORT"
);
if (is_array($ID)) {
Main\Type\Collection::normalizeArrayValuesByInt($ID);
$sqlID = !empty($ID) ? $ID : array(0);
} else {
$sqlID = array((int)$ID);
}
$arSqlSelect = array();
foreach ($arSelect as &$field) {
$field = mb_strtoupper($field);
if (array_key_exists($field, $arFields)) {
$arSqlSelect[$field] = $arFields[$field] . " AS " . $field;
}
}
$strSelect = implode(", ", $arSqlSelect) ?: "BS.*";
$dbr = new CIBlockResult($DB->Query("
SELECT $strSelect
FROM b_iblock_section_element SE
INNER JOIN b_iblock_section BS ON SE.IBLOCK_SECTION_ID = BS.ID
WHERE SE.IBLOCK_ELEMENT_ID in (" . implode(", ", $sqlID) . ")
"));
return $dbr;
}
Этот метод извлекает информацию о разделах для элементов, переданных в качестве параметра. В нем формируется SQL-запрос, который возвращает все привязки элементов к разделам, а затем результат обрабатывается и возвращается как объект CIBlockResult
.
Заключение
Работа с привязками элементов к разделам в 1С-Битрикс является важной частью разработки на этой платформе. С помощью описанных методов можно легко получать, изменять и обновлять привязки элементов к разделам, что полезно, например, для управления контентом, очистки старых элементов или организации динамических изменений на сайте.
Важно помнить, что для эффективной работы с большими объемами данных, всегда стоит оптимизировать запросы и минимизировать количество операций с базой данных, чтобы не перегружать систему.