Как открыть деталь в БП?

Создаю карточку счета в БП. Затем мне надо открыть деталь продукты в счете как отдельное окно. Для этого использую следующий скрипт:

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

Вся проблема в том что окно модальное, иначе БП перейдет к следующему шагу, не дождавшись закрытия окна. Как сделать, чтобы это окно открывалось наподобие карточки счета не модально и учитывалось как шаг БП? Только, пожалуйста, не предлагайте мне ставить курсор на деталь в реестре счетов и не спрашивайте почему я не хочу так делать.

Нравится

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

тут важно, какая у вас версия. Например в 3.4 есть такое действие "Открытие окна", которое просто и понятно позволяет сделать то, что вам нужно

А куда я запишу все те действия которые происходят в скрипте? В карточке ведь можно настроить только ограниченные вещи?

"Рябенко Андрей" написал:А куда я запишу все те действия которые происходят в скрипте?

не вижу в приведенном коде каких-то "действий", если у вас там еще что-то происходит, то опять же смотря что :smile: Возможно это что-то можно сделать после открытия окна (если эти действия не касаются открываемого грида)

А какой пункт выбрать: Карточка редактирования или другое окно? Если другое окно, то как настроить фильтрацию? Если карточку редактирования то окно может закрыться только по кнопке ОК, а там этой кнопки нет

"Рябенко Андрей" написал:как настроить фильтрацию

в данном случае (OfferingInInvoiceGridArea) надо вот это

ApplyDatasetFilter(Dataset, 'InvoiceID', InvoiceID, true);
        Dataset.Open();

перенести в OfferingInInvoiceGridArea.
А атрибуты можно передавать из параметров на второй вкладке настройки действия

Вы можете подробнее расписать как и куда перенести, и более конкретно, я не совсем понял?

"Рябенко Андрей" написал:Вы можете подробнее расписать как и куда перенести, и более конкретно

могу но попозже :smile:

Хорошо, буду ждать, для меня это очень важный вопрос. С параметрами я понял, для меня непонятна фильтрация

в wnd_OfferingInInvoiceGridAreaScript в функцию Initialize() добавьте

var ParentItemFieldName = GetAttribute(Window, 'ParentItemFieldName');
var ParentItemID = GetAttribute(Window, 'ParentItemID');
 
if (!IsEmptyValue(ParentItemFieldName) && !IsEmptyGUID(ParentItemID)) {
ApplyDatasetFilter(Dataset, ParentItemFieldName, ParentItemID, true);
}

Соответственно, атрибуты ParentItemFieldName и ParentItemID надо передать из БП вместе с остальными атрибутами окна

Насколько я понял при таком раскладе Dataset останется закрытым, поэтому вопрос: где его открыть и закрыть, чтобы все прошло корректно?

Он откроется ниже в BaseGridArea
если мало ли нет - добавьте туда же Dataset.Open()

А закрывать в каком месте?

Сделал все как описано, но при этом БП не переходит на следующий элемент. Окно платежных реквизитов закрыл, а в элементах Платежные реквизиты стоят в состоянии "ОЖИДАНИЕ". В чем может быть проблема? Это глюк?

Андрей, вложите, пожалуйста, сервисы БП для тестирования.

У нас конфигурация сильно изменена, поэтому мой БП у вас скорее всего не будет работать. Дело не в моем БП. Возмите версию 3.4 и посмотрите модуль wa_OpenWindowScript. После нажатия на ОК в этом модуле просходит нотификация элемента БП и проставляется признак завершения. В случае, если выбрано другое окно и оно не содержит кнопки ОК, а закрывается по крестику, то соответственно нотификации не происходит и элемент остается в состоянии ожидания. Можете сами у себя проверить с любым окном без кнопки ОК.

Я правильно понял, что вы просто открываете окно детали для просмотра, ничего не выбираете и закрываете "крестиком", после чего ваш БП должен идти дальше?
Если так? то передайте ему атрибут-маркер, по которому на OnClose() отработайте Workflow-логику (SendNotify(wa_OpenWindow_OBJECT, MSG_OK))

Хорошо, но тогда как получить ссылку на wa_OpenWindow_OBJECT в моем окне?

нужно его передать в атрибуты, например, как это происходит в function ProcessCloseOptions (которая вызывается при подготовке окна к открытию) если установлен признак "Ожидать закрытия":
SetAttribute(Window, 'NotifyObject', WorkflowAction);

тогда в окне вы сможете его считать:
GetAttribute(Self, 'NotifyObject')

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