Открытие нескольких окон сразу

Добрый день!
Сейчас разрабатываю БП, в котором после того, как продажа доходит до определенной стадии, по ней создается проект (и открывается его окно), а в случае, если у продажи тип "Комплексная", то пользователю задается вопрос о количестве проектов и должно создаться столько проектов, сколько назвал пользователь.
Вот до вопроса я дошла... А как создать несколько проектов, кроме как по очереди открывать окна...
То есть, я конечно могу проанализировать выбранное пользователем число проектов (от 2 до 5) и в зависимости от выбранного числа понатыкать в БП действий "открытие окна"... Но это же 14 действий на поле выносить, а БП и так немаленький... Может быть, есть обходной путь?

Нравится

20 комментариев

Здравствуйте Алёна
Предлагаю вам в элементе Скрипт после того как Вы получили число нужных проектов, открывать окна в цикле в том количестве в котором необходимо.

Алексей, спасибо! Уточняющий вопрос: как именно открыть окно через скрипт?

Здравствуйте, Алена!

Открыть окно из скрипта можно вызовом функции ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues);

Пример вызова можно посмотреть, например, в обработчике действия "Создать продажу" в рабочей области Контрагент:

function CreateOpportunity() {
	var EditWindowUSI = 'wnd_OpportunityEdit';
	var Attributes = GetNewDictionary();
	Attributes.Add('NotifyObject', Self);//AccountsWorkspace.OpportunityWindow);         
	var AccountID = BaseWorkspace.GridDataset.ValAsGUID('ID');
	var PrimaryContactID = GetPrimaryContactID(AccountID);
	var CurrentDate = new Date(System.Now());
	Attributes.Add('RecordID', GUID_NULL);		
	var DefaultValues = GetNewDictionary();	
	DefaultValues.Add('CustomerID', AccountID);	
	DefaultValues.Add('ContactID', PrimaryContactID);
	DefaultValues.Add('OwnerID', Connector.CurrentUser.ContactID);	
	DefaultValues.Add('StartDate', CurrentDate.getVarDate());	
	DefaultValues.Add('ActualCloseDate', CurrentDate.getVarDate());	
	DefaultValues.Add('EstimatedStartDate', CurrentDate.getVarDate());	
	DefaultValues.Add('EstimatedCloseDate', CurrentDate.getVarDate());	
	ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues);	
}

Ой, а я думала для БП как-то по-другому делается, не как из карточки :) Спасибо!

Такой вариант ни к чему не привел, поскольку ТС падает с ошибкой при открытие 2-х и более окон в коде из БП. Какая-то проблема с определением родителя. Пошла в обход.

И вот тут возникла проблема.
Там где я считываю результат из ответа пользователя - кладу его в параметр диаграммы.
А уже на следующем шаге этот параметр почему-то обнуляется.
параметры заведены как параметры диаграммы, без привязки к элементам.

Здравствуйте Алёна,

попробуйте между "Вопросом к пользователю" и "Открытием окна" добавить элемент "Скрипт".
В нем на событии OnExecute записать выбранный пользователем вариант в параметры диаграммы. На событии же OnBeforeExecute для "Открытие окна" считать данный параметр:

function Item3OnExecute(ScriptItem, IsComplete) {
    var ParentDiagram = GetDiagramByItem(ScriptItem);
    WFSetParamValue(ParentDiagram, 'WindowShowCount', 2); 
}
 
function Action2OnBeforeExecute(ActionItem) { 	
 
    var ParentDiagram = GetDiagramByItem(ActionItem);
    var cnt = WFGetParamValue(ParentDiagram, 'WindowShowCount');
    MessageBox(cnt);
}

Дмитрий, а как я могу из скрипта обратиться к результатам предыдущего элемента диаграммы (Вопрос пользователю)? Дело в том. что от ответа зависит количество открываемых далее окон.

Этот вопрос снят, доступ к переменной получила... Теперь другой вопрос - первое окно открывается нормально, а вот второй раз открывает на редактирование предыдущее. хотя в парамертрах элемента указано "создать новую запись"...
Подозреваю, что дело в том, что поле "Если необходимо, укажите параметр, содержащий ID записи" заполняется против моей воли :) Несколько раз убирала оттуда параметр, но он все равно заполняется параметром ProjectID
Еще меня удивляет, что не останавливается отладчик на debugger, который я прописала на OnDecision....

