В решении CRM, над которым я работаю, есть случай, когда пользователю необходимо показать предупреждающее сообщение на основе результатов выполнения плагина после отправки определенной формы. Операция все равно должна завершиться успешно, поэтому создание исключения из плагина не является хорошим решением.
Из поиска вокруг, похоже, нет прямого способа сделать это.
Является ли единственным вариантом сохранить содержимое предупреждающего сообщения в настраиваемое поле некоторого объекта и использовать функцию javascript в форме, чтобы определить, когда отображать его пользователю?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Реализуйте пользовательское действие рабочего процесса с бизнес-логикой, которую в настоящее время выполняет ваш плагин.
Создайте и активируйте действие, которое использует это действие рабочего процесса.
Закодируйте функцию JS, связанную с событием OnSave формы, которая вызывает это действие, выполняя Запрос WebApi. Наконец, после обработки действия вы можете вызвать стандартный клиентский API setFormNotification, чтобы создать собственное предупреждающее сообщение в верхней части формы.
Вы получите красивое пользовательское сообщение, подобное этому:
Вместо отображения уведомления (setFormNotification) вы можете использовать диалоговое окно подтверждения и остановить или продолжить сохранение записи в соответствии с нажатой кнопкой
Да прямого пути нет.
Вы можете иметь фиктивное поле в той же записи объекта, установить/обновить значение этого поля из плагина в соответствии с вашими потребностями в предупреждающем сообщении, и onChange этого поля будет запущено в пользовательском интерфейсе при успешном выполнении плагина.
Вы можете отобразить сообщение пользователю из этого обработчика onChange. Подробнее
Документация говорит:
Field OnChange event
This event also occurs when data changes on the server are retrieved to update a field when the form is refreshed, such as after a record is saved.
Таким образом, вы можете успешно выполнить плагин без выбрасывания InvalidPluginExecutionException, можете избежать пользовательских объектов, пользовательских действий и т. д.
Хотя это более быстрое решение и выполняет свою работу, я с ним не согласен. Создание полей для решения подобных проблем легко приводит к раздуванию объектов с большим количеством полей, чем должно представлять их домены.
@AndréCavaca да, это минимальный побочный эффект... но это проще, чем изменение дизайна...
Вы добавите поле для удовлетворения бизнес-требований. В этом нет ничего раздутого.
Ну, вы можете использовать Действия.
Создать действие с выходным параметром. Зарегистрируйте свой плагин в Custom Message(Action). Вызовите действие с помощью JavaScript в событии сохранения формы. Вы получите вывод действия в JavaScript, то же самое можно показать в форме.
Мы знаем, что можем показать уведомление с помощью JavaScript, и мы вызываем действие, которое запустит плагин, зарегистрированный в пользовательском сообщении, и вы получите вывод в переменной Javascript, которую вы можете показать, используя только Javascript.
Перейдите по этой ссылке для работы с действиями. https://www.magnetismsolutions.com/blog/dominicjarvis/2017/09/18/how-to-trigger-plugins-on-custom-messages-using-actions-in-dynamics-365
Спасибо за ответ. Я не уверен, будет ли практично использовать это для нас, так как это потребует переработки большого количества устоявшейся логики только для обработки незначительного пограничного случая. Я думаю, что мы могли бы просто попытаться найти другой подход для удовлетворения требований пользователя, не полагаясь на то, что эта форма возвращает предупреждающее сообщение. Хотя, возможно, это будет полезно кому-то еще.