Коллеги, доброго времени суток!
Подскажите пожалуйста:
В разделе "Счета" при изменении количества/цен продуктов идет автоматический пересчет "Суммы" счета. Как я понял код, отвечающий за изменение находится в пакете Invoice => схеме объекта InvoiceProduct => подпроцессе SubProcessScriptAmountChange => внутри скрипта ScriptAmountChange, который отрабатывает при получении сообщения события InvoiceProductSaved или InvoiceProductDeleted. Поиск по сообществу показал, что видимо просто так переопределить код внутри скрипта нельзя, если он не вынесен в метод. Чтобы заменить логику его работы нужно создать свой подпроцесс с входами через те же сообщения (но со своими названиями) и в конце вызываемого скрипта перед return вписать
ActivatedEventElements.Remove("InvoiceProductSaved");
ActivatedEventElements.Remove("InvoiceProductDeleted");
что я и сделал, создал подпроцесс по образу и подобию с родительским (два входных сообщения через исключащее "ИЛИ" по безусловной связи идут в скрипт), однако после сохранения, публикации и обновлении стурктуры БД дополнительная логика не отрабатывает, из чего я делаю вывод, что до скрипта почему-то дело не доходит.
У моих входных событий совпадают с родительскими поля "Сообщение" (InvoiceProductSaved и InvoiceProductDeleted), но отличаются "Название" (иначе компилятор предупреждает, что override неправильно делаю, и получается только hide.. ну и всё равно не работает), поле "Условие" в связи от исключащего ИЛИ пустое, судя по "Исходному коду" это как раз то, что нужно, т.к. в этом случае функция всегда возвращает true.
Пытался и напрямую оба события на скрипт завязать - всё равно не работает.
Вопрос соответственно - что я делаю не так?
Нравится
Здравствуйте!
Описанное решение выглядит правильно.
Для перекрытия логики по родительскому сигналу, необходимо в дочернем БП объекта подписаться на аналогичное событие объекта и в скрипте перед 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