UPD зря грешила на параметр. В праметрах диаграммы убрала у ProjectID элемент "Открытие окна". Картина та же - при повторном открытии не создает новую запись, а изменяет предыдущую. Что делать?

Здравствуйте Алена,

можете предоставить ваш код вызова окон проекта?
Также если вы возможно используете функцию GetSingleItemByCode попробуйте заменить ее на Services.GetNewItemByUSI.

Дмитрий, прошу прощения. видимо, я не совсем понимаю, о чем речь...
Окна вызываются стандартным элементом БП "Открытие окна".
Во вложении сервисы БП.

Здравствуйте Алёна!

Предлагаю Вам на шаге "Открытия окна проэкта" в цикле, используя параметр диаграммы count, открыть нужное количество окон, вызывая функцию ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues).

Дмитрий, этот вариант был реализован, но возникла проблема (что-то с NotifyObject, насколько я поняла - окно рожденное из кода БП неправильно определяет родителя и выдает разрушительный сбой) и в ходе удаленного подключения специалистами техподдержки был предложен такой вариант реализации - средствами БП.

Был предложен еще вариант: "Отлавливать все моменты обращений к NotifyObject и добавлять на них проверки (если обращение из wnd_ProjectEdit, тогда не отправлять)." Но после отключения специалиста была выявлена другая ошибка: окна открытые в рамках БП открывались, а вот при открытии из реестра падали с ошибкой. Поэтому было принято решение реализации методами БП.

Алена, можете выложить ваш вариант wnd_ProjectEdit

Файлы во вложении

Алёна,
занимаюсь Вашим вопросом. Как только будет решение обязательно здесь сообщу.

Алена, для того что бы реализовать данный цикл необходимо:
1) В скрипте wnd_ProjectEditScript в function btnOKOnClick(Control)
поставить проверку на то что присвоен ли объект NotifyObject
...
if (ActionsObject.ParentActualDatesNeedToBeUpdated) {
SetParentProjectElementsActualDates(Dataset.Values('ID'),
Dataset.Values('ActualStartDate'), Dataset.Values('ActualDueDate'));
}
if (Assigned(Self.Attributes('NotifyObject'))) {
if (ActionsObject.ElementInMemoryNeedToBeUpdated) {
SendMessageToParentWindows(Self, 'MSG_EDIT_ELEMENT_IN_COLLECTION', Dataset);
}
if (ActionsObject.ManhourDetailButtonsNeedToBeUpdated) {
SendMessageToParentWindows(Self, 'MSG_UPDATE_MANHOUR_DETAIL_BUTTONS', Dataset);
}
}
Self.IsVisible = false;
...

2) После этого в самом БП мы можем написать так:

	var Attributes = new ActiveXObject('Scripting.Dictionary');
	Attributes.Add('RecordID', GUID_NULL);
	var DefaultValues = GetNewDictionary();
	DefaultValues('EssenceType') = petProject;
	DefaultValues('CalendarID') = GetBaseCalendarID();
 
	for (var i =0; i<3;i++) {
		ShowEditWindowEx('wnd_ProjectEdit', Attributes, DefaultValues);
	}
 
	IsComplete.Value = true;

Предварительно подключив enm_ProjectEssenceType и scr_CalendarUtils.
Пример БП во вложении

Алексей, спасибо большое! Полноценного тестирования не проводила, но на первый взгляд - работает! Ура!

Алексей, после дальнейшего тестирования выяснилось, что если БП идет по другой ветке и там попадается стандартное Открытие окна проекта через элемент БП, там происходит свал в функции btnOKClick на строчке SetParentProjectElementsActualDates:

		if (ActionsObject.ParentActualDatesNeedToBeUpdated) {
			SetParentProjectElementsActualDates(Dataset.Values('ID'), 
				Dataset.Values('ActualStartDate'), Dataset.Values('ActualDueDate'));
		}

Ошибка:
"Dataset is not open"

Здравствуйте Алёна!

На чистой базе проделали все необходимые действия, которые описывал выше Алексей, и, к сожалению, не смогли восстановить указанную Вами ошибку. (открытие окна проекта из БП выполняется без ошибок).

(скрипт wnd_ProjectEditScript и сервисы БП в приложении).

Забыла отписаться сразу, проблема была решена добавлением блока try catch.

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