Как вывести определённое поле элемента инфоблока в Битриксе
Инструкция6 мин 50 Обновлено 22 июля Сложность: Базовая
TL;DR
- Служебные поля элемента лежат в $arItem["FIELDS"] (список) или в корне $arResult (детальная).
- SHOW_COUNTER – это поле, а не свойство; выводите через intval().
- Когда код поля известен – обращайтесь по ключу, а не перебирайте весь массив.
- Поле должно быть в настройках компонента (FIELD_CODE) или в $arSelect выборки.
- На D7 одно поле берётся через ElementTable::getRow().
Иногда в шаблоне списка или детальной страницы нужно вывести не весь набор данных, а одно конкретное служебное поле элемента инфоблока – например количество показов, дату создания или ID автора. В 1С-Битрикс все такие поля лежат в массиве $arResult (а в шаблоне списка – в $arItem["FIELDS"]), и достать нужное можно точечно. Ниже – рабочий приём 2017 года, который остаётся валидным в 2026-м, плюс современные уточнения.
Что такое поля элемента и где искать их коды
У каждого элемента инфоблока есть два разных набора данных: поля (FIELDS) – системные атрибуты самого элемента, и свойства (PROPERTIES) – то, что вы создаёте вручную в настройках инфоблока. Счётчик показов SHOW_COUNTER – это именно поле, а не свойство. Полный список системных полей и их коды приведены в официальной документации Битрикса в разделе «Структура таблиц модуля информационных блоков» (таблица b_iblock_element): ID, NAME, CODE, SORT, SHOW_COUNTER, SHOW_COUNTER_START, DATE_CREATE, TIMESTAMP_X и другие.
Рабочий пример: вывести SHOW_COUNTER в шаблоне news.list
В шаблоне компонента bitrix:news.list элементы приходят в цикле по $arResult["ITEMS"], а служебные поля каждого элемента собраны в подмассиве $arItem["FIELDS"]. Пробегаемся по нему и ловим нужный код:
foreach ($arItem["FIELDS"] as $code => $value):
if ($code == "SHOW_COUNTER"): // ловим поле «Количество показов»
echo intval($value); // выводим как целое число
elseif ($value != ""): // остальные заполненные поля – как есть
echo htmlspecialcharsbx($value);
endif;
endforeach;
Два важных момента по сравнению со старым кодом. Во-первых, SHOW_COUNTER – счётчик, поэтому оборачиваем в intval(): получаем чистое число и отсекаем случайный мусор. Во-вторых, произвольные строковые поля стоит прогонять через htmlspecialcharsbx() – штатную функцию Битрикса для экранирования, чтобы значение из базы не сломало вёрстку и не создало XSS.
Когда цикл не нужен: обращаемся к полю напрямую
Перебор всего массива оправдан, только если вы заранее не знаете имя поля. Когда код поля известен, обращайтесь к нему по ключу – это быстрее и читаемее:
if (!empty($arItem["FIELDS"]["SHOW_COUNTER"])) {
echo intval($arItem["FIELDS"]["SHOW_COUNTER"]);
}
На детальной странице (компонент bitrix:news.detail) поля лежат прямо в корне $arResult, поэтому там будет просто echo intval($arResult["SHOW_COUNTER"]);.
Важно: поле должно быть запрошено в выборке
Компонент отдаёт в шаблон только те поля, которые перечислены в его настройках. Если SHOW_COUNTER в $arItem["FIELDS"] отсутствует, добавьте его в параметр компонента FIELD_CODE[] («Поля» в настройках) – без этого значение просто не попадёт в результат. Это же правило действует и при собственных выборках через CIBlockElement::GetList: поле нужно указать в массиве $arSelect.
Современная альтернатива на D7 (ORM)
Если вы делаете собственную выборку вне компонента, в актуальных версиях Битрикса удобнее ORM-таблица инфоблоков. Одно поле одного элемента достаётся так:
use Bitrix\Iblock\ElementTable;
$row = ElementTable::getRow([
'select' => ['ID', 'SHOW_COUNTER'],
'filter' => ['=ID' => 42, '=ACTIVE' => 'Y'],
]);
echo intval($row['SHOW_COUNTER']);
Классический CIBlockElement::GetList тоже полностью рабочий – выбирайте по стилю проекта. ORM удобнее типизацией и синтаксисом, старое API – привычнее и не требует подключения сущностей.
Замечания по производительности и кэшу
- Не трогайте кэш ради одного поля. Если данные уже пришли в шаблон компонента, вывод поля бесплатен – не делайте отдельный запрос в БД внутри цикла шаблона.
- SHOW_COUNTER обновляется не мгновенно. Битрикс инкрементирует счётчик показов при просмотре детальной страницы; при активном кэшировании компонента значение может отставать, пока кэш не сброшен.
- Экранируйте вывод. Пользовательские текстовые поля выводите через
htmlspecialcharsbx(), числовые – черезintval().
Смежные приёмы работы с инфоблоками – в гайдах «Получить ID из GET и вывести все элементы и свойства инфоблока», «В анонсе новостей вывести детальное описание» и «Получить название свойства из типа Справочник». А как посчитать сами элементы – в гайде «Подсчёт общего количества элементов в инфоблоке».
Частые вопросы
Чем поле элемента отличается от свойства инфоблока?
Поля (FIELDS) – это системные атрибуты самого элемента: ID, NAME, CODE, SHOW_COUNTER, DATE_CREATE и т. д. Свойства (PROPERTIES) вы создаёте вручную в настройках инфоблока. SHOW_COUNTER – это поле, поэтому его берут из $arItem["FIELDS"], а не из PROPERTIES.
Почему нужное поле не появляется в $arItem["FIELDS"]?
Компонент отдаёт только поля, перечисленные в его настройках. Добавьте нужное поле в параметр FIELD_CODE[] (раздел «Поля»). При собственной выборке через CIBlockElement::GetList укажите поле в массиве $arSelect.
Как вывести поле на детальной странице новости?
В компоненте bitrix:news.detail поля лежат прямо в корне $arResult, поэтому пишите echo intval($arResult["SHOW_COUNTER"]); без цикла по FIELDS.
Есть ли способ на новом ядре D7?
Да. Для собственной выборки одно поле одного элемента берут через Bitrix\Iblock\ElementTable::getRow() с массивами select и filter. Классический CIBlockElement::GetList в 2026 году тоже полностью валиден.
Материалы по теме
Что почитать дальше по этой теме