Вычисление ID начальника

Урок 247 из 251
Автор: Марина Павлова
Сложность урока:
2 уровень - несложные понятия и действия, но не расслабляйтесь.
2 из 5
Просмотров: 35978
Дата изменения: 28.05.2025
Недоступно в лицензиях:
Текущую редакцию Вашего 1С-Битрикс можно просмотреть на странице Обновление платформы (Marketplace > Обновление платформы).
Старт, Стандарт, Малый бизнес

Определяем начальника

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

В этом коде переменная $num отвечает за уровень начальника (1 – непосредственный начальник, 2 – начальник начальника,...). ID начальника в формате БП (т.е. вида user_X) записывается в переменную с именем var5. Эта переменная должна быть создана в параметрах БП и должна иметь тип привязки к пользователю.

// Уровень начальника: 
// 1 — непосредственный начальник, 
// 2 — начальник начальника и так далее.
$num = 2;

// Получаем ID автора документа из переменной БП {=Document:CREATED_BY} (формат "user_X")
// Обрезаем "user_" и преобразуем в число
$userId = substr("{=Document:CREATED_BY}", 5);
$userId = intval($userId);

// Проверяем, что ID пользователя валиден
if ($userId > 0) {
    // Подключаем модуль интранета (требуется для работы с оргструктурой)
    CModule::IncludeModule("intranet");

    // Получаем данные пользователя, включая его подразделение (UF_DEPARTMENT)
    $dbUser = CUser::GetByID($userId);
    $arUser = $dbUser->Fetch();

    if ($arUser) {
        $i = 0;          // Текущий уровень иерархии
        $found = true;   // Флаг, что руководитель найден

        // Поднимаемся вверх по иерархии, пока не достигнем нужного уровня ($num)
        // или пока не найдем, что выше нет руководителей
        while ($i < $num && $found) {
            $i++;
            $found = false; // Сбрасываем флаг перед поиском на каждом уровне

            // Ищем руководителей для текущего пользователя
            // Параметры:
            // - UF_DEPARTMENT: подразделение пользователя
            // - ID пользователя (исключаем его из результатов)
            // - true: искать только непосредственных руководителей
            $arManagers = CIntranetUtils::GetDepartmentManager(
                $arUser["UF_DEPARTMENT"], 
                $arUser["ID"], 
                true
            );

            // Если есть хотя бы один руководитель...
            if (!empty($arManagers)) {
                // Берем первого руководителя (может быть несколько)
                $arUser = reset($arManagers);
                $found = true; // Указываем, что переход на уровень выше удался
            }
        }

        // Если нужный уровень руководителя найден...
        if ($found) {
            // Записываем результат в переменную БП (в формате "user_X")
            $rootActivity = $this->GetRootActivity();
            $rootActivity->SetVariable("var5", "user_" . $arUser["ID"]);
        }
        // Иначе переменная var5 не изменится (можно добавить логирование ошибки)
    }
}
  • Для работы кода необходимо корректно заполнить поле UF_DEPARTMENT у пользователей.
  • Если руководитель не найден на каком-то уровне, переменная var5 не будет изменена.

Нам жаль это слышать… Но мы постараемся быть лучше!

Мы благодарны Вам за помощь в улучшении документации.

Спасибо, мы рады что смогли помочь Вам. Ниже Вы можете оставить свой отзыв или пожелание :)
Мы стараемся сделать документацию понятнее и доступнее,
и Ваше мнение важно для нас
Курсы разработаны в компании «1С-Битрикс»