Отключаем ненужные свойства инфоблоков из выборки — компонент должен брать только то, что действительно выводит
Хочу себе такие же кнопкиЧто вы узнаете и почему это важно
В Bitrix — этоиноблоки — мозг любого каталога, новостей или любого списка товаров. Если из инфоблока в компонент попадает лишняя информация, сервер тратит время и память на её обработку, а ваш сайт «тормозит». Мы покажем, как отключить ненужные свойства инфоблоков в выборке, чтобы компонент получал только те поля, которые действительно выводятся на странице. Вы увидите, как ускорить запросы, снизить нагрузку на VDS и улучшить пользовательский опыт без потери функциональности.
1. Почему «все свойства» — это плохая идея
| Сценарий | Что происходит в БД | Последствия |
|---|---|---|
Вы запрашиваете полный список свойств (SELECT * FROM b_iblock_element_prop_sX) |
СУБД читает каждое свойство, даже если в шаблоне его нет | Увеличивается время выполнения запроса, растёт объём передаваемых данных, рост нагрузки на CPU и ОЗУ |
| На странице выводятся только название и цена | Остальные свойства (цвет, размер, артикул…) остаются «позади» | Память тратится зря, а пользователю не видно выгоды от этих данных |
Аналогия: представьте, что вы готовите салат и берёте все овощи из холодильника, а потом выбрасываете всё, кроме помидоров и огурцов. Время готовки растёт, а вкус тот же. Точно так же в Bitrix — чем меньше полей в запросе, тем быстрее работает сайт.
2. Основные понятия
| Термин | Описание |
|---|---|
| Инфоблок | Хранилище элементов (товары, статьи) с набором свойств |
| Свойство | Дополнительный атрибут элемента (цвет, вес, бренд) |
| Компонент | PHP‑модуль, который получает данные из инфоблока и выводит их |
Select‑массив |
Список полей, которые компонент запрашивает у БД |
Cache |
Кеширование результатов запросов, ускоряющее повторные обращения |
3. Как «отключить» свойства в компоненте
3.1. Стандартный способ (по‑умолчанию)
$arSelect = array("*"); // выбираем всё
$arFilter = array("IBLOCK_ID"=>5);
$res = CIBlockElement::GetList(
array(),
$arFilter,
false,
false,
$arSelect
);
"*" заставляет ядро собрать все поля и свойства. Это удобно, но в продакшене почти всегда избыточно.
3.2. Явное указание нужных полей
$arSelect = array(
"ID",
"NAME",
"DETAIL_PAGE_URL",
"PROPERTY_PRICE", // только цена
"PROPERTY_PHOTO", // только фото
);
Не забудьте добавить свойства, которые действительно выводятся в шаблоне. Если в шаблоне вы выводите PROPERTY_PRICE и PROPERTY_PHOTO, а в $arSelect их нет, то в $arResult они будут пустыми.
3.3. Отключение «лишних» свойств через CUserFieldEnum::GetList
Если вам нужно полностью отключить свойство в инфоблоке (чтобы оно не загружалось ни в каком запросе), можно использовать параметр PROPERTY_CODE в CIBlockElement::GetList:
$arSelect = array("ID","NAME","DETAIL_PAGE_URL");
$arFilter = array(
"IBLOCK_ID"=>5,
"ACTIVE"=>"Y",
);
$propertyCodes = array("PRICE","PHOTO"); // только нужные свойства
$res = CIBlockElement::GetList(
array(),
$arFilter,
false,
false,
$arSelect,
array("PROPERTY_CODE"=>$propertyCodes)
);
Зачем это нужно? Если в инфоблоке сотни свойств, а вам нужны только два, такой запрос экономит десятки мегабайт трафика.
3.4. Кеширование запросов
$cache = new CPHPCache();
$cacheTime = 3600; // 1 час
$cacheId = "my_block_5_price_photo_".LANGUAGE_ID;
$cachePath = "/my_component/";
if($cache->InitCache($cacheTime, $cacheId, $cachePath)) {
$arResult = $cache->GetVars();
} else {
$cache->StartDataCache();
$res = CIBlockElement::GetList(...);
while($ob = $res->GetNextElement()){
$arResult[] = $ob->GetFields();
}
$cache->EndDataCache($arResult);
}
Кеш хранит уже отфильтрованный набор данных, поэтому при повторных запросах сервер сразу отдаёт готовый массив без обращения к БД.
4. Практический пример: каталог товаров
4.1. Что выводим в шаблоне
<h2><?= $item["NAME"] ?></h2>
<p>Цена: <?= $item["PROPERTY_PRICE_VALUE"] ?> ₽</p>
<img src="<?= $item["PROPERTY_PHOTO_VALUE"] ?>" alt="">
Только NAME, PROPERTY_PRICE, PROPERTY_PHOTO нужны.
4.2. Минимальный Select‑массив
$arSelect = array(
"ID",
"NAME",
"DETAIL_PAGE_URL",
"PROPERTY_PRICE",
"PROPERTY_PHOTO"
);
4.3. Полный код компонента
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$iblockId = 5; // ваш инфоблок
$arSelect = array("ID","NAME","DETAIL_PAGE_URL","PROPERTY_PRICE","PROPERTY_PHOTO");
$arFilter = array("IBLOCK_ID"=>$iblockId,"ACTIVE"=>"Y");
// Кеш
$cache = new CPHPCache();
$cacheTime = 7200; // 2 часа
$cacheId = "catalog_{$iblockId}_".LANGUAGE_ID;
$cachePath = "/catalog/";
if($cache->InitCache($cacheTime,$cacheId,$cachePath)){
$arResult = $cache->GetVars();
}else{
$cache->StartDataCache();
$res = CIBlockElement::GetList(array("SORT"=>"ASC"),$arFilter,false,false,$arSelect);
while($ob = $res->GetNextElement()){
$arResult[] = $ob->GetFields();
}
$cache->EndDataCache($arResult);
}
// Передаём в шаблон
$this->IncludeComponentTemplate();
?>
4.4. Что происходит под капотом
-
Select‑массив ограничивает запрос только нужными колонками. -
GetListформирует SQL‑запрос вида:SELECT ID, NAME, DETAIL_PAGE_URL, PROPERTY_5_PRICE, PROPERTY_5_PHOTO FROM b_iblock_element WHERE IBLOCK_ID = 5 AND ACTIVE = 'Y' ORDER BY SORT ASC -
Кеш сохраняет полученный массив
$arResult. При следующем запросе (в пределах 2 часов) БД не задействуется.
5. Как проверить, что лишних полей действительно нет
| Шаг | Действие | Что искать |
|---|---|---|
| 1 | Включить SHOW_SQL в php.ini или использовать debug‑модуль |
Длинный запрос с * → должен быть коротким с перечисленными полями |
| 2 | Посмотреть $_SERVER["REQUEST_TIME_FLOAT"] до и после запроса |
Разница в миллисекундах, чем меньше — тем лучше |
| 3 | Открыть /bitrix/admin/iblock_element_edit.php и посмотреть $arResult в debug‑консоли |
Нет полей, которых нет в шаблоне |
Если в запросе всё ещё появляются ненужные свойства, проверьте, нет ли в шаблоне скрытого обращения к $item["PROPERTY_..."].
6. Частые ошибки и как их избежать
| Ошибка | Почему происходит | Как исправить |
|---|---|---|
PROPERTY_..._VALUE пустой |
Свойство не включено в Select |
Добавьте нужное свойство в массив $arSelect |
| Кеш не обновляется после добавления нового свойства | Кеш‑ид не меняется | Включите в cacheId хеш списка свойств, например md5(implode(',',$arSelect)) |
| Запрос всё равно медленный | Фильтры ($arFilter) слишком общие, нет индексов |
Добавьте индексы в БД по полям IBLOCK_ID, ACTIVE, PROPERTY_... |
Свойство не выводится, хотя указано в Select |
В шаблоне используется другое имя (PROPERTY_..._DESCRIPTION) |
Проверьте, какое конкретно поле вам нужно (VALUE, DESCRIPTION, ENUM_ID) и укажите его в Select |
7. Лучшие практики
| Практика | Описание |
|---|---|
| Явно перечисляйте свойства | Никогда не используйте "*" в продакшене |
| Группируйте запросы | Если на странице несколько компонентов, объединяйте их запросы в один, используя CIBlockElement::GetList с объединённым Select |
| Контролируйте кеш | Делайте cacheId уникальным для каждой комбинации свойств и фильтров |
| Профилируйте | Регулярно проверяйте SHOW_SQL и время выполнения запросов |
| Обновляйте индексы | После добавления новых свойств или изменения структуры инфоблока переиндексируйте таблицы |
Практика для закрепления
- Выберите инфоблок с минимум пятью свойствами (цвет, размер, бренд, цена, изображение). Составьте массив
$arSelect, который будет содержать только те свойства, которые выводятся в шаблоне (название, цена, изображение). - Измените существующий компонент (например,
catalog.section) так, чтобы он использовал ваш$arSelect. Проверьте в логах, что запрос к БД больше не содержитPROPERTY_COLORиPROPERTY_BRAND. - Добавьте кеш с временем жизни 30 минут и убедитесь, что после первого запроса в логах нет новых SQL‑запросов.
- Сравните производительность: измерьте время выполнения страницы до и после оптимизации (используйте
microtime(true)до и послеCIBlockElement::GetList). Запишите разницу. - Создайте тестовый шаблон, в котором выводятся только
NAMEиPRICE. Попробуйте добавить в$arSelectсвойствоPROPERTY_WEIGHT, но не выводите его в шаблоне. Что изменится в запросе и в времени выполнения? Объясните, почему.
Следуя этим шагам, вы избавитесь от лишних данных в выборке, ускорите работу сайта на Bitrix и снизите нагрузку на ваш VDS‑сервер. Удачной оптимизации!
CamZamZam - онлайн фото с вебкамеры с эффектами
Cartoon Network: игры с персонажами
Чат рулетка в 2026: будущие функции
Эксперт по доменным стратегическим решениям
Хостинг для e-commerce проектов
Как играть в слоты
Как настроить CDN для сайта на хостинге Host.bg
Как настроить SSL-сертификат для сайта на Host.bg
Как оптимизировать производительность сайта с хостингом Host.bg
Как выбрать правильный хостинг для вашего сайта
Какие бывают ЛОР болезни у детей
Кассовые терминалы с оплатой картами
LOL куклы витрина детская
Лучшие видеорегистраторы для водителей
Онлайн QR-код сканер
Онлайн-связь
Оптимизация производительности баз данных на хостинге Host.bg
Основы настройки веб-хостинга: что вам нужно знать
Партнёрская программа без блога: как получать трафик из Telegram
Профессиональные хитрости для пользователей хостинга Host.bg
Регистрация ИП в Москве для иностранных граждан
Сравнение хостинга Host.bg с другими провайдерами
Субтитры — нет, уши — включены: погружение в английский за 5 минут
Сумки с бусинами
Техника для строительства загородных трасс
ТОП-10 VPS для разработчика: рейтинг серверов под рабочие задачи
WordPress блог для бизнеса