\Bitrix\Main\UserUtils: утилиты для управления пользователями в 1С-Битрикс

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

В современных версиях 1С-Битрикс всё активнее внедряется концепция D7,  позволяющая писать код более структурированно и гибко. Класс  \Bitrix\Main\UserUtils — это часть ядра  (bitrix/modules/main/lib/userutils.php), содержащая утилиты для работы с  пользователями. Он упрощает поиск пользователей по персональным данным,  получение информации о подразделениях и решает ряд распространённых  задач, связанных с данными пользователей.
Изменено: Валерий Макеев - 29.09.2025 15:18:42
Пример кода, который безопасно ищет пользователей по ФИО с помощью 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>";
}
Чтобы в админке заработал полнотекстовый поиск пользователей нужно в таблице b_option создать (или отредактировать если уже есть) запись с параметрами

MODULE_ID: main
NAME: ~ft_b_user_index
VALUE: a:1:{s:20:"SEARCH_ADMIN_CONTENT";b:1;}

После этого скинуть кеш.

Как сделать это через админку - не нашел, но особо и не искал.
Можно не лезть напрямую в БД не обязательно 🙂  
Этот параметр — обычная опция модуля `main`, её можно выставить через API.

Один раз выполняем любой из вариантов:

Через \Bitrix\Main\Config\Option:
Код
use Bitrix\Main\Config\Option;

Option::set(
    'main',
    '~ft_b_user_index',
    serialize([
        'SEARCH_ADMIN_CONTENT' => true,
    ])
);


Или через старый COption:

Код
COption::SetOptionString(
    'main',
    '~ft_b_user_index',
    'a:1:{s:20:"SEARCH_ADMIN_CONTENT";b:1;}'
);


Код можно запустить:

- через `/bitrix/admin/php_command_line.php`;  
- или отдельным разовым скриптом в `/bitrix/admin/`.

После установки опции:

1. Очистить кеш в админке:  
  *Настройки → Настройки продукта → Автокэширование → Очистить кеш*.
2. При необходимости прогнать переиндексацию поиска.

После этого полнотекстовый поиск по пользователям в админке начинает работать.
Страницы: 1
Ответить
Форма ответов
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
 

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

Лечение сайтов от вирусов

восстановление сайта и подъем версии PHP

от 25 000 рублей
Лечение сайтов на решениях АСПРО и прочих.

* полный комплекс лечения проекта и закрытия дыр

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.

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

сайтов на CMS 1C-Битрикс

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

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