Files
request-portal/provisioning/README.md
T
2026-08-03 09:35:14 +05:00

85 lines
4.9 KiB
Markdown

# Провижининг списков 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+):
```powershell
Install-Module PnP.PowerShell -Scope CurrentUser
```
2. Зарегистрировать приложение с правом `Sites.Selected` и сертификатом в хранилище:
```powershell
Register-PnPEntraIDApp -ApplicationName "PnP-Provisioning-Scoped" -Tenant "<тенант>.onmicrosoft.com" -SharePointApplicationPermissions "Sites.Selected" -Store CurrentUser
```
Запомнить **Client Id** из вывода.
3. Администратор один раз:
- одобряет запрос на согласие приложения (Admin consent),
- выдаёт приложению доступ **только к нужному сайту**:
```powershell
Grant-PnPAzureADAppSitePermission -AppId "<client-id>" -DisplayName "PnP-Provisioning-Scoped" -Permissions FullControl -Site "https://<тенант>.sharepoint.com/sites/<сайт>"
```
## Запуск
Узнать отпечаток сертификата (Thumbprint):
```powershell
Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*PnP-Provisioning-Scoped*" } | Select-Object Subject, Thumbprint
```
Запустить провижининг (вход по сертификату, без пароля в коде):
```powershell
cd provisioning
./Provision-Lists.ps1 `
-SiteUrl "https://<тенант>.sharepoint.com/sites/<сайт>" `
-ClientId "<client-id>" `
-Tenant "<тенант>.onmicrosoft.com" `
-Thumbprint "<отпечаток>"
```
Лог: `[+]` — создано, `[=]` — уже существовало, `[~]` — переименовано, `[!]` — предупреждение.
## Важно про имена колонок
В манифесте у колонки два имени:
- `internalName` — латиницей, без пробелов, ≤32 символов (техническое имя в SharePoint);
- `title` — отображаемое, любое (рус., с пробелами).
Так мы избегаем проблемы, когда SharePoint кодирует пробелы в `_x0020_` и обращения к
полю ломаются. Не создавайте колонки с русским internalName.
## Проверка на тесте
Сначала прогоните на **тестовом** сайте, убедитесь, что списки и колонки создались
правильно, и только потом — на боевом.