Проблема использования окна "Закрыть складской документ" ([Склады]) из действия процесса "Открытие окна"

Реализую бизнес-процесс, одним из шагов которого является закрытие складского документа. Для вызова карточки использую действие процесса "Открытие окна".
Изначально проблем с открытием окна не было, и оно сразу же отобразилось из процесса.
Первая проблема, с которой я столкнулся - это необходимость передачи атрибутов в окно. Чтобы установить, какие именно атрибуты, мне пришлось изучить скрипты раздела "Склад" и карточки "Закрыть складской документ".
Как только я определил необходимый перечень атрибутов, окно заработало именно так как мне хотелось (вопросы только по атрибуту NotifyObject).
Однако далее я столкнулся с проблемой, которую считаю фатальной, т.к. она напрочь исключает возможность использования карточки "Закрыть складской документ" в любом процессе.
Проблема была обнаружена при выполнении обработчика события btnOKOnClick ранее упомянутого окна.
Обработчик имеет следующее содержимое:

function btnOKOnClick(Control) {
        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();
}

Обратите внимание на строчку

SendNotify(Self, MSG_OK, Values);

Эта строчка запускает на выполнение метод следующего содержания.
function SendNotify(Window, NotifyMessage, NotifyData) {
        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);
                }
        }
}

Теперь внимательно посмотрим на строчку
var NotifyObject = Window.Attributes('NotifyObject');

Оказывается, что при обработке события клика кнопки из процесса, в качестве NotifyObject будет указан объект окна "wnd_OpenWindowEdit", а не "wnd_OfferingMovementGridArea".

Замечу, что проблемы бы не было, если логику, выполняемую в OnNotify, вынести в метод окна "wnd_OfferingMovementClose".

Вопрос заключается в том, можно ли при настройке действия процесса передать в качестве атрибута вызываемого окна объект?

Если нет, то каким вы видите решение данной проблемы?

Нравится

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

Здравствуйте Геннадий,
В таком случае я предлагаю, в саму карточку, которую вы вызываете в БП дописать проверку

if (Assigned(Self.Attributes('NotifyObject'))) {
SendNotify(Self, MSG_OK, Values);
}

Пример Вы можете посмотреть тут
Т.е если атрибут 'NotifyObject' не определен, то мы не вызовем SendNotify, а в БП у нас будет именно такая ситуация

Можно ли, каким-то образом, это сделать не внося изменения в ваши скрипты?

Геннадий, в атрибуты можно записывать объекты. В случае с действием Открытие окна, сообщения (Notify) от окон передаются окну действия (wnd_OpenWindowEdit).
Для того что бы передавать объекты в параметры в через "Открытие окна" необходимо доработать само действие. На данный момент предлагаю Вам воспользоваться обходным решением предоставленным мной выше.

Спасибо, Алексей!

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