Публикации — Администрирование¶
Обзор¶
Публикации (Published Objects) -- механизм создания REST-эндпоинтов, привязанных к SmartScript через пакеты действий. Цепочка создания: Script → Pack → PackAction → PublishedObject → ExternalObject (доступ).
Администрирование -- только через Admin API, форм автоадминки нет.
Создание публикации -- полная цепочка¶
1. Пакет действий¶
# DTO: PackPostDto = {pack: PackDto, editorContext: PackEditorContextDto}
# ОБЯЗАТЕЛЬНО: editorContext с noContextMode: true. Без него -- 500!
curl -s -X POST "$HOST/api/admin/smart/packs/" \
-H "1F-Pat: $PAT" -H "Content-Type: application/json" \
-d '{
"pack": {
"packId": null,
"subcatId": null,
"name": "my-pack-alias",
"description": "Описание пакета",
"isCyclic": false,
"isPublished": false
},
"editorContext": {
"noContextMode": true,
"eventId": null,
"subcatId": null,
"origin": null,
"cycleContext": false,
"isForMail": false,
"isForQueue": false
}
}'
# → {"data": {"packId": 90160, ...}}
Критические ловушки создания Pack:
- POST /api/admin/smart/packs/ (не /api/admin/smart/packs/0) -- packId в body, не в URL
- editorContext обязателен даже для создания без категории -- без него 500
- noContextMode: true -- для standalone Pack (публикации, глобальные правила)
- packId: null (не 0!) -- 0 → EntityNotFound
- Тело {description: "..."} без обёртки → 500. Нужна полная структура {pack: {}, editorContext: {}}
2. Действие в пакете¶
# DTO: PackActionPostDto = {packAction: PackActionDto, editorContext: ...}
curl -s -X POST "$HOST/api/admin/smart/packs/{packId}/actions/1" \
-H "1F-Pat: $PAT" -H "Content-Type: application/json" \
-d '{
"packAction": {
"actionId": "ExecuteSmartScript",
"id": null,
"order": 1,
"parameters": [{
"order": 0,
"showInPreview": false,
"scriptId": 563
}]
},
"editorContext": {
"noContextMode": true,
"eventId": null, "subcatId": null, "origin": null,
"cycleContext": false, "isForMail": false, "isForQueue": false
}
}'
# → {"data": {"actionId": "ExecuteSmartScript", "id": 102070, ...}}
actionId: "ExecuteSmartScript" -- строка, не число 106! API принимает enum-строку. parameters[0].scriptId = ID SmartScript.
Type ExecuteSmartScript vs Response: ExecuteSmartScript -- framework развёртывает {StatusCode, Content}. Response -- возвращает как есть → двойная обёртка. Для публикаций с данными: только ExecuteSmartScript.
3. Публикация¶
# Шаг 1: Создать (POST без id)
curl -s -X POST "$HOST/app/v1.2/api/publishedObjects" \
-H "1F-Pat: $PAT" -H "Content-Type: application/json" \
-d '{
"alias": "my-api",
"description": "Описание",
"httpMethod": "Get",
"actionsPackId": '$PACK_ID',
"parameters": []
}'
# → HTTP 204 (пустое тело!)
# Шаг 2: Найти ID через gridData
curl -s "$HOST/app/v1.2/api/publishedObjects/gridData" -H "1F-Pat: $PAT" \
| python3 -c "import json,sys; [print(i) for i in json.load(sys.stdin) if i.get('alias')=='my-api']"
# → {"id": 2001, "externalObjectId": "guid", "isActive": false, ...}
# Шаг 3: Активировать + установить тип Action + привязать Pack
curl -s -X POST "$HOST/app/v1.2/api/publishedObjects/$PUB_ID" \
-H "1F-Pat: $PAT" -H "Content-Type: application/json" \
-d '{
"description": "Описание",
"alias": "my-api",
"publicationType": "Action",
"httpRequestType": "Get",
"isActive": true,
"externalObjectId": "'$GUID'",
"parameters": [],
"publicationObject": {
"publicationId": '$PUB_ID',
"actionsPackId": '$PACK_ID',
"id": 0
},
"id": '$PUB_ID'
}'
# → HTTP 204
Критические ловушки Publication:
- Создание возвращает 204 без body -- ID нужно искать через GET gridData
- publicationType по умолчанию "Data" -- для SS-публикаций нужно "Action"!
- Без publicationObject.actionsPackId -- Publication отдаёт 404 при вызове
- isActive: false по умолчанию -- нужно явно активировать через update
4. Настройка доступа (ExternalObject)¶
# GET full → modify → POST (partial update = 500!)
curl -s "$HOST/app/v1.2/api/externalObjects/$GUID/full" -H "1F-Pat: $PAT" > /tmp/extobj.json
# Изменить visibleToAnyone и POST обратно весь DTO
curl -s -X POST "$HOST/app/v1.2/api/externalObjects/$GUID" \
-H "1F-Pat: $PAT" -H "Content-Type: application/json" \
-d '{
"externalObjectsViewRights": [],
"externalObjectsSpecialRights": [],
"guid": "'$GUID'",
"description": "Публикации: my-api",
"visibleToAnyone": true,
"isAnonymous": false,
"id": '$EXT_ID'
}'
# → HTTP 204
Подробная логика проверки доступа: access-control.md.
5. Обновление Include (JS вставки)¶
# Include = JS-код вставки на портале. Обновляется через /api/includes/{id}/update
# GET код: через block includes API (содержимое в .content)
curl -s "$HOST/api/portals/block/{blockId}/includes" -H "1F-Pat: $PAT" > /tmp/include.json
# → [{id, type, name, content}]
# POST обновление
curl -s -X POST "$HOST/api/includes/{includeId}/update" \
-H "1F-Pat: $PAT" -H "Content-Type: application/json" \
-d '{"id": 5950, "name": "My Include", "type": "Js", "content": "...код..."}'
# → HTTP 200
Типичные ошибки¶
| Проблема | Причина | Решение |
|---|---|---|
| 403 при вызове публикации | ExternalObject access не настроен | visibleToAnyone: true или добавить группы |
| 500 при обновлении ExternalObject | groupIds не существует как поле |
externalObjectsViewRights: [{externalObjectId, groupId}] |
| ExternalObject partial update → 500 | Требует полный DTO | Паттерн: GET .../externalObjects/{guid}/full → изменить → POST обратно |
POST /publishedObjects/{id} |
Это UPDATE, не create | POST /publishedObjects (без id) = создание |
| Publication update → 500 | Неполный DTO (забыли name у параметра) |
GET → modify → POST полный DTO. Параметры: name + key оба обязательны |
| GET ExternalObject → 404 | Путь без /full |
GET .../externalObjects/{guid}/full |
| Виджет виден, данных нет | Блок доступен (группы), публикация закрыта | Настроить ExternalObject с теми же группами |
| Дубль alias → 400 (не 409) | CheckIsUniqueAlias() -- alias уникален per type+method |
Проверить: GET /app/v1.2/api/publishedObjects/gridData (GET, не POST!) |
gridData -- 405 на POST |
Эндпоинт только GET | GET /app/v1.2/api/publishedObjects/gridData |
| Незарегистрированный параметр → молча отброшен | GetParametersWithSettings() фильтрует по publication.Parameters |
Все query params должны быть зарегистрированы в parameters[] публикации. id: 0 для нового параметра |
| Pack создание → 500 | Отсутствует editorContext или неправильная обёртка |
DTO: {pack: {packId: null, ...}, editorContext: {noContextMode: true, ...}}. Оба поля обязательны |
| Publication → 404 при вызове | publicationType: "Data" (по умолчанию) вместо "Action" |
UPDATE: publicationType: "Action", publicationObject.actionsPackId = Pack ID |
| Publication создание → нет ID в ответе | 204 без body -- by design | GET /app/v1.2/api/publishedObjects/gridData, фильтр по alias |
| Pack admin API → пустые ответы | Pack endpoints ненадёжны для инспекции | Fallback: SELECT * FROM PacksActions WHERE ActionsPackID = N. Publication DTO → actionsPackId |
Связанные документы¶
docs/domains/publications/access-control.md-- логика проверки доступа (ExternalObject)docs/domains/smart-actions/admin.md-- SmartScript Editor API (создание скриптов)docs/domains/portal/portal-api-cookbook.md-- виджеты на порталах, привязанные к публикациям