Бизнес-процессы
Бизнес-процессы для разработчика
Произвольный PHP код в бизнес-процессе
Вычисление ID начальника
Вычисление ID начальника
Урок
247
из
251
Автор:
Марина Павлова
Сложность урока:
2 из 5
2 уровень - несложные понятия и действия, но не расслабляйтесь.
Просмотров:
40267
Дата изменения:
18.09.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С-Битрикс»