Назад

Битрикс — как получить все значения пользовательского поля «привязка к элементу»

Главная
Блог
Битрикс — как получить все значения пользовательского поля «привязка к элементу»

Пользовательские поля в Битрикс позволяют расширять стандартные сущности, такие как пользователи, инфоблоки и их элементы. Один из полезных типов полей — "Привязка к элементу", который связывает сущность с элементами инфоблоков.

В этой статье рассмотрим:

  • Как получить значения пользовательского поля типа "Привязка к элементу".

  • Как обрабатывать множественный выбор.

  • Оптимизацию запросов с кешированием.

  • Использование современного D7 API.

1. Получение значений пользовательского поля

Допустим, у нас есть пользовательское поле UF_CONTR (привязка к элементам инфоблока). Чтобы получить его значения для текущего пользователя, используем CUser::GetList.

global $USER;

$order = ['sort' => 'asc'];
$filter = ['ID' => $USER->GetID()];
$select = ['SELECT' => ['UF_CONTR']]; // Указываем нужные поля

$rsUsers = CUser::GetList($order, 'sort', $filter, $select);
while ($arUser = $rsUsers->Fetch()) {
    $contr = $arUser['UF_CONTR']; // Массив ID привязанных элементов
}

Что важно:

  • Если поле поддерживает множественный выбор, $contr будет массивом.

  • Если выбор одиночный, вернется одно значение (не массив).

2. Получение названий элементов по их ID

Полученные ID элементов можно преобразовать в названия с помощью CIBlockElement::GetList.

Базовый вариант (без оптимизации)

$arContr = [];
if (is_array($contr)) {
    foreach ($contr as $elementId) {
        $res = CIBlockElement::GetByID($elementId);
        if ($arElement = $res->GetNext()) {
            $arContr[$elementId] = $arElement['NAME'];
        }
    }
}

Оптимизированный вариант (одним запросом)

$arContr = [];
if (is_array($contr) && !empty($contr)) {
    $res = CIBlockElement::GetList(
        [],
        ['ID' => $contr, 'ACTIVE' => 'Y'], // Фильтр по ID и активности
        false,
        false,
        ['ID', 'NAME'] // Выбираем только ID и NAME
    );
    while ($arElement = $res->GetNext()) {
        $arContr[$arElement['ID']] = $arElement['NAME'];
    }
}

Плюсы оптимизации:

  • Один запрос вместо множественных GetByID.

  • Фильтрация по ACTIVE исключает удаленные элементы.

3. Добавление кеширования

Чтобы снизить нагрузку на базу данных, можно закешировать результаты.

use Bitrix\Main\Application;

$cache = Application::getInstance()->getManagedCache();
$cacheKey = 'user_contr_' . $USER->GetID();

if ($cache->read(3600, $cacheKey)) {
    $arContr = $cache->get($cacheKey);
} else {
    // Получаем данные, как в примере выше
    $cache->set($cacheKey, $arContr);
}

Рекомендации:

  • Время кеширования (3600 = 1 час) можно регулировать.

  • Ключ кеша должен быть уникальным для каждого пользователя.

4. Использование D7 API (современный подход)

Битрикс D7 API предлагает более удобный и производительный способ работы с данными.

use Bitrix\Main\UserTable;
use Bitrix\Iblock\ElementTable;

// Получаем данные пользователя
$user = UserTable::getList([
    'select' => ['UF_CONTR'],
    'filter' => ['=ID' => $USER->GetID()],
])->fetch();

if (!empty($user['UF_CONTR'])) {
    // Получаем названия элементов
    $elements = ElementTable::getList([
        'select' => ['ID', 'NAME'],
        'filter' => ['=ID' => $user['UF_CONTR']],
    ]);
    
    while ($element = $elements->fetch()) {
        $arContr[$element['ID']] = $element['NAME'];
    }
}

Преимущества D7:

  • Более читаемый код.

  • Лучшая производительность.

  • Поддержка ORM-подхода.

5. Вывод данных в виде select

Полученные данные можно вывести в виде HTML-селекта:

<select name="contr">
    <? if (!empty($arContr)): ?>
        <? foreach ($arContr as $id => $name): ?>
            <option value="<?= $id ?>"><?= htmlspecialcharsbx($name) ?></option>
        <? endforeach; ?>
    <? else: ?>
        <option value="">Нет доступных элементов</option>
    <? endif; ?>
</select>

Заключение

Мы рассмотрели несколько способов получения значений пользовательского поля "Привязка к элементу":

  1. Классический API (CUser::GetList + CIBlockElement::GetList).

  2. Оптимизация с кешированием.

  3. Современный D7 API.

Рекомендации:

  • Для простых задач подойдет классический подход.

  • Для высоконагруженных проектов используйте D7 + кеширование.

  • Всегда проверяйте, существует ли элемент (ACTIVE='Y').

Теперь вы можете эффективно работать с привязками к элементам в Битрикс!

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи