Перейти к содержимому

Внешние интеграции

Руководство для разработчиков и интеграторов: как подключать ERP, 1C, Service Desk, BI и другие системы к Portal.

Старт разработки и карта разделов: Разработчикам. Практические гайды: узлы, списки.

См. также: REST API, кейсы кода, OpenAPI.

Portal не поддерживает регистрацию произвольных URL вроде /api/v1/my-erp/sync из пакетов или конфигурации. Все маршруты регистрируются централизованно в исходниках Portal.Api при сборке платформы.

Разработчик интеграций работает с фиксированным REST API (/api/v1/*) и расширениями, которые встраиваются в существующие invoke/action-механизмы.

Внешняя система ──JWT + CRUD──► /api/v1 REST API
WebPart UI ──invoke/action──► /api/v1/webparts/invoke/{key}/…
Event Receiver / Timer Job ──HTTP из C#──► внешняя система

Важно: /api/v1/routes — разрешение URL-адресов страниц для браузера, а не API для интеграций.


Путь 1. Внешняя система вызывает Portal (основной сценарий)

Заголовок раздела «Путь 1. Внешняя система вызывает Portal (основной сценарий)»

Внешняя система — клиент встроенного REST API.

  1. Аутентификация — сервисная учётная запись, POST /api/v1/auth/loginJWT (аутентификация)
  2. Обнаружение ресурсовGET /api/v1/nodes, GET /api/v1/lists/{id}/fields
  3. Чтение/запись данныхGET/POST/PATCH /api/v1/lists/{listId}/items
  4. Права — при необходимости GET/POST /api/v1/permissions (права)
  • Фильтрация — по internal_name поля (inn, status, …)
  • Запись — по UUID полей из GET .../fields (кешировать)

Пример (ERP → Portal, кейс 10):

GET /api/v1/lists/{listId}/fields
Authorization: Bearer …
GET /api/v1/lists/{listId}/items?filter={"logic":"and","conditions":[{"column":"inn","operator":"eq","value":"7707083893"}]}&limit=1
POST /api/v1/lists/{listId}/items
Content-Type: application/json
{
"fieldValues": {
"uuid-title": "ООО Ромашка",
"uuid-inn": "7707083893",
"uuid-status": "Активен"
}
}
PATCH /api/v1/lists/{listId}/items/42
Content-Type: application/json
{
"fieldValues": {
"uuid-status": "Архив"
}
}
МатериалОписание
REST APIОбзор всех маршрутов
OpenAPIПолная спецификация
Значения полейФормат fieldValues
PortalApiClient.csПример HTTP-клиента на C#

Путь 2. Portal вызывает внешнюю систему (исходящая интеграция)

Заголовок раздела «Путь 2. Portal вызывает внешнюю систему (исходящая интеграция)»

Новый HTTP-эндпоинт на Portal не создаётся. Логика исходящих вызовов пишется в C#-расширениях.

listItem.updated → event_receivers → portal_jobs → IEventReceiver.HandleAsync
ШагДействие
1Скачайте Extension SDK, затем dotnet new portal-eventreceiver
2Реализовать HandleAsync(...) — внутри вызвать внешний HTTP API
3Собрать .portalevent, загрузить: Админка → Event Receivers
4Привязать: POST /api/v1/event-receivers с eventName + config.listId
5Мониторинг: Админка → Задания

Документация: Event Receivers, привязка к событиям.

Пример привязки:

{
"eventName": "listItem.updated",
"jobType": "contoso.list-change-handler",
"config": { "listId": "uuid-списка" },
"isEnabled": true
}

Timer Job (.portaltimer) — периодическая синхронизация

Заголовок раздела «Timer Job (.portaltimer) — периодическая синхронизация»

Для nightly sync (ERP → Portal или Portal → ERP):

ШагДействие
1dotnet new portal-timerjob
2Реализовать ExecuteAsync с HTTP-вызовами
3Загрузить пакет, настроить расписание в Админка → Timer Jobs

Документация: Timer Jobs, интеграция с Worker.


Путь 3. Серверная логика через WebPart (UI + actions)

Заголовок раздела «Путь 3. Серверная логика через WebPart (UI + actions)»

WebPart не добавляет новые REST-маршруты, но даёт фиксированные invoke-эндпоинты:

МетодПутьНазначение
POST/api/v1/webparts/invoke/{key}/renderSSR HTML
POST/api/v1/webparts/invoke/{key}/actionСерверные действия

{key} — из manifest.json пакета .portalpart, не произвольный URL.

ШагДействие
1dotnet new portal-webpart -n my-widget
2RenderAsync + HandleActionAsync в IWebPart
3Сборка .portalpart, загрузка: Админка → WebPart
4Размещение на странице через zonesContent

Документация: сборка WebPart, UI и API, API каталога.


Путь 4. Функциональный модуль (.portalmod) — полное решение

Заголовок раздела «Путь 4. Функциональный модуль (.portalmod) — полное решение»

Если интеграция — часть готового решения (структура портала + расширения):

ШагДействие
1Описать module.json (узлы, списки, страницы, права)
2Положить .portalpart/.portalevent/.portaltimer в packages/
3Опционально — C# provisioner для начальных данных
4Установить: Админка → Модули или POST /api/v1/modules/install
5Получить resource_map: GET /api/v1/modules/{key}/resources

Документация: функциональные модули, API модулей, схема module.json.


КонтекстSDKКлючи при записиПрава
REST (внешняя система)HTTPUUID полейJWT сервисного пользователя
WebPartPortal.WebPart.SdkUUID полейТекущий пользователь страницы
Event ReceiverPortal.EventReceiver.SdkUUID полейПользователь события
Timer JobPortal.TimerJob.SdkUUID полейrunAsUserId из config
ProvisionerPortal.Module.Sdkinternal_nameСистемные (установка модуля)

Подробнее: кейсы работы с сущностями.


  • Нет plugin API для регистрации своих /api/v1/* маршрутов из пакетов
  • Нет inbound webhook-эндпоинтов — внешняя система не может «стучаться» на произвольный URL Portal; только клиент вызывает фиксированный REST API
  • Нет API keys — только JWT через логин пользователя (local или LDAP)
  • Новые HTTP-маршруты — только изменением исходников Portal.Api (работа вендора платформы)

  1. REST API — обзор маршрутов
  2. Аутентификация — вход и JWT
  3. Значения полей — чтение/запись данных
  4. Кейсы кода — практические примеры (в т.ч. ERP)
  5. По типу расширения: event-receivers / timer-jobs / webparts / modules