Перейти к содержанию
Инструкция

Получить ID из GET и вывести элементы и свойства инфоблока

Как в 1С-Битрикс взять ID элемента из GET-параметра, безопасно его отфильтровать и выбрать поля и свойства элемента инфоблока. Разбираем GetNextElement, защиту от дублей при множественных свойствах и D7-альтернативу.

Обновлено 22 июля 8 минут чтения

Типичная задача: на страницу приходит 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().

Дальше по теме: как вывести одно конкретное поле элемента, как посчитать все элементы инфоблока и как достать название из свойства типа «Справочник».

Частые вопросы

Почему при множественных свойствах элемент выводится несколько раз?

При обходе через GetNext() SQL-join размножает строку по одному значению множественного свойства на строку. Используйте GetNextElement() с методами GetFields() и GetProperties() – тогда элемент будет один, а все значения свойства соберутся в массив.

Как безопасно взять ID из GET-параметра?

Никогда не подставляйте $_GET напрямую в запрос. Приведите значение к целому: $id = (int) ($_REQUEST["ID"] ?? 0); и проверьте, что оно больше нуля. Это защищает от SQL-инъекций и мусорных значений.

Нужно ли задавать $arSelect, если используешь GetProperties?

Нет, необязательно. Методы GetFields() и GetProperties() объекта элемента возвращают полный набор полей и свойств независимо от $arSelect. Перечисление полей в $arSelect имеет смысл, если вы читаете данные обычным GetNext() без объекта.

Есть ли современный способ на ядре D7?

Да. Выборку можно сделать через Bitrix\Iblock\ElementTable::getRow() с массивами select и filter, а значения свойств – через сгенерированные сущности Bitrix\Iblock\Elements\ElementXxxTable. Классический CIBlockElement::GetList в 2026 году остаётся полностью рабочим.

Валентина Меланина

Хотите обсудить свой проект?

Помогу с разработкой, аналитикой и AI-видимостью вашего сайта

Если у вас есть задача — от внедрения разметки и аналитики до полной переработки сайта — напишите, обсудим объём и подход.