Files
request-portal/provisioning

Провижининг списков SharePoint

Автоматическое создание списков данных для форм портала заявок из манифестов provisioning.json (по одному на форму, лежат в папке каждой формы).

Списки согласования пока не создаются — только данные.

Как это работает

  • Каждая форма описывает свои колонки в src/webparts/requestPortal/forms/<Форма>/provisioning.json.
  • Скрипт Provision-Lists.ps1 читает все такие манифесты и идемпотентно создаёт списки и колонки: перед созданием колонки проверяется, что её ещё нет; повторный запуск ничего не ломает и не дублирует.

Добавить колонку/форму = отредактировать/добавить provisioning.json и перезапустить скрипт.

Поддерживаемые типы колонок (type в манифесте)

type Что это Доп. поля
Text однострочный текст —
Note многострочный текст —
Number число decimals (знаков после запятой)
Choice выбор из вариантов choices (массив)
DateTime дата/время —
Boolean да/нет —
User пользователь —
Lookup подстановка lookupList (заголовок источника), lookupShowField (по умолч. Title)

Плюс на уровне формы: titleColumnName — переименовать стандартную колонку Title.

Порядок для Lookup: список-источник должен существовать раньше, чем колонка, которая на него ссылается. Если источник в другой форме — сначала прогоните её манифест.

Разовая подготовка

  1. Установить модуль PnP PowerShell (нужен PowerShell 7+):
    Install-Module PnP.PowerShell -Scope CurrentUser
    
  2. Зарегистрировать приложение с правом Sites.Selected и сертификатом в хранилище:
    Register-PnPEntraIDApp -ApplicationName "PnP-Provisioning-Scoped" -Tenant "<тенант>.onmicrosoft.com" -SharePointApplicationPermissions "Sites.Selected" -Store CurrentUser
    
    Запомнить Client Id из вывода.
  3. Администратор один раз:
    • одобряет запрос на согласие приложения (Admin consent),
    • выдаёт приложению доступ только к нужному сайту:
      Grant-PnPAzureADAppSitePermission -AppId "<client-id>" -DisplayName "PnP-Provisioning-Scoped" -Permissions FullControl -Site "https://<тенант>.sharepoint.com/sites/<сайт>"
      

Запуск

Узнать отпечаток сертификата (Thumbprint):

Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*PnP-Provisioning-Scoped*" } | Select-Object Subject, Thumbprint

Запустить провижининг (вход по сертификату, без пароля в коде):

cd provisioning
./Provision-Lists.ps1 `
  -SiteUrl "https://<тенант>.sharepoint.com/sites/<сайт>" `
  -ClientId "<client-id>" `
  -Tenant "<тенант>.onmicrosoft.com" `
  -Thumbprint "<отпечаток>"

Лог: [+] — создано, [=] — уже существовало, [~] — переименовано, [!] — предупреждение.

Важно про имена колонок

В манифесте у колонки два имени:

  • internalName — латиницей, без пробелов, ≤32 символов (техническое имя в SharePoint);
  • title — отображаемое, любое (рус., с пробелами).

Так мы избегаем проблемы, когда SharePoint кодирует пробелы в _x0020_ и обращения к полю ломаются. Не создавайте колонки с русским internalName.

Проверка на тесте

Сначала прогоните на тестовом сайте, убедитесь, что списки и колонки создались правильно, и только потом — на боевом.