Обработчик события — запускает определенное действие в системе после того, как событие произошло. Более подробная информация в справке по системе https://elma365.com/ru/help/events_processing.html
Создадим обработчик события, который будет отслеживать ("перехватывать") изменение значения определенной контекстной переменной элемента приложения и логировать историю этих изменений.
Приложение Дисконтная карта (discount_card) в разделе CRM (_clients).
Контекст приложения:
В данном примере мы будем отслеживать изменение значения переменной "Размер скидки, %" (percent_discount) типа Целое число и записывать историю изменений в переменную "История изменения скидки" (discount_history) типа Текст.
Реализация обработчика.
Создадим модуль в разделе Администрирование-Модули-Пользовательские модули.
На вкладке «Обработка событий» создадим новое событие.
Домен события: элементы приложений.
Событие: обновление элемента.
Тип обработчика: запуск скрипта.
На вкладке Настройки нашего модуля создадим переменную Дисконтная карта с типом приложения Дисконтная карта. Это необходимо для дальнейшего поиска нашего элемента в сценарии модуля (так как Global в модулях недоступен).
Перейдём на вкладку «Сценарии» созданного обработчика. На данной вкладке будет создан метод по умолчанию
async function action(): Promise<void> {}
Код обработчика необходимо реализовать в данном методе.
Код:
async function action(): Promise<void> {
//проверяем, что обработчик сработал при изменении элемента нужного нам приложения
if (Context.data.__item!.namespace === '_clients' && Context.data.__item!.code === 'discount_card') {
//выполняем поиcк элемента по id, где discount_card - контекстная переменная из настроек модуля
var apcard = await Namespace.params.fields.discount_card.app.search().where(a => a.__id.eq(Context.data.__item!.id)).first();
if (apcard) {
const oldPercent = Context.data.oldItem.percent_discount;//получаем значение переменной percent_discount до изменения
const newPercent = Context.data.item.percent_discount;//получаем значение переменной percent_discount после изменения
//сравниваем percent_discount до и после изменения. Если они не совпадают, значит в данном событии было изменено значение percent_discount
if (oldPercent != newPercent) {
const tip = Context.data.item.tip_skidki[0].name//получаем новое значение переменной Тип скидки типа Категория
const createdBy = Context.data.__createdByName;//получаем автора изменений
//формируем строку с записью истории
const history = Context.data.__createdAt.format("DD.MM.YYYY HH:mm:ss") + " - " + "Пользователь " + createdBy +
" изменил размер скидки по карте. Предыдущее значение: " + oldPercent.toString() + ", новое значение: " + newPercent.toString() + " Новый тип: " + tip + '\n';
//записываем строку с информацией о изменении percent_discount и tip_skidki в переменную discount_history
apcard!.data.discount_history = apcard!.data.discount_history ? apcard!.data.discount_history + history : history;
//сохраняем элемент приложения
await apcard!.save();
}
}
}
}
В Context.data.__item хранится сам элемент приложения, по которому произошло событие, без привязки к значениям полей до и после изменения. Здесь можно обратиться к параметрам:
"namespace": код раздела,
"code": код приложения,
"id": Id элемента приложения, по которому произошло событие
В Context.data.oldItem хранится значение контекста элемента приложения до изменения. Название переменной, значение которой нужно получить, необходимо указывать через точку. Автоподстановка здесь не поддерживается.
В Context.data.item хранится значение контекста элемента приложения после изменения. Название переменной, значение которой нужно получить, необходимо указывать через точку. Автоподстановка здесь не поддерживается.
Результат работы данного обработчика на скриншоте:
На форме просмотра элемента приложения в панели «История изменения размера скидки» размещена переменная discount_history с отключённым параметром «Показывать название на форме».
Небольшой лайфхак.
Для просмотра структуры Context, который формируется в событии, можно отправить HTTP-запрос на сайт https://webhook.site/
Для этого перейдите на сайте https://webhook.site/ , включите параметр «Auto Navigate» и скопируйте значение в строке «Your unique URL»
В коде обработчика события реализуйте следующий код:
Код:
async function action(): Promise<void> {
fetch("https://webhook.site/205c73d1-2036-4e8c-8901-b31ca1a556b1", {
method: "POST",
body: JSON.stringify((<any>Context).json()),
})
}
Где https://webhook.site/205c73d1-2036-4e8c-8901-b31ca1a556b51 – ваше значение unique URL.
Инициализируйте нужное событие, например, изменение элемента приложения. В результате выполнения данного обработчика, вы получите HTTP-запрос на сайте https://webhook.site, где можно будет просмотреть Context в блоке «Raw Content.
После отладки обработчика с помощью https://webhook.site не забудьте снять обработчик с публикации!