Проблема использования окна "Закрыть складской документ" ([Склады]) из действия процесса "Открытие окна"
Реализую бизнес-процесс, одним из шагов которого является закрытие складского документа. Для вызова карточки использую действие процесса "Открытие окна".
Изначально проблем с открытием окна не было, и оно сразу же отобразилось из процесса.
Первая проблема, с которой я столкнулся - это необходимость передачи атрибутов в окно. Чтобы установить, какие именно атрибуты, мне пришлось изучить скрипты раздела "Склад" и карточки "Закрыть складской документ".
Как только я определил необходимый перечень атрибутов, окно заработало именно так как мне хотелось (вопросы только по атрибуту NotifyObject).
Однако далее я столкнулся с проблемой, которую считаю фатальной, т.к. она напрочь исключает возможность использования карточки "Закрыть складской документ" в любом процессе.
Проблема была обнаружена при выполнении обработчика события btnOKOnClick ранее упомянутого окна.
Обработчик имеет следующее содержимое:
if ((chbIsConduct.IsChecked) &&
(IsEmptyValue(edtOfferingMovementStatus.Value))) {
ShowWarningDialog("Выберите состояние складского документа");
return;
}
var Values = new Object();
Values.IsRecalcPrimeCost = chbIsRecalcPrimeCost.IsChecked;
Values.IsConduct = chbIsConduct.IsChecked;
Values.IsRecalcOfferingPrices = chbIsRecalcOfferingPrices.IsChecked;
Values.OfferingMovementStatus = edtOfferingMovementStatus.Value;
if (chbIsUpdateShipmentState.IsEnabled) {
Values.IsUpdateShipmentState = chbIsUpdateShipmentState.IsChecked;
}
if (chbIsUpdatePurchaseState.IsEnabled) {
Values.IsUpdatePurchaseState =
chbIsUpdatePurchaseState.IsChecked;
}
if (chbIsReserveOfferingsFromOrders.IsEnabled) {
Values.IsReserveOfferingsFromOrders =
chbIsReserveOfferingsFromOrders.IsChecked;
}
if (chbIsAddSupplierInOffering.IsEnabled) {
Values.IsAddSupplierInOffering =
chbIsAddSupplierInOffering.IsChecked;
}
SendNotify(Self, MSG_OK, Values);
Self.Close();
}
Обратите внимание на строчку
Эта строчка запускает на выполнение метод следующего содержания.
var NotifyObject = Window.Attributes('NotifyObject');
if (NotifyObject) {
NotifyObject.Notify(Window, NotifyMessage, NotifyData);
}
var NotifyObjectList = Window.Attributes('NotifyObjectList');
if (!NotifyObjectList) {
return;
}
for (var i = 0; i NotifyObjectList.length; i++) {
var NotifyObjectListItem = NotifyObjectList[i];
if (NotifyObjectListItem) {
NotifyObjectListItem.Notify(Window, NotifyMessage, NotifyData);
}
}
}
Теперь внимательно посмотрим на строчку
Оказывается, что при обработке события клика кнопки из процесса, в качестве NotifyObject будет указан объект окна "wnd_OpenWindowEdit", а не "wnd_OfferingMovementGridArea".
Замечу, что проблемы бы не было, если логику, выполняемую в OnNotify, вынести в метод окна "wnd_OfferingMovementClose".
Вопрос заключается в том, можно ли при настройке действия процесса передать в качестве атрибута вызываемого окна объект?
Если нет, то каким вы видите решение данной проблемы?
Нравится
Здравствуйте Геннадий,
В таком случае я предлагаю, в саму карточку, которую вы вызываете в БП дописать проверку
if (Assigned(Self.Attributes('NotifyObject'))) { SendNotify(Self, MSG_OK, Values); }
Пример Вы можете посмотреть тут
Т.е если атрибут 'NotifyObject' не определен, то мы не вызовем SendNotify, а в БП у нас будет именно такая ситуация
Можно ли, каким-то образом, это сделать не внося изменения в ваши скрипты?
Геннадий, в атрибуты можно записывать объекты. В случае с действием Открытие окна, сообщения (Notify) от окон передаются окну действия (wnd_OpenWindowEdit).
Для того что бы передавать объекты в параметры в через "Открытие окна" необходимо доработать само действие. На данный момент предлагаю Вам воспользоваться обходным решением предоставленным мной выше.