Работа с классом \Bitrix\Main\UserUtils

Внимание! Работает режим премодерации. Все сообщения публикуются после проверки!
Страницы: 1
Ответить
RSS
Работа с классом \Bitrix\Main\UserUtils
Руководство по работе с классом \Bitrix\Main\UserUtils в Битрикс D7

В современных версиях 1С-Битрикс всё активнее внедряется концепция D7,  позволяющая писать код более структурированно и гибко. Класс  \Bitrix\Main\UserUtils — это часть ядра  (bitrix/modules/main/lib/userutils.php), содержащая утилиты для работы с  пользователями. Он упрощает поиск пользователей по персональным данным,  получение информации о подразделениях и решает ряд распространённых  задач, связанных с данными пользователей.
Пример кода, который безопасно ищет пользователей по ФИО с помощью UserUtils::getUserSearchFilter, корректно обрабатывает отсутствие поля UF_DEPARTMENT при неустановленном модуле «Интранет» и выводит данные о пользователях, включая подразделения — только если они доступны.
Код
<?php
require $_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php';

use Bitrix\Main\UserUtils;
use Bitrix\Main\UserTable;
use Bitrix\Main\Loader;
use Bitrix\Main\UserFieldTable;

if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) {
    die();
}

if (!Loader::includeModule('main')) {
    die('Модуль "main" не загружен');
}

// === 1. Проверяем, существует ли поле UF_DEPARTMENT ===
$ufDepartmentExists = false;
try {
    $field = UserFieldTable::getList([
        'filter' => ['ENTITY_ID' => 'USER', 'FIELD_NAME' => 'UF_DEPARTMENT']
    ])->fetch();

    $ufDepartmentExists = !empty($field);
} catch (\Exception $e) {
    // Поле может не существовать — это нормально
    $ufDepartmentExists = false;
}

// === 2. Формируем фильтр поиска ===
$searchString = 'Troy Adams'; // Пример строки поиска

$filter = UserUtils::getUserSearchFilter([
    'FIND' => $searchString
]);

$filter['ACTIVE'] = 'Y';
$filter['IS_REAL_USER'] = 'Y';

// === 3. Формируем SELECT в зависимости от наличия UF_DEPARTMENT ===
$select = ['ID', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'WORK_POSITION'];

if ($ufDepartmentExists) {
    $select[] = 'UF_DEPARTMENT';
}

// === 4. Выполняем запрос ===
try {
    $users = UserTable::getList([
        'select' => $select,
        'filter' => $filter,
        'limit' => 10
    ])->fetchAll();
} catch (\Exception $e) {
    die('Ошибка при получении пользователей: ' . $e->getMessage());
}

// === 5. Вывод результатов ===
foreach ($users as $user) {
    echo "<h3>";
    echo htmlspecialcharsbx($user['LAST_NAME'] ?? '') . ' ';
    echo htmlspecialcharsbx($user['NAME'] ?? '');
    if (!empty($user['SECOND_NAME'])) {
        echo ' ' . htmlspecialcharsbx($user['SECOND_NAME']);
    }
    echo "</h3>";

    echo "<p><strong>Должность:</strong> ";
    echo !empty($user['WORK_POSITION']) ? htmlspecialcharsbx($user['WORK_POSITION']) : 'не указана';
    echo "</p>";

    // === 6. Показываем подразделения ТОЛЬКО если поле существует и установлен модуль intranet ===
    if ($ufDepartmentExists && !empty($user['UF_DEPARTMENT']) && is_array($user['UF_DEPARTMENT'])) {
        // Попробуем подключить intranet для getDepartmentNames
        if (Loader::includeModule('intranet')) {
            $departments = UserUtils::getDepartmentNames($user['UF_DEPARTMENT']);
            if (!empty($departments)) {
                echo "<p><strong>Подразделения:</strong></p><ul>";
                foreach ($departments as $dept) {
                    echo "<li>";
                    echo str_repeat(' ', ($dept['DEPTH_LEVEL'] - 1) * 4);
                    echo htmlspecialcharsbx($dept['NAME']);
                    echo " (ID: {$dept['ID']})";
                    echo "</li>";
                }
                echo "</ul>";
            }
        } else {
            echo "<p><em>Подразделения: данные доступны, но модуль «Интранет» не установлен — не могу отобразить названия.</em></p>";
        }
    } else {
        echo "<p><strong>Подразделения:</strong> не назначены или недоступны</p>";
    }

    echo "<hr>";
}
Страницы: 1
Ответить
Форма ответов
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Участие в проекте

привлечение в проект на part-time основе

от 30 000 рублей / неделя

Возможно участие в проекте на ежедневной основе, как разработчика. Занятость - до 20 часов в неделю
Минимальный срок - одна неделя.

* сумма фиксированная

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.