Функции сопоставления выражений SuccessFactors для подготовки идентификаторов Microsoft Entra

В этой статье содержится комплексное руководство по часто используемым функциям сопоставления выражений при настройке SuccessFactors для подготовки пользователей идентификатора Microsoft Entra ID. Эти функции помогают преобразовывать и сопоставлять данные из SuccessFactors для создания соответствующих атрибутов пользователей в идентификаторе Microsoft Entra.

Оглавление

Функции обработки строк

Базовые строковые операции

Сценарий 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 и проверьте их в онлайн-ретекс-тестировщиках перед реализацией.

Дополнительные ресурсы