Добрый день!
Сейчас разрабатываю БП, в котором после того, как продажа доходит до определенной стадии, по ней создается проект (и открывается его окно), а в случае, если у продажи тип "Комплексная", то пользователю задается вопрос о количестве проектов и должно создаться столько проектов, сколько назвал пользователь.
Вот до вопроса я дошла... А как создать несколько проектов, кроме как по очереди открывать окна...
То есть, я конечно могу проанализировать выбранное пользователем число проектов (от 2 до 5) и в зависимости от выбранного числа понатыкать в БП действий "открытие окна"... Но это же 14 действий на поле выносить, а БП и так немаленький... Может быть, есть обходной путь?
Нравится
Здравствуйте Алёна
Предлагаю вам в элементе Скрипт после того как Вы получили число нужных проектов, открывать окна в цикле в том количестве в котором необходимо.
Алексей, спасибо! Уточняющий вопрос: как именно открыть окно через скрипт?
Здравствуйте, Алена!
Открыть окно из скрипта можно вызовом функции 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, тогда не отправлять)." Но после отключения специалиста была выявлена другая ошибка: окна открытые в рамках БП открывались, а вот при открытии из реестра падали с ошибкой. Поэтому было принято решение реализации методами БП.
Алёна,
занимаюсь Вашим вопросом. Как только будет решение обязательно здесь сообщу.
Алена, для того что бы реализовать данный цикл необходимо:
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.