Бизнес-процессы
Разработка

Работа с окном wnd_OfferingInOpportunitiesDetailTreeArea в бизнес-процессе

Сразу после создания продажи необходимо вывести окно wnd_OfferingInOpportunitiesDetailTreeArea для ввода и редактирования продуктов в продаже. Как связать это окно с созданной раннее продажей и потом сохранить все введенные в это окно продукты? Смотрите схему в прикрепленных файлах.

Нравится

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

Добрый день.

В настройках открываемого окна можно задать соответствие и выбрать, какое окно будет открыто.

"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]

Затем в зависимости от количества управляйте показом окна и выводом информационного сообщения.

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