Дополнительные действия
Oagapov (обсуждение | вклад) Нет описания правки |
Oagapov (обсуждение | вклад) |
||
| (не показано 12 промежуточных версий этого же участника) | |||
| Строка 1: | Строка 1: | ||
ETL ( | ==== Общая информация ==== | ||
'''ETL''' ('''E'''xtract, '''T'''ransform, '''L'''oad) — это приложения для обработки данных, которое используется для извлечения, преобразования и загрузки данных от одного провайдера (домена) к другому провайдеру (домену). При этом домены могут принадлежать одному или разным экземплярам платформы. | |||
ETL поддерживает: | |||
* Гибкие правила синхронизации с маппингом полей; | |||
* Различные режимы работы: ручной, по таймеру, в реальном времени; | |||
* Двунаправленную синхронизацию; | |||
* Фильтрацию данных на уровне источника и назначения; | |||
* Обработку ошибок и контроль состояния. | |||
Общий принцип работы приложения ETL внутри Платформы с Доменом A, которое взаимодействует с другим экземпляров платформы с Доменом B. | Общий принцип работы приложения ETL внутри Платформы с Доменом A, которое взаимодействует с другим экземпляров платформы с Доменом B. | ||
[[Файл:ETL схема.png|центр|600x600пкс|мини]] | |||
Для работы ETL используются провайдеры и правила. | |||
Провайдер:<syntaxhighlight lang="json"> | |||
{ | |||
"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" | |||
} | |||
</syntaxhighlight>Правило:<syntaxhighlight lang="json"> | |||
{ | |||
"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" | |||
} | |||
</syntaxhighlight> | |||
==== Порядок настройки ==== | |||
====== Создание провайдера ====== | |||
Запустите приложение ETL (для пользователя должна присутствовать роль ''etl_admin'') и создайте два провайдера данных. | Запустите приложение ETL (для пользователя должна присутствовать роль ''etl_admin'') и создайте два провайдера данных. | ||
# | # Домен A. Собственный экземпляр работы приложения ETL. Укажите адрес сервера, домен и токен. | ||
# | # Домен B. Удаленный экземпляр платформы B. Укажите адрес сервера, домен и токен. | ||
Токен, необходимый для доступа к провайдеру, необходимо скопировать из приложения «Настройки», раздел «Каналы интеграции». Рекомендуем использовать токен product_layer. Скопируйте значение из поля «Локальный токен». Повторите действие для второго провайдера, указав токен удалённого Домена B. | |||
Токен, необходимый для доступа к провайдеру, необходимо скопировать из приложения «Настройки», раздел «Каналы интеграции». Рекомендуем использовать токен product_layer. Скопируйте значение из поля «Локальный токен». Повторите действие для второго провайдера, указав токен | |||
Сохраните значения. Провайдеры подключаются автоматически. | Сохраните значения. Провайдеры подключаются автоматически и перейдут в статус ''connected''. | ||
[[Файл:Провайдер ETL.png|центр|безрамки|999x999пкс]] | |||
Создайте правило | ====== Создание правил ====== | ||
Создайте правило ETL. Укажите провайдеров источника и получателя, созданных выше. Выберите режим загрузки данных (В реальном времени). | |||
[[Файл:Правило ETL.png|центр|безрамки|999x999пкс]] | |||
В данном примере мы синхронизируем в обе стороны данные трех классов приложения Smart, а именно smart/Contacts, smart/Accounts и smart/Requests. Укажите для каждого класса состав правила с двусторонним направлением синхронизации данных. | |||
[[Файл:Состав правила ETL.png|центр|безрамки|999x999пкс]] | |||
Повторите для классов smart/Accounts и smart/Requests. | |||
====== Мониторинг работы ====== | |||
Добавьте запись на любом из экземпляров платформы в приложении Smart. В разделе «Мониторинг правил» проконтролируйте выполнения синхронизации в режиме реального времени при помощи WebSocket-протокола. Убедитесь, что запись была создана также в домене B. | |||
Возможно использовать более сложные правила для переноса данных из различных классов, будь то системные, продуктовые или пользовательские классы платформы. | Возможно использовать более сложные правила для переноса данных из различных классов, будь то системные, продуктовые или пользовательские классы платформы. | ||
[[Файл:Мониторинг ETL.png|центр|безрамки|999x999пкс]] | |||
====== Важно ====== | |||
Обратите внимание, что некоторые классы невозможно использовать в ETL-приложении. Например, те, которые содержат зашифрованные пароли или хэш-данные . Также некоторые системные классы имеют запрет на изменение данных. | |||
==== Дополнительные параметры ==== | |||
====== Интервалы (interval) ====== | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"interval": "hour" // Последний час | |||
} | |||
{ | |||
"interval": "day" // Последний день | |||
} | |||
{ | |||
"interval": ["2024-01-01","2024-12-31"] // Конкретный период | |||
} | |||
</syntaxhighlight> | |||
[[Категория:Приложения]] | [[Категория:Приложения]] | ||
====== Фильтры (filter) ====== | |||
Фильтры используют префиксную нотацию (польская запись).<syntaxhighlight lang="json"> | |||
["operator", ["property", "fieldName"], ["const", "value"]] | |||
</syntaxhighlight>Операторы | |||
Сравнение<syntaxhighlight lang="json"> | |||
// Равенство | |||
["==", ["property", "status"], ["const", "active"]] | |||
// Не равно | |||
["!=", ["property", "type"], ["const", "deleted"]] | |||
// Больше / меньше | |||
[">", ["property", "amount"], ["const", 100]] | |||
["<", ["property", "age"], ["const", 65]] | |||
[">=", ["property", "score"], ["const", 50]] | |||
["<=", ["property", "priority"], ["const", 10]] | |||
</syntaxhighlight>Логические операции<syntaxhighlight lang="json"> | |||
// И (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]] | |||
] | |||
</syntaxhighlight>Проверка на NULL<syntaxhighlight lang="json"> | |||
// Поле пустое | |||
["isNull", ["property", "deletedAt"]] | |||
// Поле не пустое | |||
["not", ["isNull", ["property", "createdAt"]]] | |||
</syntaxhighlight>Использование значений провайдера в фильтре<syntaxhighlight lang="json"> | |||
{ | |||
"filter": [ | |||
"==", | |||
["property", "domainName"], | |||
["sourceProvider", "domain"] | |||
] | |||
} | |||
</syntaxhighlight> | |||
====== Значения (values) ====== | |||
Используются для маппинга и определяет как поля источника сопоставляются с полями назначения. | |||
Прямое копирование поля<syntaxhighlight lang="json"> | |||
{ | |||
"values": { | |||
"targetField": "sourceField" | |||
} | |||
} | |||
</syntaxhighlight>Константа<syntaxhighlight lang="json"> | |||
{ | |||
"values": { | |||
"status": ["const", "active"] | |||
} | |||
} | |||
</syntaxhighlight>Значения из провайдера <syntaxhighlight lang="json"> | |||
{ | |||
"values": { | |||
"domain": ["sourceProvider", "domain"], | |||
"targetDomain": ["destinationProvider", "domain"] | |||
} | |||
} | |||
</syntaxhighlight>JavaScript-выражение<syntaxhighlight lang="json"> | |||
{ | |||
"values": { | |||
"fullName": { | |||
"code": "'[firstName]' + ' ' + '[lastName]'", | |||
"expressionKind": "expression" | |||
}, | |||
"formattedPhone": { | |||
"code": "'5'.concat('[phone]')", | |||
"expressionKind": "expression" | |||
}, | |||
"parsedData": { | |||
"code": "JSON.parse('[jsonField]').propertyName", | |||
"expressionKind": "expression" | |||
} | |||
} | |||
} | |||
</syntaxhighlight>Автоматический маппинг | |||
Используйте "*" для автоматического сопоставления полей с одинаковыми именами<syntaxhighlight lang="json"> | |||
{ | |||
"values": { | |||
"*": "*" | |||
} | |||
} | |||
</syntaxhighlight>или <syntaxhighlight lang="json"> | |||
{ | |||
"values": null | |||
} | |||
</syntaxhighlight> | |||
====== Игнорирование параметров (ignoreProperties) ====== | |||
<syntaxhighlight lang="json"> | |||
{ | |||
"ignoreProperties":[ | |||
"internalId", | |||
"systemField", | |||
"temporaryData" | |||
] | |||
} | |||
</syntaxhighlight> | |||
Текущая версия от 21:55, 29 января 2026
Общая информация
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) и создайте два провайдера данных.
- Домен A. Собственный экземпляр работы приложения ETL. Укажите адрес сервера, домен и токен.
- Домен 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"
]
}