Коллеги, доброго времени суток!

Подскажите пожалуйста:

В разделе "Счета" при изменении количества/цен продуктов идет автоматический пересчет "Суммы" счета. Как я понял код, отвечающий за изменение находится в пакете Invoice => схеме объекта InvoiceProduct => подпроцессе SubProcessScriptAmountChange => внутри скрипта ScriptAmountChange, который отрабатывает при получении сообщения события InvoiceProductSaved или InvoiceProductDeleted. Поиск по сообществу показал, что видимо просто так переопределить код внутри скрипта нельзя, если он не вынесен в метод. Чтобы заменить логику его работы нужно создать свой подпроцесс с входами через те же сообщения (но со своими названиями) и в конце вызываемого скрипта перед return вписать

ActivatedEventElements.Remove("InvoiceProductSaved");

ActivatedEventElements.Remove("InvoiceProductDeleted");

что я и сделал, создал подпроцесс по образу и подобию с родительским (два входных сообщения через исключащее "ИЛИ" по безусловной связи идут в скрипт), однако после сохранения, публикации и обновлении стурктуры БД дополнительная логика не отрабатывает, из чего я делаю вывод, что до скрипта почему-то дело не доходит.

У моих входных событий совпадают с родительскими поля "Сообщение" (InvoiceProductSaved и InvoiceProductDeleted), но отличаются "Название" (иначе компилятор предупреждает, что override неправильно делаю, и получается только hide.. ну и всё равно не работает), поле "Условие" в связи от исключащего ИЛИ пустое, судя по "Исходному коду" это как раз то, что нужно, т.к. в этом случае функция всегда возвращает true.

Пытался и напрямую оба события на скрипт завязать - всё равно не работает.

Вопрос соответственно - что я делаю не так?

Нравится

4 комментария

Здравствуйте!

Описанное решение выглядит правильно. 

Для перекрытия логики по родительскому сигналу, необходимо в дочернем БП объекта подписаться на аналогичное событие объекта и в скрипте перед return true  вставить:

if (ActivatedEventElements.Contains("InvoiceProductSaved")) {

    ActivatedEventElements.Remove("InvoiceProductSaved")

}

Проверьте, что БП в дочернем объекте помещен в "Событийный подпроцесс".

Так же, вы хотите удалить сразу два сигнала. Поэтому, советую выполнять проверку какой сигнал пришел и удалять его( как в примере выше).

Спасибо!

Попробовал в другом объекте (OrderProduct) проверить. Создал в процессе замещающего объекта событийный подпроцесс, в него поместил одно начальное событие (сообщение OrderProductSaved) из него прямой переход на скрипт, в котором три строчки:

global::Common.Logging.ILog _Logger = global::Common.Logging.LogManager.GetLogger("Client");

_Logger.Info("Order product saved event test");

return true;

Одновременно в переопределенный метод RecalculateOrderAmount вписываю в начале:

global::Common.Logging.ILog _Logger = global::Common.Logging.LogManager.GetLogger("Client");

_Logger.Info("Order product saved event test 2, "+GetPropertiesData());

Метод вызывается только в родительском процессе по цепочке от сообщений OrderProductSaved или OrderProductDeleted.

В итоге когда модифицирую произвольный продукт заказа, из метода в лог информация пишется, из скрипта в подпроцессе - нет. При этом на момент логирования из метода элемент события в подпроцессе даже присутствует в массиве ActivatedEventElements, но почему-то так никогда и не запускается.

Что может быть не так или может быть есть какая-то статья или инструкция для чайников как правильно создавать дополнительные обработчики стандартных событий в процессах замещающих объектов?

Коллеги, подскажите пожалуйста, как правильно создавать подпроцессы в замещающих схемах, потому что теряюсь в догадках, почему вроде бы простой механизм не работает.

Добрый день!

Проверила ваш кейс у себя, всё получилось.

Вот как я делала:

Событийный подпроцесс - http://prntscr.com/jhpu81

Задание-сценарий - http://prntscr.com/jhpuoz

Добавила продукты в счете - http://prntscr.com/jhpuz6

Сумма не считается - http://prntscr.com/jhpv9a

Показать все комментарии