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

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

Нравится

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

Добрый день.

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

"Maxim Gritsenko" написал:

Добрый день.

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

в этом случае возникает ошибка

Ошибка выполнения Microsoft JScript: 'null' - есть null или не является объектом
в скрипте function ProcessBaseDBEditOnPrepare

файлы прилагаю

Проще было бы вторым шагом создавать связанный продукт и после его сохранения предлагать добавлять последующие:

"Maxim Gritsenko" написал:

Проще было бы вторым шагом создавать связанный продукт и после его сохранения предлагать добавлять последующие:

Я понимаю, что так будет проще лично для меня, как программиста. Но нам нужно в бизнес-процессе несколько раз выводить список продуктов для корректировки, поэтому мы на совещании решили, что удобнее для пользователя, если мы будет выводить окно продукты в продажах, как отдельное окно, с возможностью корректировки списка введенных продуктов.
В связи с этим и появился этот вопрос. Я не думаю, что это так уж сложно сделать, наверняка есть решение проблемы.

Добрый день.

Можно пробовать из скрипта использовать ShowSelectWorkspaceWindow передавая в параметре attributes необходимые для детали атрибуты, список можно посмотреть в RefreshOfferingInOpportunityDetail.
Что бы получить значения параметров БП, воспользуйтесь GetDiagramByItem(DiagramItem) и WFGetParamValue(DiagramItem, ParamName, DefaultValue).

получается примерно такой код

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);

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

Андрей, мне кажется лучше будет реализовать задачу таким образом:
1. По идентификатору продажи переходить к записи продажи в раздел.
2. Затем делать активной деталь [Продукты] в продаже.

Т.е. не отдельно вызывать реестр детали, а переходить в раздел и фокусироваться на детали.

Пример кода:

.....
            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;

На самом деле вывести окно продуктов после карточки редактирования достаточно просто. Нужно всего 10 строк кода. Пример для счета

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();

Только почему-то за месяц на этот простейший вопрос никто так и не ответил...

Теперь возникает следующий вопрос: как в рамках бизнес-процесса проверить введен ли хоть один продукт в окно продуктов, если нет, то показать сообщение об этом и вернуться к окну с продуктами. Сервисы процесса прилагаю...

"Бондарь Наталия" написал:

Андрей, мне кажется лучше будет реализовать задачу таким образом:

1. По идентификатору продажи переходить к записи продажи в раздел.

2. Затем делать активной деталь [Продукты] в продаже.

Если бы это было последним шагом бизнес-процесса, то можно было бы так сделать. Но если после заполнения продуктов в продаже бизнес-процесс продолжится? Как узнать, что пользователь уже закончил вводить продукты и необходимо продолжить бизнес-процесс? С окном все намного понятнее. Закрыл окно - значит процесс продолжается.

"Рябенко Андрей" написал:Теперь возникает следующий вопрос: как в рамках бизнес-процесса проверить введен ли хоть один продукт в окно продуктов, если нет, то показать сообщение об этом и вернуться к окну с продуктами.

Добавьте элемент скрипт, в котором изначально получите количество продуктов в счете:

var InvoiceID = WFGetParamValue(Diagram, 'InvoiceID'); 
    var Dataset = Services.GetNewItemByUSI('ds_OfferingInInvoice'); 
    ApplyDatasetFilter(Dataset, 'InvoiceID', InvoiceID, true);
    Dataset.Open();      
    var RecordsCount = Dataset.RecordsCount;

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

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