Открыть меню
Платформа Эра. Документация
Toggle preferences menu
Открыть персональное меню
Вы не представились системе
Your IP address will be publicly visible if you make any edits.

Приложение ETL

Материал из Платформа Эра. Документации

Общая информация

ETL (Extract, Transform, Load) — это приложение для обработки данных, которое используется для извлечения, преобразования и загрузки данных от одного провайдера (домена) к другому провайдеру (домену). При этом домены могут принадлежать одному или разным экземплярам платформы.

ETL поддерживает:

  • Гибкие правила синхронизации с маппингом полей;
  • Различные режимы работы: ручной, по таймеру, в реальном времени;
  • Двунаправленную синхронизацию;
  • Фильтрацию данных на уровне источника и назначения;
  • Обработку ошибок и контроль состояния.

Общий принцип работы приложения ETL внутри Платформы с Доменом A, которое взаимодействует с другим экземпляров платформы с Доменом B.

Для работы ETL используются провайдеры и правила.

Провайдер:

{
  "domain": "domainA.era.company.ru",
  "enabled": true,
  "id": "aced949b6a7bc80e7f6c6449188dd78a",
  "kind": "erawebsocket",
  "name": "DomainA@era.company.ru",
  "serverAddress": "https://era.company.ru",
  "state": "connected",
  "statusText": "29.01.2026 20:02:21",
  "token": "72ffb7137841adb3fc04a41017ac8194"
}

Правило:

{
  "destinationProvider_id": "86420117-2abb-4f92-9013-a5f832644df9",
  "id": "c12248cf-46ee-4c66-8e51-87ebeb013fae",
  "interval": null,
  "items": [
    {
      "cancelDestinationChanges": false,
      "destination": {
        "className": "smart/Contacts"
      },
      "direction": "duplex",
      "name": "Контакты",
      "source": {
        "className": "smart/Contacts"
      }
    },
    {
      "cancelDestinationChanges": false,
      "destination": {
        "className": "smart/Accounts"
      },
      "direction": "duplex",
      "name": "Контрагенты",
      "source": {
        "className": "smart/Accounts"
      }
    },
    {
      "cancelDestinationChanges": false,
      "destination": {
        "className": "smart/Requests"
      },
      "direction": "duplex",
      "name": "Тикеты",
      "source": {
        "className": "smart/Requests"
      }
    }
  ],
  "mode": "realtime",
  "name": "Двусторонняя связь",
  "sourceProvider_id": "a7a6fca5-db25-44d8-8f1e-26c2ebf5905e"
}

Порядок настройки

Создание провайдера

Запустите приложение ETL (для пользователя должна присутствовать роль etl_admin) и создайте два провайдера данных.

  1. Домен A. Собственный экземпляр работы приложения ETL. Укажите адрес сервера, домен и токен.
  2. Домен B. Удаленный экземпляр платформы B. Укажите адрес сервера, домен и токен.

Токен, необходимый для доступа к провайдеру, необходимо скопировать из приложения «Настройки», раздел «Каналы интеграции». Рекомендуем использовать токен product_layer. Скопируйте значение из поля «Локальный токен». Повторите действие для второго провайдера, указав токен удалённого Домена B.

Сохраните значения. Провайдеры подключаются автоматически и перейдут в статус connected.

Создание правил

Создайте правило ETL. Укажите провайдеров источника и получателя, созданных выше. Выберите режим загрузки данных (В реальном времени).

В данном примере мы синхронизируем в обе стороны данные трех классов приложения Smart, а именно smart/Contacts, smart/Accounts и smart/Requests. Укажите для каждого класса состав правила с двусторонним направлением синхронизации данных.

Повторите для классов smart/Accounts и smart/Requests.

Мониторинг работы

Добавьте запись на любом из экземпляров платформы в приложении Smart. В разделе «Мониторинг правил» проконтролируйте выполнения синхронизации в режиме реального времени при помощи WebSocket-протокола. Убедитесь, что запись была создана также в домене B.

Возможно использовать более сложные правила для переноса данных из различных классов, будь то системные, продуктовые или пользовательские классы платформы.

Важно

Обратите внимание, что некоторые классы невозможно использовать в ETL-приложении. Например, те, которые содержат зашифрованные пароли или хэш-данные . Также некоторые системные классы имеют запрет на изменение данных.

Дополнительные параметры

Интервалы (interval)
{
	"interval": "hour" // Последний час
}

{
	"interval": "day" // Последний день
}

{
	"interval": ["2024-01-01","2024-12-31"] // Конкретный период
}
Фильтры (filter)

Фильтры используют префиксную нотацию (польская запись).

["operator", ["property", "fieldName"], ["const", "value"]]

Операторы Сравнение

// Равенство
["==", ["property", "status"], ["const", "active"]]

// Не равно
["!=", ["property", "type"], ["const", "deleted"]]

// Больше / меньше
[">",  ["property", "amount"],   ["const", 100]]
["<",  ["property", "age"],      ["const", 65]]
[">=", ["property", "score"],    ["const", 50]]
["<=", ["property", "priority"], ["const", 10]]

Логические операции

// И (AND)
["and",
  ["==", ["property", "status"], ["const", "active"]],
  [">",  ["property", "amount"], ["const", 0]]
]

// Или (OR)
["or",
  ["==", ["property", "type"], ["const", "A"]],
  ["==", ["property", "type"], ["const", "B"]]
]

// Не (NOT)
["not",
  ["==", ["property", "deleted"], ["const", true]]
]

Проверка на NULL

// Поле пустое
["isNull", ["property", "deletedAt"]]

// Поле не пустое
["not", ["isNull", ["property", "createdAt"]]]

Использование значений провайдера в фильтре

{
  "filter": [
    "==",
    ["property", "domainName"],
    ["sourceProvider", "domain"]
  ]
}
Значения (values)

Используются для маппинга и определяет как поля источника сопоставляются с полями назначения.

Прямое копирование поля

{
  "values": {
    "targetField": "sourceField"
  }
}

Константа

{
  "values": {
    "status": ["const", "active"]
  }
}

Значения из провайдера

{
  "values": {
    "domain": ["sourceProvider", "domain"],
    "targetDomain": ["destinationProvider", "domain"]
  }
}

JavaScript-выражение

{
  "values": {
    "fullName": {
      "code": "'[firstName]' + ' ' + '[lastName]'",
      "expressionKind": "expression"
    },
    "formattedPhone": {
      "code": "'5'.concat('[phone]')",
      "expressionKind": "expression"
    },
    "parsedData": {
      "code": "JSON.parse('[jsonField]').propertyName",
      "expressionKind": "expression"
    }
  }
}

Автоматический маппинг Используйте "*" для автоматического сопоставления полей с одинаковыми именами

{
  "values": {
    "*": "*"
  }
}

или

{
  "values": null
}
Игнорирование параметров (ignoreProperties)
{
   "ignoreProperties":[
      "internalId",
      "systemField",
      "temporaryData"
   ]
}