Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье содержится комплексное руководство по часто используемым функциям сопоставления выражений при настройке SuccessFactors для подготовки пользователей идентификатора Microsoft Entra ID. Эти функции помогают преобразовывать и сопоставлять данные из SuccessFactors для создания соответствующих атрибутов пользователей в идентификаторе Microsoft Entra.
Оглавление
- Функции обработки строк
- Создание адреса электронной почты
- Логика управления учетными записями
- Срок действия функций даты и срока действия учетной записи
- Назначение подразделения
- Обработка имен и отображение имен
- Создание SamAccountName
- Конфигурация ProxyAddresses
- Обработка номеров телефонов
- Логика на основе стран и расположений
- Классификация сотрудников и сотрудники- контингенты
- Расширенные сценарии
Функции обработки строк
Базовые строковые операции
Сценарий 1. Вы хотите наставить идентификатор пользователя с начальными нулями, чтобы создать 8-символьную строку.
Целевой атрибут: employeeId
Replace(Join("","00000000",[personIdExternal]), ,"(.*?)(?<id>.{0,8})$", ,"${id}", ,)
Пример:
- Входные значения: [personIdExternal] = "12345"
-
Выходные данные выражения:
00012345
Сценарий 2. Чтобы сделать его 10 символов, необходимо навести центр затрат на начальные нули.
Целевой атрибут: extensionAttribute1
Replace(Join("","0000000000",[costCenterId]), ,"(.*?)(?<id>.{0,10})$", ,"${id}", ,)
Пример:
- Входные значения: [costCenterId] = "567"
-
Выходные данные выражения:
0000000567
Сценарий 3. Необходимо создать идентификатор сотрудника, добавив префикс к номеру сотрудника с заполненным номером.
Целевой атрибут: employeeId
Append("05",Replace(Join("","000000",[employeeId]), ,"(.*?)(?<id>.{0,6})$", ,"${id}", ,))
Пример:
- Входные значения: [employeeId] = "789"
-
Выходные данные выражения:
05000789
Преобразование текстового регистра
Сценарий 1. Необходимо преобразовать имена из всех верхних регистров в правильный регистр (Заголовок регистра).
Целевой атрибут: sn
Join("",Mid([lastName],1,1),ToLower(Mid([lastName],2,64)))
Пример:
- Входные значения: [lastName] = "JOHNSON"
-
Выходные данные выражения:
Johnson
Сценарий 2. Вы хотите создать отображаемое имя с правильным форматированием регистра.
Целевой атрибут: displayName
Join(", ", Join("",Mid([lastName],1,1),ToLower(Mid([lastName],2,64))), Join("",Mid([firstName],1,1),ToLower(Mid([firstName],2,64))))
Пример:
- Входные значения: [lastName] = "SMITH", [firstName] = "JOHN"
-
Выходные данные выражения:
Smith, John
Сценарий 3. Необходимо обрабатывать имена пробелами, заменив пробелы точками.
Целевой атрибут: givenName
Replace([firstName]," ", , ,".", , )
Пример:
- Входные значения: [firstName] = "Мэри Энн"
-
Выходные данные выражения:
Mary.Ann
Создание адреса электронной почты
Базовое создание электронной почты
Сценарий 1. Вы хотите создать адреса электронной почты с помощью имени и фамилии с доменами, определенными компанией.
Целевой атрибут: почта
SelectUniqueValue(
Switch([company],
Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
"Contoso", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
"Fabrikam", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
"Woodgrove", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
),
Switch([company],
Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com"),
"Contoso", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com"),
"Fabrikam", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "fabrikam.com"),
"Woodgrove", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), Mid([middleName],1,1), [lastName]))), "woodgrove.com")
)
)
Пример:
- Входные значения: [компания] = "Contoso", [firstName] = "John", [lastName] = "Smith", [middleName] = "Michael"
-
Выходные данные выражения:
john.smith@contoso.com(илиjohn.m.smith@contoso.comесли первый вариант принимается)
Создание электронной почты на основе группы сотрудников
Сценарий 1. Вы хотите создать различные форматы электронной почты на основе классификации сотрудников (постоянная и временная).
Целевой атрибут: userPrincipalName
StripSpaces(NormalizeDiacritics(Switch([custom06],
Join("", [firstName], ".", [lastName], "@ltts.com"),
"Temporary", Join("", [firstName], ".", [lastName], "_ext@ltts.com"),
"External", Join("", [firstName], ".", [lastName], "_ext@ltts.com"),
"Permanent", Join("", [firstName], ".", [lastName], "@ltts.com")
)))
Пример:
- Входные значения: [custom06] = "Временный", [firstName] = "Сара", [lastName] = "Уилсон"
-
Выходные данные выражения:
sarah.wilson_ext@ltts.com
Проверка корпоративного домена
Сценарий 1. Вы хотите передавать только адреса электронной почты, принадлежащие определенному корпоративному домену.
Целевой атрибут: почта
IgnoreFlowIfNullOrEmpty(IIF(InStr([emailAddress],"@contoso.com")=0,"",[emailAddress]))
Пример:
- Входные значения: [emailAddress] = "john.doe@contoso.com"
-
Выходные данные выражения:
john.doe@contoso.com - Альтернативные входные данные: [emailAddress] = "john.doe@external.com"
- Альтернативные выходные данные: (пустое — игнорируется)
Сохранение существующей электронной почты
Сценарий 1. Вы хотите использовать существующую электронную почту из SuccessFactors для определенных подразделений, но создать новые для других.
Целевой атрибут: userPrincipalName
SelectUniqueValue(
Switch([divisionId],
Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
"8900", [email]
),
Join("1@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
Join("2@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")
)
Пример:
- Входные значения: [divisionId] = "8900", [email] = "existing.user@company.com", [firstName] = "Майк", [lastName] = "Браун"
-
Выходные данные выражения:
existing.user@company.com - Альтернативные входные данные: [divisionId] = "1200", [firstName] = "Майк", [lastName] = "Браун"
-
Альтернативные выходные данные:
mike.brown@contoso.com
Логика управления учетными записями
Базовое состояние учетной записи
Сценарий 1. Вы хотите определить, следует ли отключить учетную запись на основе состояния занятости.
Целевой атрибут: accountDisabled
Switch([emplStatus], "False", "741", "False", "749", "True", "746", "True")
Пример:
- Входные значения: [emplStatus] = "741"
-
Выходные данные выражения:
False(включена учетная запись) - Альтернативные входные данные: [emplStatus] = "746"
-
Альтернативные выходные данные:
True(учетная запись отключена)
Скрытие из логики списков адресов
Сценарий 1. Необходимо задать атрибут msExchHideFromAddressLists на основе дат начала и окончания.
Целевой атрибут: msExchHideFromAddressLists
IIF(DateDiff("d", CDate(IIF(IsPresent([startDate]), [startDate], DateAdd("d", "10", Now()))), Now()) >= -1, IIF(DateDiff("d", Now(), CDate(IIF(IsPresent([endDate]), [endDate], DateAdd("d", "1", Now())))) >= 0, "FALSE", "TRUE"), "TRUE")
Пример:
- Входные значения: [startDate] = "2025-01-15", [endDate] = "2025-12-31" (текущая дата: 2025-07-30)
-
Выходные данные выражения:
FALSE(не скрытые из списков адресов) - Альтернативные входные данные: [startDate] = "2025-01-15", [endDate] = "2025-06-30"
-
Альтернативные выходные данные:
TRUE(скрытые из списков адресов)
Сложная логика состояния сотрудника
Сценарий 1. У вас есть сложное требование отключить учетные записи на основе настраиваемых полей и дат найма.
Целевой атрибут: accountEnabled
Switch([empNavCustomString3], "True",
"62220", Switch([cust_hiredate],
IIF(DateDiff("d", CDate([cust_hiredate]), Now()) = 3,
Switch([cust_customDate67],
IIF(DateDiff("d", CDate([cust_customDate67]), Now())=0, "False", "True"),
"", "False"
), "True"
),
"", "True"
))
Пример:
- Входные значения: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-30" (текущая дата: 2025-07-30)
-
Выходные данные выражения:
False(включена учетная запись) - Альтернативные входные данные: [empNavCustomString3] = "62220", [cust_hiredate] = "2025-07-27", [cust_customDate67] = "2025-07-29"
-
Альтернативные выходные данные:
True(учетная запись отключена)
Срок действия функций даты и срока действия учетной записи
Срок действия базовой учетной записи
Сценарий 1. Вы хотите задать срок действия учетной записи на основе даты окончания из SuccessFactors.
Целевой атрибут: accountExpires
Switch([endDate],
NumFromDate(Join("", FormatDateTime([endDate], "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-05:00")),
"", "9223372036854775807"
)
Пример:
- Входные значения: [endDate] = "12/31/2025 12:00:00 AM"
-
Выходные данные выражения:
133835135990000000(числовое представление 2025-12-31 23:59:59-05:00) - Альтернативные входные данные: [endDate] = "" (пустой)
-
Альтернативные выходные данные:
9223372036854775807(срок действия не истекает)
Срок действия на основе типа занятости
Сценарий 1. Необходимо задать различные правила истечения срока действия учетной записи на основе типа занятости (постоянный и подрядчик).
Целевой атрибут: accountExpires
Switch([employmentType],
NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00")),
"PM", NumFromDate(Join("",FormatDateTime(DateAdd("yyyy", 60, CDate([DOB])), ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00")),
"CON", NumFromDate(Join("",FormatDateTime([endDate], ,"M/d/yyyy hh:mm:ss tt","yyyy-MM-dd")," 23:59:59-05:00"))
)
Пример:
- Входные значения: [employmentType] = "PM", [DOB] = "1/15/1990 12:00:00 AM"
-
Выходные данные выражения:
158488415990000000(числовое представление 2050-01-15 23:59:59-05:00, 60 лет после рождения) - Альтернативные входные данные: [employmentType] = "CON", [endDate] = "12/31/2025 12:00:00 AM"
-
Альтернативный результат:
133835135990000000(числовое представление 2025-12-31 23:59:59-055:00)
Срок действия учетной записи на основе причин событий
Сценарий 1. Вы хотите задать срок действия учетной записи на основе определенных событий завершения и дат выхода.
Целевой атрибут: accountExpires
Switch([event],
IIF(IsPresent([latestTerminationDate]), NumFromDate(Join("", FormatDateTime([latestTerminationDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")), "9223372036854775807"),
"SEVUNSATP", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")),
"SEVPOSELIM", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00")),
"POSELIM", NumFromDate(Join("", FormatDateTime([severanceStartDate], , "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), " 23:59:59-08:00"))
)
Пример:
- Входные значения: [событие] = "SEVUNSATP", [severanceStartDate] = "8/15/2025 12:00:00 AM"
-
Вывод выражения:
133877247990000000(числовое представление 2025-08-15 23:59:59-08:00) - Альтернативные входные данные: [событие] = "REGULAR", [latestTerminationDate] = "9/30/2025 12:00:00 AM"
-
Альтернативный результат:
133886207990000000(числовое представление 2025-09-30 23:59:59-08:00)
Обработка формата даты
Сценарий 1. Необходимо обрабатывать недопустимые даты, такие как "12/31/9999", которые вызывают ошибки в NumFromDate.
Целевой атрибут: accountExpires
Switch([endDate],
NumFromDate(Join("", FormatDateTime([endDate], "M/d/yyyy hh:mm:ss tt", "yyyy-MM-dd"), "T23:59:59-04:00")),
"12/31/9999 12:00:00 AM", NumFromDate("2099-12-31T23:59:59-04:00")
)
Пример:
- Входные значения: [endDate] = "12/31/9999 12:00:00 AM"
-
Вывод выражения:
441481535990000000(числовое представление 2099-12-31T23:59:59-04:00) - Альтернативные входные данные: [endDate] = "8/15/2025 12:00:00"
-
Альтернативный результат:
133877283990000000(числовое представление 2025-08-15T23:59:59-04:00)
Назначение подразделения
Назначение подразделения на основе отдела
Сценарий 1. Вы хотите разместить пользователей в разных подразделениях на основе своего отдела.
Целевой атрибут: parentDistinguishedName
Switch([department], "OU=SuccessFactors,DC=contoso,DC=com",
"Engineering SG", "OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com",
"Shared Services", "OU=Shared Services,OU=SuccessFactors,DC=contoso,DC=com",
"Retail - Finance", "OU=Retail Finance,OU=SuccessFactors,DC=contoso,DC=com",
"Information Technology BR", "OU=Information Technology,OU=SuccessFactors,DC=contoso,DC=com",
"Development", "OU=Development,OU=SuccessFactors,DC=contoso,DC=com"
)
Пример:
- Входные значения: [отдел] = "Инженерный SG"
-
Выходные данные выражения:
OU=Engineering,OU=SuccessFactors,DC=contoso,DC=com - Альтернативные входные данные: [отдел] = "Маркетинг"
-
Альтернативные выходные данные:
OU=SuccessFactors,DC=contoso,DC=com(по умолчанию)
Назначение подразделения на основе состояния занятости
Сценарий 1. Необходимо назначить пользователей разным подразделениям в зависимости от их состояния занятости и расположения.
Целевой атрибут: parentDistinguishedName
Join("",
Switch([emplStatus], "OU=SFProvisoinngUsers",
"741", Switch([empJobNavCustomString13],
"OU=SFProvisoinngUsers",
"LOC1016", "OU=Mysore",
"LOC1019", "OU=Baroda",
"LOC1015", Switch([departmentId],
"OU=Bangalore",
"DU1026","OU=IT,OU=Bangalore",
"DU1025","OU=IT,OU=Bangalore"
)
),
"749", Switch([empJobNavCustomString13],
"OU=O365-NoSYNC,OU=SFProvisoinngUsers",
"LOC1016", "OU=O365-NoSYNC,OU=Mysore",
"LOC1019", "OU=O365-NoSYNC,OU=Baroda",
"LOC1015", "OU=O365-NoSYNC,OU=Bangalore"
)
),
",DC=contoso,DC=com")
Пример:
- Входные значения: [emplStatus] = "741", [empJobNavCustomString13] = "LOC1015", [departmentId] = "DU1026"
-
Выходные данные выражения:
OU=IT,OU=Bangalore,DC=contoso,DC=com - Альтернативные входные данные: [emplStatus] = "749", [empJobNavCustomString13] = "LOC1016"
-
Альтернативные выходные данные:
OU=O365-NoSYNC,OU=Mysore,DC=contoso,DC=com - Альтернативные входные данные: [emplStatus] = "741", [empJobNavCustomString13] = "LOC9999" (не определен)
-
Альтернативные выходные данные:
OU=SFProvisoinngUsers,DC=contoso,DC=com(по умолчанию)
Назначение подразделения на основе страны
Сценарий 1. Вы хотите разместить пользователей в разных подразделениях в зависимости от страны с отключенным подразделением для неактивных пользователей.
Целевой атрибут: parentDistinguishedName
Switch([activeEmploymentsCount],
Switch([country], "OU=Accounts,DC=corp,DC=contoso,DC=com",
"Mexico", "OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com",
"Sweden", "OU=Sweden,OU=Accounts,DC=corp,DC=contoso,DC=com",
"Colombia", "OU=Internal Accounts,OU=Colombia,OU=Accounts,DC=corp,DC=contoso,DC=com",
"Brazil", "OU=Internal Accounts,OU=Brazil,OU=Accounts,DC=corp,DC=contoso,DC=com"
),
"0", "OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com"
)
Пример:
- Входные значения: [activeEmploymentsCount] = "1", [страна] = "Мексика"
-
Выходные данные выражения:
OU=Mexico,OU=Accounts,DC=corp,DC=contoso,DC=com - Альтернативные входные данные: [activeEmploymentsCount] = "0", [страна] = "Швеция"
-
Альтернативные выходные данные:
OU=DisabledAccounts,OU=Accounts,DC=corp,DC=contoso,DC=com(отключенные пользователи отправляются в специальное подразделение независимо от страны) - Альтернативные входные данные: [activeEmploymentsCount] = "1", [страна] = "Германия"
-
Альтернативные выходные данные:
OU=Accounts,DC=corp,DC=contoso,DC=com(подразделение по умолчанию для стран, не определенных конкретно)
Обработка имен и отображение имен
Создание общих имен (CN)
Сценарий 1. Вы хотите создать уникальное общее имя с резервными параметрами для дубликатов.
Целевой атрибут: cn
SelectUniqueValue(
NormalizeDiacritics(Join(" ", [firstName], [lastName])),
NormalizeDiacritics(Join(" ", [firstName], Mid([middleName],1,1), [lastName])),
NormalizeDiacritics(Join(" ", [firstName], [middleName], [lastName]))
)
Пример:
- Входные значения: [firstName] = "José", [lastName] = "García", [middleName] = "Антонио"
-
Выходные данные выражения:
Jose Garcia(илиJose A Garciaесли используется первый вариант, илиJose Antonio Garciaесли первые два будут приняты)
Отображаемое имя с предпочитаемыми именами
Сценарий 1. Необходимо создать отображаемое имя, которое использует предпочтительное имя при наличии, в противном случае возвращается к первому имени.
Целевой атрибут: displayName
Join(", ", Join("", Mid([lastName], 1, 1), ToLower(Mid([lastName], 2, 64), )), Join("", Mid(Coalesce([preferredName], [firstName]), 1, 1), ToLower(Mid(Coalesce([preferredName], [firstName]), 2, 64), )))
Пример:
- Входные значения: [lastName] = "JOHNSON", [preferredName] = "Майк", [firstName] = "Michael"
-
Выходные данные выражения:
Johnson, Mike - Альтернативные входные данные: [lastName] = "SMITH", [preferredName] = "", [firstName] = "Роберт"
-
Альтернативные выходные данные:
Smith, Robert
Отображаемое имя с числовыми суффиксами
Сценарий 1. Вы хотите создать уникальные отображаемые имена с числовыми суффиксами для дубликатов.
Целевой атрибут: displayName
SelectUniqueValue(
Join("", NormalizeDiacritics(Join("", [lastName], ", ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))),
Join("", NormalizeDiacritics(Join("", [lastName], "2, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))),
Join("", NormalizeDiacritics(Join("", [lastName], "3, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName]))),
Join("", NormalizeDiacritics(Join("", [lastName], "4, ")), NormalizeDiacritics(Switch([preferredName], [preferredName], "", [firstName])))
)
Пример:
- Входные значения: [lastName] = "García", [preferredName] = "Майк", [firstName] = "Michael"
-
Выходные данные выражения:
Garcia, Mike(илиGarcia2, Mikeесли первый вариант принимается и т. д.) - Альтернативные входные данные: [lastName] = "Smith", [preferredName] = "", [firstName] = "John"
-
Альтернативные выходные данные:
Smith, John(илиSmith2, Johnесли первый вариант принимается и т. д.)
Создание SamAccountName
Базовое создание samAccountName
Сценарий 1. Вы хотите создать samAccountName с помощью первого и последнего имени с правильной очисткой символов.
Целевой атрибут: sAMAccountName
SelectUniqueValue(
Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
Join("",Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 19), , "(\\.)*$", , "", , ),"1"),
Join("",Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 19), , "(\\.)*$", , "", , ),"2")
)
Пример:
- Входные значения: [firstName] = "José", [lastName] = "García-López"
-
Выходные данные выражения:
jgarcialopez(илиjgarcialopez1если используется первый вариант, илиjgarcialopez2если первые два будут приняты)
SamAccountName с длиной имени переменной
Сценарий 1. Необходимо обрабатывать дубликаты, увеличив число символов из первого имени.
Целевой атрибут: sAMAccountName
SelectUniqueValue(
Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,1), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,2), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , ),
Replace(Mid(Replace(NormalizeDiacritics(StripSpaces(Join("", Mid([firstName],1,3), [lastName]))), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , )
)
Пример:
- Входные значения: [firstName] = "Кристофер", [lastName] = "Андерсон"
-
Выходные данные выражения:
canderson(илиchandersonесли используется первый вариант, илиchrandersonесли первые два будут приняты) - Альтернативные входные данные: [firstName] = "María", [lastName] = "Родригес-Сантос"
-
Альтернативные выходные данные:
mrodriguezsantos(илиmarodriguezsantosесли первый вариант принимается, илиmarrodriguezsantosесли первые два будут приняты)
SamAccountName из внешнего имени пользователя
Сценарий 1. Вы хотите извлечь часть имени пользователя из внешнего имени пользователя в стиле электронной почты.
Целевой атрибут: sAMAccountName
Replace(Mid(Replace(Replace([username],,"(?<id>.*)@(?<domain>.*)",,"${id}",,), , "([\\/\\\\\\[\\]\\:\\;\\|\\=\\,\\+\\*\\?\\<\\>])", , "", , ), 1, 20), , "(\\.)*$", , "", , )
Пример:
- Входные значения: [имя пользователя] = "john.smith@external.com"
-
Выходные данные выражения:
johnsmith
Конфигурация ProxyAddresses
Базовая настройка proxyAddresses
Сценарий 1. Необходимо задать несколько прокси-адресов, включая первичные и вторичные SMTP-адреса.
Целевой атрибут: proxyAddresses
Split(
Join(",",
Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "contoso.mail.onmicrosoft.com")),
Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "contoso.com")),
Append("SMTP:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "contoso.com"))
),
","
)
Пример:
- Входные значения: [personIdExternal] = "12345", [firstName] = "John", [lastName] = "Smith"
-
Выходные данные выражения:
["smtp:A12345@contoso.mail.onmicrosoft.com", "smtp:A12345@contoso.com", "SMTP:John.Smith@contoso.com"]
Прокси-сервер на основе деленияAddresses
Сценарий 1. Вам нужны разные конфигурации прокси-адресов на основе подразделения сотрудников.
Целевой атрибут: proxyAddresses
Split(
Switch([divisionId],
Join(",",
Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "woodgrove.mail.onmicrosoft.com")),
Append("smtp:", Join("@", NormalizeDiacritics(StripSpaces(Join("", "A", [personIdExternal]))), "woodgrove.com")),
Append("SMTP:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "woodgrove.com"))
),
"EXEC", Join(",",
Append("smtp:", Join("@", Join(".", StripSpaces([firstName]), StripSpaces([lastName])), "contoso.com")),
Append("SMTP:", [email])
)
),
","
)
Пример:
- Входные значения: [divisionId] = "STANDARD", [personIdExternal] = "67890", [firstName] = "Сара", [lastName] = "Джонсон"
-
Выходные данные выражения:
["smtp:A67890@woodgrove.mail.onmicrosoft.com", "smtp:A67890@woodgrove.com", "SMTP:Sarah.Johnson@woodgrove.com"] - Альтернативные входные данные: [divisionId] = "EXEC", [firstName] = "Michael", [lastName] = "Brown", [email] = "mbrown@fabrikam.com"
-
Альтернативные выходные данные:
["smtp:Michael.Brown@contoso.com", "SMTP:mbrown@fabrikam.com"]
Прокси-сервер для конкретной компанииAddresses
Сценарий 1. Вы хотите создать прокси-адреса на основе принадлежности компании.
Целевой атрибут: proxyAddresses
SelectUniqueValue (
Switch([company],
Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
"NGC", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
"CNG", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
"National Energy", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "fabrikam.com"))
),
Switch([company],
Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")),
"NGC", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")),
"CNG", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], Mid([middleName],1,1), [lastName]))), "contoso.com")),
"National Energy", Append ("SMTP:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), Mid([middleName],1,1), [lastName]))), "fabrikam.com"))
)
)
Пример:
- Входные значения: [компания] = "NGC", [firstName] = "Тринидад", [lastName] = "Williams", [middleName] = "Джеймс"
-
Выходные данные выражения:
SMTP:trinidad.williams@contoso.com(илиSMTP:trinidad.j.williams@contoso.comесли первый вариант принимается) - Альтернативные входные данные: [компания] = "National Energy", [firstName] = "Ребекка", [lastName] = "Thompson", [middleName] = "Мари"
-
Альтернативные выходные данные:
SMTP:r.thompson@fabrikam.com(илиSMTP:r.m.thompson@fabrikam.comесли используется первый вариант) - Альтернативные входные данные: [компания] = "Другая компания", [firstName] = "Дэвид", [lastName] = "Jones", [middleName] = "Пол"
-
Альтернативные выходные данные:
SMTP:david.jones@contoso.com(домен по умолчанию илиSMTP:david.p.jones@contoso.comпервый вариант)
Обработка номеров телефонов
Базовое извлечение номеров телефонов
Сценарий 1. Вы хотите извлечь часть номера телефона без кода страны.
Целевой атрибут: телефонный номер
Replace(Replace([mobile], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${phoneNumber}", , ), ,"[()\\s-]+", ,"", , )
Пример:
- Входные значения: [mobile] = "+1 (555) 123-4567"
-
Выходные данные выражения:
5551234567
Сценарий 2. Необходимо извлечь только код страны из номера телефона.
Целевой атрибут: c
Replace(Replace([mobile], , "\\+(?<isdCode>\\d* )(?<phoneNumber>.*)", , "${isdCode}", , ), ,"[()\\s-]+", ,"", , )
Пример:
- Входные значения: [mobile] = "+44 20 7946 0958"
-
Выходные данные выражения:
44
Номер телефона по умолчанию
Сценарий 1. Вы хотите указать номера телефонов по умолчанию, если поле пусто.
Целевой атрибут: телефонный номер
IIF(IsNullOrEmpty([telephoneNumber]),"000-000-0000",[telephoneNumber])
Switch([mobile],[mobile],"","000-000-0000")
Пример:
- Входные значения: [телефонNumber] = ""
-
Выходные данные выражения:
000-000-0000 - Альтернативные входные данные: [mobile] = "555-123-4567"
-
Альтернативные выходные данные:
555-123-4567
Основная логика телефона
Сценарий 1. Необходимо определить, какой номер телефона должен быть помечен как первичный.
Целевой атрибут: extensionAttribute2
Switch(Join("+",Switch([businessPhoneIsPrimary],[businessPhoneIsPrimary],"","other"),Switch([cellPhoneIsPrimary],[cellPhoneIsPrimary],"","other")), "no primary phone",
"false+false", "no primary phone",
"true+false", "business phone is primary",
"false+true", "cell phone is primary",
"true+true", "business phone is primary, cell phone is primary",
"other+true", "cell phone is primary",
"other+false", "no primary phone",
"true+other", "business phone is primary",
"false+other", "no primary phone")
Пример:
- Входные значения: [businessPhoneIsPrimary] = true, [cellPhoneIsPrimary] = false
-
Выходные данные выражения:
business phone is primary - Альтернативные входные данные: [businessPhoneIsPrimary] = "false", [cellPhoneIsPrimary] = "true"
-
Альтернативные выходные данные:
cell phone is primary - Альтернативные входные данные: [businessPhoneIsPrimary] = "", [cellPhoneIsPrimary] = "true"
-
Альтернативные выходные данные:
cell phone is primary
Логика на основе стран и расположений
Сопоставление кода страны
Сценарий 1. Вы хотите сопоставить имена стран с кодами стран ISO.
Целевой атрибут: c
Switch([country], ,
"Trinidad and Tobago", "TT",
"Barbados", "BB"
)
Пример:
- Входные значения: [страна] = "Тринидад и Tobago"
-
Выходные данные выражения:
TT
Сценарий 2. Необходимо сопоставить страны с числовыми кодами стран.
Целевой атрибут: countryCode
Switch([country], ,
"Trinidad and Tobago", "780",
"Barbados", "52"
)
Пример:
- Входные значения: [страна] = "Барбадос"
-
Выходные данные выражения:
52
Домены электронной почты на основе расположения
Сценарий 1. Вы хотите назначить разные домены электронной почты в зависимости от географического расположения.
Целевой атрибут: почта
SelectUniqueValue (
Switch([country],
Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
"India", Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
"Netherlands", Join("@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "contoso.com")
),
Switch([country],
Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
"India", Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "fabrikam.com"),
"Netherlands", Join("1@", NormalizeDiacritics(StripSpaces(Join("", [firstName], [lastName]))), "contoso.com")
)
)
Пример:
- Входные значения: [страна] = "Индия", [firstName] = "Raj", [lastName] = "Patel"
-
Выходные данные выражения:
raj.patel@fabrikam.com(или1raj.patel@fabrikam.comесли первый вариант принимается) - Альтернативный вход: [страна] = "Нидерланды", [firstName] = "Jan", [lastName] = "van der Berg"
-
Альтернативные выходные данные:
jan.vanderberg@contoso.com(или1jan.vanderberg@contoso.comесли используется первый вариант) - Альтернативные входные данные: [страна] = "Германия", [firstName] = "Klaus", [lastName] = "Müller"
-
Альтернативные выходные данные:
klaus.muller@fabrikam.com(домен по умолчанию или1klaus.muller@fabrikam.comпервый вариант)
Классификация сотрудников и сотрудники- контингенты
Классификация типов занятости
Сценарий 1. Вы хотите сопоставить коды типов сотрудников с читаемыми описаниями.
Целевой атрибут: extensionAttribute3
Switch([employeeType],"Default-value",
"31202","Employee",
"31230","Contractor"
)
Пример:
- Входные значения: [employeeType] = "31202"
-
Выходные данные выражения:
Employee - Альтернативные входные данные: [employeeType] = "99999"
-
Альтернативные выходные данные:
Default-value
Идентификация рабочей роли контингента
Сценарий 1. Необходимо определить и обработать сотрудников контингентов по-разному.
Целевой атрибут: extensionAttribute4
Switch([isContingentWorker], "N/A", "True", "Contractor", "False", "Employee")
Пример:
- Входные значения: [isContingentWorker] = "True"
-
Выходные данные выражения:
Contractor
Сопоставление личных названий
Сценарий 1. Вы хотите сопоставить личные коды заголовков с правильными названиями.
IgnoreFlowIfNullOrEmpty(Switch([personalTitle], "", "4443", "Dr.", "4444", "Prof.", "4445", "Prof. Dr."))
Пример:
- Входные значения: [personalTitle] = "4443"
-
Выходные данные выражения:
Dr. - Альтернативные входные данные: [personalTitle] = ""
- Альтернативные выходные данные: (пустое — игнорируется)
Расширенные сценарии
Обработка условного отдела
Сценарий 1. Вы хотите использовать глобальный отдел назначения при наличии, в противном случае вернитесь к регулярному отделу.
Целевой атрибут: отдел
Switch([globalAssignmentDepartment],[globalAssignmentDepartment],
"",[department])
Пример:
- Входные значения: [globalAssignmentDepartment] = "Global IT", [department] = "Local IT"
-
Выходные данные выражения:
Global IT - Альтернативные входные данные: [globalAssignmentDepartment] = "", [отдел] = "Sales"
-
Альтернативные выходные данные:
Sales
Обратимое удаление обработки электронной почты
Сценарий 1. Необходимо изменить адреса электронной почты при обратимом удалении пользователей для сценариев обратной записи.
Целевой атрибут: почта
IIF([IsSoftDeleted]="True", Join("_",FormatDateTime(Now(), , "M/d/yyyy h:mm:ss tt", "yyyy-MM-dd"),[mail]), [mail])
Пример:
- Входные значения: [IsSoftDeleted] = True, [mail] = "john.smith@company.com" (текущая дата: 2025-07-30)
-
Выходные данные выражения:
2025-07-30_john.smith@company.com - Альтернативные входные данные: [IsSoftDeleted] = False, [mail] = "jane.doe@company.com"
-
Альтернативные выходные данные:
jane.doe@company.com
Сложное назначение подразделения с логикой завершения
Сценарий 1. Вы хотите переместить пользователей в специальное подразделение после определенного количества дней.
Целевой атрибут: parentDistinguishedName
IIF(DateDiff("d", Now(), CDate(Switch([latestTerminationDate], [latestTerminationDate], "", "9999-01-01"))) <= -14,
"OU=DELETED,DC=company,DC=com",
Switch([department], "OU=Default,DC=company,DC=com",
"Engineering", "OU=Engineering,DC=company,DC=com",
"Finance", "OU=Finance,DC=company,DC=com"
)
)
Пример:
- Входные значения: [latestTerminationDate] = "2025-07-10", [отдел] = "Инженерия" (текущая дата: 2025-07-30)
-
Выходные данные выражения:
OU=DELETED,DC=company,DC=com(завершено более 14 дней назад) - Альтернативные входные данные: [latestTerminationDate] = "2025-07-25", [отдел] = "Finance"
-
Альтернативные выходные данные:
OU=Finance,DC=company,DC=com(завершено менее 14 дней назад)
Создание имени участника-пользователя с несколькими компаниями с классом сотрудников
Сценарий 1. Необходимо создать имена участника-пользователя на основе сведений о классе компании и сотрудника.
Целевой атрибут: userPrincipalName
SelectUniqueValue (
Switch([employeeClass],
Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
"1916", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
"1915", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
"1917", Join("@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
),
Switch([employeeClass],
Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
"1916", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"),
"1915", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "fabrikam.com"),
"1917", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", Mid([firstName],1,1), [lastName]))), "woodgrove.com")
)
)
Пример:
- Входные значения: [employeeClass] = "1915", [firstName] = "Анна", [lastName] = "Джонсон"
-
Выходные данные выражения:
anna.johnson@fabrikam.com(или01anna.johnson@fabrikam.comесли первый вариант принимается)
Apostrophe и специальная обработка символов
Сценарий 1. Необходимо удалить апострофы и дефисы из адресов электронной почты для совместимости Azure AD Connect.
Целевой атрибут: почта
SelectUniqueValue(
Switch ([divisionId],
Replace(Join("@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , ),
"8900", [email]
),
Replace(Join("1@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , ),
Replace(Join("2@", NormalizeDiacritics(StripSpaces(Join(".", Coalesce([preferredName], [firstName]), [lastName]))), "contoso.com"), , "['-]+", , "", , )
)
Пример:
- Входные значения: [divisionId] = "1200", [preferredName] = "Mary-Ann", [firstName] = "Мэри", [lastName] = "O'Connor"
-
Вывод выражения:
maryann.oconnor@contoso.com(апострофии и дефисы удалены) - Альтернативные входные данные: [divisionId] = "8900", [email] = "existing.user@company.com"
-
Альтернативные выходные данные:
existing.user@company.com
Создание АДРЕСОВ SIP
Сценарий 1. Вы хотите создать SIP-адреса для интеграции Skype для бизнеса и Teams.
Целевой атрибут: proxyAddresses
SelectUniqueValue(
Append("sip:", Join("@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
Append("sip:", Join("01@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com")),
Append("sip:", Join("02@", NormalizeDiacritics(StripSpaces(Join(".", [firstName], [lastName]))), "contoso.com"))
)
Пример:
- Входные значения: [firstName] = "Дэвид", [lastName] = "Уилсон"
-
Выходные данные выражения:
sip:david.wilson@contoso.com(илиsip:01david.wilson@contoso.comесли первый вариант принимается) - Альтернативные входные данные: [firstName] = "Мариа Хосе", [lastName] = "González-Pérez"
-
Альтернативные выходные данные:
sip:mariajose.gonzalezperez@contoso.com(илиsip:01mariajose.gonzalezperez@contoso.comесли первый вариант принимается, илиsip:02mariajose.gonzalezperez@contoso.comесли первые два будут приняты)
Условная логика обратной записи
Сценарий 1. Вы хотите условно записать адреса электронной почты на основе определенных критериев даты.
Целевой атрибут: mailNickname
IgnoreFlowIfNullOrEmpty(IIF(DateDiff("d", Now(), CDate([extensionAttribute9])) <> 1, "", [mail]))
Пример:
- Входные значения: [extensionAttribute9] = "2025-07-31", [mail] = "user@company.com" (текущая дата: 2025-07-30)
- Выходные данные выражения: (пустое — игнорируемое, так как разница дат составляет 1 день)
- Альтернативные входные данные: [extensionAttribute9] = "2025-08-01", [mail] = "user@company.com"
-
Альтернативные выходные данные:
user@company.com
Сценарий 2. Необходимо обрабатывать отсутствующие атрибуты в сценариях обратной записи.
Целевой атрибут: mailNickname
IgnoreFlowIfNullOrEmpty(IIF(IsPresent([extensionAttribute9]),IIF(DateDiff("d", Now(), CDate([extensionAttribute9])) <> 1, "", [mail]),"noemail@contoso.com"))
Пример:
- Входные значения: [extensionAttribute9] = "" (пустая), [почта] = "user@company.com"
-
Выходные данные выражения:
noemail@contoso.com - Альтернативные входные данные: [extensionAttribute9] = "2025-08-01", [mail] = "user@company.com" (текущая дата: 2025-07-30)
-
Альтернативные выходные данные:
user@company.com
Лучшие практики
Используйте SelectUniqueValue для всех атрибутов, требующих уникальности (UPN, samAccountName, email).
Обработка значений NULL и пустых значений с помощью таких функций, как
IsNullOrEmpty,IsPresentSwitchилиCoalesce.Используйте NormalizeDiacritics и StripSpaces при обработке имен, чтобы обеспечить совместимость между системами.
Перед реализацией в рабочей среде проверьте выражения JSONPath в тестовом объекте JSONPath.
Используйте правильное форматирование дат при работе с полями даты SuccessFactors, чтобы избежать ошибок преобразования.
Учитывайте часовые пояса при работе с сравнениями дат и логикой истечения срока действия учетной записи.
Используйте IgnoreFlowIfNullOrEmpty для потоков условных атрибутов и сценариев обратной записи.
Тщательно протестируйте сложные операторы Switch , так как они могут стать сложными для отладки.
Четко документируйте бизнес-логику, особенно для сложных правил управления рабочими записями и состояния занятости.
Тщательно используйте шаблоны regex и проверьте их в онлайн-ретекс-тестировщиках перед реализацией.