Передача сообщения окну

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

Нравится

14 комментариев
function SendNotify(Window, NotifyMessage, NotifyData)

где
Window - объект окна-получателя
NotifyMessage - код сообщения (см. раздел // Notify Message consts скрипта scr_Consts)
NotifyData - произвольное что-то (обычно строка(т.е. значение), не знаю можно ли объекты и переменные передавать)

Что-то типа того:

Вам нужно передать в аттрибутах окна редактирования адреса (мб сначала в грид, а потом в карточку) ссылку на окно-получатель:

function edtTerritoryOnPrepareSelectWindow(LookupDataControl, SelectWindow) {
	SetAttribute(SelectWindow, 'AccountEditWindow', Self)
}

Потом добавить в карточке редактирования, где Вы меняете нужное вам значение, на btnOkOnClick добавить

var AccountEditWindow = GetAttribute(Self, 'AccountEditWindow');
if (Assigned(AccountEditWindow )) {
	SendNotify(AccountEditWindow, MSG_OK, dlData.Dataset(Интересующее_Вас_поле))
}

И наконец, в wnd_AccountEdit на событие wnd_AccountEditOnNotify добавить:

if ((Message == MSG_OK) && !IsEmptyGUID(Data) &&
		(ExtractUSICodeEx(Sender.USI) == 'USI_вашего_окна')) {
	dlData.Dataset('Address') = Data;
}

Дмитрий, большое спасибо. Буду пробовать.

Попробовал использовать данный метод, на строке

 SendNotify(AccountEditWindow, MSG_OK, dlData.Dataset('ID'))

вылезает ошибка:
Объект не поддерживает это свойство или метод.
В функцию SendNotify даже не заходит. Подскажите, в чем может быть причина?

А скрипт scr_WindowUtils подключен из того скрипта, в котором ошибка?

подключите scr_WindowUtils :lol:

Скрипт подключен, проверил первый делом.

dlData.Dataset.Values('ID')
dlData.Dataset.ValAsGUID('ID')

Спасибо, теперь отрабатывает, но в окно контрагента (AccountEditWindow) сообщение не приходит, поставил там debugger, и ничего не наблюдается. Куда можно посмотреть?

после

var AccountEditWindow = GetAttribute(Self, 'AccountEditWindow');

и проверьте что там действительно нужное Вам окно. (оно же у Вас при этом открыто?)

также проверьте код в wnd_AccountEditOnNotify

В AccountEditWindow хранится окно "Accounts\General\Main Grid\wnd_AccountEdit".
Код на OnNotify

function wnd_AccountEditOnNotify(ScriptableService, Sender, Message, Data) {
	debugger;
	if ((Message == MSG_OK) && !IsEmptyGUID(Data) &&
                (ExtractUSICodeEx(Sender.USI) == 'wnd_ContactEdit')) {
        //dlData.Dataset('Address') = Data;
	}
}

Код на btnOnClick

var AccountEditWindow = GetAttribute(Self, 'AccountEditWindow');
if (Assigned(AccountEditWindow )) {
	SendNotify(AccountEditWindow, MSG_OK, ContactEdit.OldAccountID);
}

а само событие для окна определили? (в сервисе окна, в свойствах корневого объекта)
если да пришлите лучше сервисы - быстрее будет

services.zip
Сервисы прикрепил

я Вас изначально дезинформировал относительно функции SendNotify :confused:

	if (Assigned(AccountEditWindow )) {
	    AccountEditWindow.Notify(Self, MSG_OK, ContactEdit.OldAccountID);
	}

Дмитрий, спасибо большое. Получилось.

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