Работа с окном wnd_OfferingInOpportunitiesDetailTreeArea в бизнес-процессе
Сразу после создания продажи необходимо вывести окно wnd_OfferingInOpportunitiesDetailTreeArea для ввода и редактирования продуктов в продаже. Как связать это окно с созданной раннее продажей и потом сохранить все введенные в это окно продукты? Смотрите схему в прикрепленных файлах.
Нравится
"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;
Затем в зависимости от количества управляйте показом окна и выводом информационного сообщения.