Типичная задача: на страницу приходит ID элемента в адресе (?ID=42), и по нему нужно вывести поля и свойства элемента инфоблока – без готового компонента, своим кодом. Приём ниже был актуален ещё в 2019 году и остаётся рабочим в 2026-м. Но у него есть два важных нюанса, о которых умалчивал исходный сниппет: безопасность GET-параметра и правильный способ обхода результата, чтобы не задвоить элементы с множественными свойствами.
Шаг 1. Подключаем модуль и безопасно читаем ID из GET
Первое правило работы с $_GET – никогда не подставлять сырое значение в запрос. ID всегда целое число, поэтому приводим его через intval() (или в новых версиях через (int)). Это защищает от SQL-инъекций и мусора в параметре.
if (!CModule::IncludeModule("iblock")) { // проверяем и подключаем модуль инфоблоков
return;
}
$elementId = (int) ($_REQUEST["ID"] ?? 0);
if ($elementId <= 0) {
return; // некорректный или пустой ID – выходим
}
Шаг 2. Узнаём IBLOCK_ID элемента
Чтобы выбрать элемент с фильтром по инфоблоку, нужен его IBLOCK_ID. Его отдаёт CIBlockElement::GetByID():
$rsElement = CIBlockElement::GetByID($elementId);
if (!($arElement = $rsElement->GetNext())) {
return; // элемент с таким ID не найден
}
$iblockId = (int) $arElement["IBLOCK_ID"];
Проверка результата обязательна: если элемента нет, GetNext() вернёт false, и дальше выбирать нечего. Исходный код 2019 года этой проверки не делал – в актуальной версии её стоит добавить.
Шаг 3. Выбираем поля и свойства через GetNextElement
Ключевой момент. Если у элемента есть множественные свойства и обходить выборку обычным GetNext(), элемент задвоится – по строке на каждое значение множественного свойства. Чтобы этого избежать, используют GetNextElement() и методы объекта GetFields() / GetProperties():
$arFilter = [
"IBLOCK_ID" => $iblockId,
"ID" => $elementId,
"ACTIVE_DATE" => "Y",
"ACTIVE" => "Y",
];
// $arSelect можно не задавать: GetFields()/GetProperties() и так вернут все данные элемента
$res = CIBlockElement::GetList([], $arFilter, false, false, ["ID", "IBLOCK_ID", "NAME", "DATE_ACTIVE_FROM"]);
while ($ob = $res->GetNextElement()) {
$arFields = $ob->GetFields(); // все поля элемента
$arProps = $ob->GetProperties(); // все свойства элемента
echo htmlspecialcharsbx($arFields["NAME"]);
// пример: значение свойства с кодом COLOR
echo htmlspecialcharsbx($arProps["COLOR"]["VALUE"]);
}
Почему именно GetNextElement, а не GetNext
GetNext() отдаёт плоскую строку выборки, и при множественных свойствах SQL-join размножает элемент. GetNextElement() возвращает объект _CIBElement, у которого GetProperties() отдельным запросом собирает все значения свойства в один массив. Итог – один элемент, все его множественные значения на месте, без дублей.
Про $arSelect и лишние данные
При использовании GetFields()/GetProperties() перечислять поля в $arSelect необязательно – методы объекта всё равно догружают полный набор. Но если вам нужны только имя и дата, экономнее выбрать поля через обычный GetNext() и не дёргать свойства вовсе.
Современная альтернатива на D7 (ORM)
В актуальных версиях Битрикса ту же выборку можно сделать через ORM-таблицу инфоблоков, включив нужные свойства в select:
use Bitrix\Iblock\ElementTable;
$element = ElementTable::getRow([
'select' => ['ID', 'NAME', 'IBLOCK_ID', 'ACTIVE_FROM'],
'filter' => ['=ID' => $elementId, '=ACTIVE' => 'Y'],
]);
Для чтения значений свойств удобны сущности \Bitrix\Iblock\Elements\ElementXxxTable (генерируются под конкретный инфоблок) или классический API. Оба варианта валидны – CIBlockElement::GetList в 2026 году никто не отменял, а ORM даёт типизацию и цепочечный синтаксис.
Частые ошибки
- Сырой $_GET в запросе. Всегда приводите ID к
(int)– это и безопасность, и предсказуемость. - GetNext вместо GetNextElement при множественных свойствах. Получите задвоенные элементы.
- Нет проверки результата. Если элемент не найден, обращение к полям вызовет ошибку – проверяйте
GetNext()/getRow()на пустоту. - Вывод без экранирования. Значения из БД пропускайте через
htmlspecialcharsbx().
Дальше по теме: как вывести одно конкретное поле элемента, как посчитать все элементы инфоблока и как достать название из свойства типа «Справочник».