Пользовательские поля в Битрикс позволяют расширять стандартные сущности, такие как пользователи, инфоблоки и их элементы. Один из полезных типов полей — "Привязка к элементу", который связывает сущность с элементами инфоблоков.
В этой статье рассмотрим:
-
Как получить значения пользовательского поля типа "Привязка к элементу".
-
Как обрабатывать множественный выбор.
-
Оптимизацию запросов с кешированием.
-
Использование современного 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>Заключение
Мы рассмотрели несколько способов получения значений пользовательского поля "Привязка к элементу":
-
Классический API (
CUser::GetList+CIBlockElement::GetList). -
Оптимизация с кешированием.
-
Современный D7 API.
Рекомендации:
-
Для простых задач подойдет классический подход.
-
Для высоконагруженных проектов используйте D7 + кеширование.
-
Всегда проверяйте, существует ли элемент (
ACTIVE='Y').
Теперь вы можете эффективно работать с привязками к элементам в Битрикс!