В системе 1С-Битрикс инфоблоки играют важную роль в хранении и управлении контентом на сайте. С появлением технологии Инфоблоков 2.0, разработчики получили новые возможности для улучшения работы с инфоблоками, повысив их производительность и упростив процессы работы с данными. В этой статье мы рассмотрим, что такое Инфоблоки 2.0, их преимущества, ограничения и примеры использования.

Что такое Инфоблоки 2.0?
Инфоблоки 2.0 — это обновленный способ хранения данных в системе 1С-Битрикс, при котором все значения свойств элементов инфоблока хранятся в одной строке. Это позволяет избежать лишних запросов и значительных накладных расходов на соединения с базой данных. В отличие от предыдущей версии инфоблоков, где для получения свойств элементов приходилось выполнять дополнительные запросы, в Инфоблоках 2.0 можно получить все необходимые данные за один запрос.
Преимущества использования Инфоблоков 2.0
- Ускоренная выборка данных: Все значения свойств одного элемента хранятся в одной строке таблицы, что исключает необходимость присоединять дополнительные таблицы при выборке данных. Это значительно ускоряет работу системы, особенно при работе с большим количеством элементов и свойств.
- Уменьшение нагрузки на базу данных: При фильтрации по свойствам количество присоединяемых таблиц остается постоянным и не увеличивается с каждым свойством. Таким образом, нагрузка на базу данных минимизируется.
- Работа с множественными свойствами: При использовании Инфоблоков 2.0 выборка значений множественных свойств не приводит к созданию декартова произведения. Значения свойств передаются в виде массива, что значительно улучшает производительность.
- Поддержка составных индексов: Для ускорения операций выборки по составным фильтрам можно вручную создавать индексы базы данных, что также помогает повысить эффективность работы с данными.
Основные особенности Инфоблоков 2.0
1. Хранение данных и метаданных
В Инфоблоках 2.0 все свойства элемента хранятся в одной таблице с помощью метаданных. Это упрощает управление и изменение информации, так как можно легко обновить метаинформацию, не затронув саму структуру данных. Если свойство меняет свой тип, например, с числа на строку, то происходит изменение типа хранения в базе данных, что позволяет избежать ошибок при обработке данных.
2. Уровни хранения данных
Инфоблоки 2.0 используют разные таблицы для хранения значений свойств, разделяя данные по типу свойств: для множественных и единичных значений. При этом используется несколько таблиц:
- b_iblock_element_prop_mNN — хранит множественные свойства.
- b_iblock_element_prop_sNN — хранит единичные свойства.
Такая структура позволяет эффективно управлять данными и избегать избыточных записей.
3. Конвертация и переход на Инфоблоки 2.0
При переходе на Инфоблоки 2.0 необходимо учитывать, что процесс конвертации может занять некоторое время в зависимости от объема данных. Особенно это важно при наличии большого числа свойств или элементов. Важно, что перевод из обычных инфоблоков в Инфоблоки 2.0 невозможен, если количество свойств превышает 50.
Как достичь максимальной эффективности при использовании Инфоблоков 2.0?
Для того чтобы максимально эффективно использовать преимущества новой структуры хранения данных, необходимо внести несколько изменений в логику работы компонентов.
Пример использования Инфоблоков 2.0
Рассмотрим, как изменится код при переходе на Инфоблоки 2.0. До этого разработчики использовали такой подход для получения данных элементов:
<?php
$arSelect = array(
"ID",
"IBLOCK_ID",
"IBLOCK_SECTION_ID",
"NAME",
"PREVIEW_PICTURE",
"DETAIL_PICTURE",
"DETAIL_PAGE_URL",
);
if($rsElements = GetIBlockElementListEx($IBLOCK_TYPE, false, false, array($ELEMENT_SORT_FIELD => $ELEMENT_SORT_ORDER), $ELEMENT_COUNT, $arFilter, $arSelect)) {
$rsElements->NavStart($ELEMENT_COUNT);
$count = intval($rsElements->SelectedRowsCount());
if ($count > 0) {
while ($obElement = $rsElements->GetNextElement()) {
$arElement = $obElement->GetFields();
$arProperty = $obElement->GetProperties();
echo $arProperty["SOURCE"], "<br>";
}
}
}
?>
В этом примере мы сначала выполняем запрос для получения списка элементов инфоблока. После этого в цикле обрабатываем каждый элемент и выполняем дополнительный запрос, чтобы получить его свойства через метод GetProperties()
. В этом подходе происходит два запроса для каждого элемента: один для получения самого элемента, второй — для его свойств.
Теперь, с использованием Инфоблоков 2.0, можно уменьшить количество запросов и выбрать все нужные данные в одном запросе:
<?php
$arSelect = array(
"ID",
"IBLOCK_ID",
"IBLOCK_SECTION_ID",
"NAME",
"PREVIEW_PICTURE",
"DETAIL_PICTURE",
"DETAIL_PAGE_URL",
"PROPERTY_SOURCE", // Выбираем нужное свойство
);
if($rsElements = GetIBlockElementListEx($IBLOCK_TYPE, false, false, array($ELEMENT_SORT_FIELD => $ELEMENT_SORT_ORDER), Array("nPageSize" => $ELEMENT_COUNT), $arFilter, $arSelect)) {
$rsElements->NavStart($ELEMENT_COUNT);
if($obElement = $rsElements->GetNextElement()) {
do {
$arElement = $obElement->GetFields();
echo $arElement["PROPERTY_SOURCE"], "<br>";
} while ($obElement = $rsElements->GetNextElement());
}
}
?>
Отличия между кодами
- До перехода на Инфоблоки 2.0: Для каждого элемента инфоблока выполняется два запроса. Сначала один для получения самого элемента (
GetIBlockElementListEx
), а затем второй для получения его свойств (GetProperties
). Это может привести к значительным накладным расходам при большом количестве элементов. - После перехода на Инфоблоки 2.0: В одном запросе выбираются все нужные данные, включая значения свойств, с помощью параметра
PROPERTY_SOURCE
. Это позволяет уменьшить количество запросов и значительно улучшить производительность, так как все данные для элементов получаются за один запрос.
Пример работы с множественными свойствами
Если вам нужно работать с множественными свойствами, Инфоблоки 2.0 также позволяют упростить обработку. Допустим, у вас есть множественное свойство, которое хранит несколько значений. Ранее для получения всех значений этого свойства для каждого элемента приходилось выполнять дополнительные запросы.
Теперь в Инфоблоках 2.0 все значения множественных свойств передаются в виде массива, и вы можете работать с ними без необходимости делать дополнительные запросы. Пример:
<?php
$arSelect = array(
"ID",
"IBLOCK_ID",
"NAME",
"PROPERTY_MANY_VALUES", // Множественное свойство
);
if($rsElements = GetIBlockElementListEx($IBLOCK_TYPE, false, false, array($ELEMENT_SORT_FIELD => $ELEMENT_SORT_ORDER), Array("nPageSize" => $ELEMENT_COUNT), $arFilter, $arSelect)) {
$rsElements->NavStart($ELEMENT_COUNT);
if($obElement = $rsElements->GetNextElement()) {
do {
$arElement = $obElement->GetFields();
$arProperty = $obElement->GetProperties();
$values = $arProperty["MANY_VALUES"]["VALUE"]; // Получаем все значения множественного свойства
foreach($values as $value) {
echo $value, "<br>";
}
} while ($obElement = $rsElements->GetNextElement());
}
}
?>
В этом примере мы выбираем все значения множественного свойства PROPERTY_MANY_VALUES
, и выводим их в цикле. Все значения получаются за один запрос, что значительно улучшает производительность.
Пример фильтрации данных
Использование составных индексов в Инфоблоках 2.0 позволяет ускорить выборку данных по комбинированным фильтрам. Например, если нужно отфильтровать элементы по нескольким свойствам, можно создать составной индекс в базе данных для ускорения выборки:
<?php
$arSelect = array(
"ID",
"NAME",
"PROPERTY_CATEGORY",
"PROPERTY_PRICE",
);
$arFilter = array(
"PROPERTY_CATEGORY" => "Electronics",
"PROPERTY_PRICE" => 1000,
);
if($rsElements = GetIBlockElementListEx($IBLOCK_TYPE, false, false, array($ELEMENT_SORT_FIELD => $ELEMENT_SORT_ORDER), Array("nPageSize" => $ELEMENT_COUNT), $arFilter, $arSelect)) {
$rsElements->NavStart($ELEMENT_COUNT);
if($obElement = $rsElements->GetNextElement()) {
do {
$arElement = $obElement->GetFields();
echo $arElement["NAME"], "<br>";
} while ($obElement = $rsElements->GetNextElement());
}
}
?>
В данном примере мы фильтруем элементы по двум свойствам: категории и цене. Используя составные индексы, мы можем ускорить выборку данных, особенно если фильтрация по таким свойствам выполняется часто.
Ограничения и потенциальные проблемы
Несмотря на многочисленные преимущества, Инфоблоки 2.0 имеют свои ограничения. Например, существует физическое ограничение на количество свойств в одном инфоблоке, что может привести к ошибкам при превышении этого лимита. Также важно помнить, что перевод из обычных инфоблоков в Инфоблоки 2.0 невозможен при большом количестве свойств.
Заключение
Инфоблоки 2.0 в 1С-Битрикс предоставляют разработчикам новые возможности для повышения производительности и улучшения работы с данными. Они позволяют упростить работу с большими объемами контента, ускорить выборку данных и минимизировать нагрузку на сервер. Однако для достижения максимальной эффективности важно учитывать особенности этой технологии и правильно настраивать компоненты и фильтры.