Работа с окном wnd_OfferingInOpportunitiesDetailTreeArea в бизнес-процессе
Сразу после создания продажи необходимо вывести окно wnd_OfferingInOpportunitiesDetailTreeArea для ввода и редактирования продуктов в продаже. Как связать это окно с созданной раннее продажей и потом сохранить все введенные в это окно продукты? Смотрите схему в прикрепленных файлах.
Нравится
"Maxim Gritsenko" написал:Добрый день.
В настройках открываемого окна можно задать соответствие и выбрать, какое окно будет открыто.
в этом случае возникает ошибка
Ошибка выполнения Microsoft JScript: 'null' - есть null или не является объектом
в скрипте function ProcessBaseDBEditOnPrepare
файлы прилагаю
"Maxim Gritsenko" написал:Проще было бы вторым шагом создавать связанный продукт и после его сохранения предлагать добавлять последующие:
Я понимаю, что так будет проще лично для меня, как программиста. Но нам нужно в бизнес-процессе несколько раз выводить список продуктов для корректировки, поэтому мы на совещании решили, что удобнее для пользователя, если мы будет выводить окно продукты в продажах, как отдельное окно, с возможностью корректировки списка введенных продуктов.
В связи с этим и появился этот вопрос. Я не думаю, что это так уж сложно сделать, наверняка есть решение проблемы.
Добрый день.
Можно пробовать из скрипта использовать ShowSelectWorkspaceWindow передавая в параметре attributes необходимые для детали атрибуты, список можно посмотреть в RefreshOfferingInOpportunityDetail.
Что бы получить значения параметров БП, воспользуйтесь GetDiagramByItem(DiagramItem) и WFGetParamValue(DiagramItem, ParamName, DefaultValue).
получается примерно такой код
[javascript]
var Attributes = GetNewDictionary();
var oppID = WFGetParamValue(ScriptItem.ParentItems.ParentDiagram, 'OpportunityID');
var ds=Services.GetSingleItemByUSI("ds_Opportunity");
Attributes.Add('AccountFieldName', 'CustomerID');
Attributes.Add('DetailParentTypeFieldName', 'OpportunityTypeID');
Attributes.Add('WorkspaceDataset', ds);
Attributes.Add('DetailUserFieldsUSI', 'uf_OfferingInOpportunity');
Attributes.Add('DateFieldName', 'StartDate');
var SelectWindow = ShowSelectWorkspaceWindow('wnd_OfferingInOpportunitiesDetailTreeArea', NotifyObject, Attributes);
[/javascript]
Но тогда непонятно, в какой атрибут записывать oppID, чтобы окно могло знать какой родительской записи соответствуют данные в окне. И каким должен быть NotifyObject и как его правильно создать?
Андрей, мне кажется лучше будет реализовать задачу таким образом:
1. По идентификатору продажи переходить к записи продажи в раздел.
2. Затем делать активной деталь [Продукты] в продаже.
Т.е. не отдельно вызывать реестр детали, а переходить в раздел и фокусироваться на детали.
Пример кода:
[javascript]
.....
var SelectWindow = ShowSelectWorkspaceWindow('wnd_OpportunitiesWorkspace', Self, Attributes);
var wndDataWindow = SelectWindow.ComponentsByName('wndData').Window;
var pcDetailsControl = wndDataWindow.ComponentsByName('pcDetails');
var pgOfferingsDetailControl = wndDataWindow.ComponentsByName('pgOfferingsDetail');
if (pcDetailsControl.Size == 0) {
pcDetailsControl.Size = 250;
if (pcDetailsControl.ActivePage == pgOfferingsDetailControl) {
pcDetailsControl.ActivePage = pcDetailsControl.Items(0);
}
}
pcDetailsControl.ActivePage = pgOfferingsDetailControl;
[/javascript]
На самом деле вывести окно продуктов после карточки редактирования достаточно просто. Нужно всего 10 строк кода. Пример для счета
[javascript]
var InvoiceID = WFGetParamValue(ScriptItem.ParentItems.ParentDiagram, 'InvoiceID');
var OfferingInInvoiceGridArea = GetSingleItemByCode('wnd_OfferingsDetailTreeArea', Connector.GenGUID());
OfferingInInvoiceGridArea.Attributes('ParentItemFieldName') = 'InvoiceID';
OfferingInInvoiceGridArea.Attributes('DatasetUSI') = 'ds_OfferingInInvoice';
OfferingInInvoiceGridArea.Prepare();
OfferingInInvoiceGridArea.Attributes('ParentItemID') = InvoiceID;
var Dataset = OfferingInInvoiceGridArea.ComponentsByName('dlData').Dataset;
ApplyDatasetFilter(Dataset, 'InvoiceID', InvoiceID, true);
Dataset.Open();
OfferingInInvoiceGridArea.Show();
[/javascript]
Только почему-то за месяц на этот простейший вопрос никто так и не ответил...
Теперь возникает следующий вопрос: как в рамках бизнес-процесса проверить введен ли хоть один продукт в окно продуктов, если нет, то показать сообщение об этом и вернуться к окну с продуктами. Сервисы процесса прилагаю...
"Бондарь Наталия" написал:Андрей, мне кажется лучше будет реализовать задачу таким образом:
1. По идентификатору продажи переходить к записи продажи в раздел.
2. Затем делать активной деталь [Продукты] в продаже.
Если бы это было последним шагом бизнес-процесса, то можно было бы так сделать. Но если после заполнения продуктов в продаже бизнес-процесс продолжится? Как узнать, что пользователь уже закончил вводить продукты и необходимо продолжить бизнес-процесс? С окном все намного понятнее. Закрыл окно - значит процесс продолжается.
"Рябенко Андрей" написал:Теперь возникает следующий вопрос: как в рамках бизнес-процесса проверить введен ли хоть один продукт в окно продуктов, если нет, то показать сообщение об этом и вернуться к окну с продуктами.
Добавьте элемент скрипт, в котором изначально получите количество продуктов в счете:
[javascript]
var InvoiceID = WFGetParamValue(Diagram, 'InvoiceID');
var Dataset = Services.GetNewItemByUSI('ds_OfferingInInvoice');
ApplyDatasetFilter(Dataset, 'InvoiceID', InvoiceID, true);
Dataset.Open();
var RecordsCount = Dataset.RecordsCount;
[/javascript]
Затем в зависимости от количества управляйте показом окна и выводом информационного сообщения.