Перейти к содержанию

Публикации — Администрирование

Обзор

Публикации (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 -- виджеты на порталах, привязанные к публикациям