Здравствуйте, у меня возник вопрос. Каким образом можна сменить отображаемое поле в поле-справочник. Тоесть если в обьекте указано отображаемое поле Название и везде в полях-справочник при выборе определенной записи, поле содержит Id и Name..вопрос стоит в следующем, как сделать так (к примеру) чтобы при выборе продукта, выводилось не его Имя а допустим Артикул (или еще какое-нибудь поле).

Заранее спасибо.

Нравится

3 комментария

У объекта есть возможность выбрать из списка другое первичное поле для отображения.
После смены может возникнуть проблема в объектах, которые на него ссылаются, но она решаема.

"Зверев Александр" написал:

У объекта есть возможность выбрать из списка другое первичное поле для отображения.

После смены может возникнуть проблема в объектах, которые на него ссылаются, но она решаема.


к сожалению мне нужно сменить отображаемое поле только для 1 карточки редактирования, для всех остальных карточек, отображаемое поле должно остаться преджним

Игорь, можно попробовать воспользоваться методом

SomeEdit.setValueAndText(Guid,displayValue)

У метода есть аналог на C# и на JavaScript, то есть Вы можете вызвать его как с помощью AddScript, так и напрямую.
В случае использования AddScript обратиться к нужному контролу можно по его Id, который можно узнать, воспользовавшись методом, описанным здесь.

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

Никак не соображу.

Есть деталь в разделе, там кнопка Добавить. По ней вызывается страница редактирования записи детали.
Надо в этом процессе проверить некое условие и в зависимости от него либо продолжать, либо выдать сообщение пользователю и закрыть страницу.

Что типа такого в PageLoadComplete мне видится

if (ParentDoc.Condition = true ){
   //продолжаем штатно

}else{
  MessageToUser ("НИЗЗЯ ТЕБЕ!!!");
  Page.Close();

}

Нравится

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

Или не из PageLoadComplete это делать?

А зачем вообще доходить до открытия ...EditPage? Можно написать свой обработчик для кнопки "Добавить" в ...GridPage. Обычно обработчики кнопок в гриде сделаны на JS из соображений оптимизации, но вполне можно написать обычный кусочек БП, который открывает или не открывает окно, в зависимости от условия.

Александр, зависит от того, какие условия Вы проверяете, и когда эти условия инициализируются.
В Вашем случае, видимо, они передаются из родительского окна. В таком случае можно делать проверку на Init.

Ну до этого я допер, что на Init. А как мне что то сказать пользователю и остановить процесс открытия страницы редактирования, вот чего я никак не допру.

И кстати, если через Init, то как мне достучатся до родительской записи для этой детали?

Поддерживаю Александра. Задачу нужно решать иначе.

Иначе то оно да, но как?

Делать проверку до начала открытия окна.

Ну то есть проверку надо делать в событии по клику на кнопке Добавить.
Но мне надо обращаться к текущей записи в основном реестре раздела.
Как до нее добраться, кнопка то в реестре детали.....

Разобрался, на событии нажатия на кнопку параметр
SelectedNodePrimaryColumnValue содержит Id выбранной в основном реестре записи

Возникла другая проблема.
Повесил на событие AddButtonClick свой скрипт таск:

AddButtonClick

Теперь в скрипте проверяю все что мне надо, но!, как мне прервать процесс?!!

return false;

не помогает, все равно открывается страница редактирования записи, так как отрабатывает родительский процесс базовой страницы реестра....

Решил проблему:
1. Скрываем стандартную кнопку Добавить
2. Добавляем свою кнопку Добавить
3. На событие клика своей кнопки Добавить вешаем скрипт с проверкой нужного нам условия и в соответствии с этим заполняем параметр процесса.
4. Добавляем условные потоки управления в зависимости от значения параметра.
5. Не забываем сгенерировать сообщение "AddButtonClick" в родительский процесс по нужному нам условию.
6. Наслаждаемся :-)

addbuttonclicknew

Да, всё правильно. При желании можно ещё показать сообщение при отрицательном значении условия. И из двух условных потоков всё же лучше один сделать по умолчанию (не с ромбиком, а с чертою).

Это уже частности и очевидности, но спасибо.

:wink:

"Шамуилов Александр" написал:1. Скрываем стандартную кнопку Добавить

Можно было просто убрать логику из метода GetRegisterAddPageScript, тогда
"Шамуилов Александр" написал: все равно открывается страница редактирования записи

не должно происходить.

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

Добрый день, а за что отвечает данный объект? RecordAllChangesGridPage
И как он вызывается?

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

public virtual bool InitScriptTask3Execute(ProcessExecutingContext context)

а именно
        var parameters = (Dictionarystring,object>)UserConnection.UserContext[defValuesId.ToString()];
        if (parameters["schemaId"] != null) {
                SysEntitySchemaId = (Guid) parameters["schemaId"];
        }

параметр schemaId отсутствует

Нравится

4 комментария

Разобрался что за объект - Журнал изменений.
Но вопрос остался, какой (Guid) parameters["schemaId"] должен быть?

Илья, уточните, при каких действиях возникает ошибка.
Также приведите, пожалуйста, полный текст ошибки.
Ведь если parameters["schemaId"] пуст, то он и не используется, ошибки быть не должно.

Ошибка возникает при выполнение действия процесса "открыть страницу", страница задается так:

CreateAgreementTask.PageUId = new Guid("98B6B04A-CF5E-44EE-966A-E4A566F2B773"); //AgreementEditPage

и возникает лишь при условии, что до запуска процесса окно AgreementEditPage открывалось, и в нем устнавливалась активной деталь "Журнал изменений"

ошибка такая:

Date: 30.10.2013 12:17:37 Date (UTC): 30.10.2013 8:17:37 Exception Message: The given key was not present in the dictionary. Exception Type: System.Collections.Generic.KeyNotFoundException Exception Source: mscorlib Exception Stack Trace: at System.Collections.Generic.Dictionary`2.get_Item(TKey key) at Terrasoft.WebApp.RecordAllChangesGridPageEventsProcess`1.InitScriptTask3Execute(ProcessExecutingContext context) at Terrasoft.Core.Process.ProcessScriptTask.InternalExecute(ProcessExecutingContext context) at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context) at Terrasoft.Core.Process.ProcessScriptTask.Execute(ProcessExecutingContext context, Func`2 internalExecute) at Terrasoft.WebApp.RecordAllChangesGridPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context) at Terrasoft.WebApp.RecordAllChangesGridPageEventsProcess`1.OnExecuted(Object sender, ProcessActivityAfterEventArgs e) at Terrasoft.Core.Process.ProcessFlowElement.OnExecuted(ProcessActivityAfterEventArgs e) at Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context) at Terrasoft.WebApp.RecordAllChangesGridPageEventsProcess`1.ProcessQueue(ProcessExecutingContext context) at Terrasoft.WebApp.RecordAllChangesGridPageEventsProcess`1.ThrowEvent(ProcessExecutingContext context, String message) at Terrasoft.UI.Core.PageSchemaUserControl.ThrowEvent(String message) at Terrasoft.UI.WebControls.Controls.PageContainer.ThrowInitToContainers(JArray arrayList) at Terrasoft.UI.WebControls.Controls.PageContainer.LoadFromAssembly() at Terrasoft.UI.WebControls.Controls.PageContainer.LoadUserControl() at Terrasoft.UI.WebControls.Controls.PageContainer.OnInit(EventArgs e) at System.Web.UI.Control.InitRecursive(Control namingContainer) at System.Web.UI.Control.InitRecursive(Control namingContainer) at System.Web.UI.Control.InitRecursive(Control namingContainer) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) SessionID: m3wyerjrugyfaert5j52ughm Request URL: /ViewPage.aspx?Id=98b6b04a-cf5e-44ee-966a-e4a566f2b773&defValuesId=c32f1304-af1a-42df-a6cd-b77432d00cc8&createWithUId=a1652dea-856a-4cce-939d-c4acb2637d58 Request Path: /ViewPage.aspx Request UrlReferrer: http://crm.factor.ru/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b… Request Type: GET User Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 User Host Address: 10.131.12.236 User: Sau_EV Is Authenticated: True Authentication Type: Forms Is Secure Connection: False Application Version: 5.2.0.653 Application Path: C:\inetpub\BPMonline\ Application Virtual Path: / Application Trust Level: Full Machine Name: MSK01NFCS064 Is Local: False Process ID: 1272 Process Name: w3wp.exe Process Account Name: IIS APPPOOL\BPMonline Thread Account Name: IIS APPPOOL\BPMonline OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1 Net Framework Version: 4.0.30319.239 DBExecutor Type: MSSqlExecutor

Илья, видимо, система пытается вычитать данные об этом объекте из Журнала изменений, но там ничего нет.
Было бы лучше удаленно подключиться и посмотреть, в чем проблема.
Не могли бы Вы написать на support.team@bpmonline.com для скорейшего разрешения проблемы?

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

BPM 5.4.0
Может кто сталкивался с такой проблемой. Есть две детали, но смотреть их по отдельности, переключаясь от одной к другой, неудобно.
Необходимо их объединить. Так чтобы в одном окне были два этих реестра (один под другим или слева и справа неважно). Как сделать, есть ли примеры?

Нравится

4 комментария

Здравствуйте, Александр!
Такая деталь реализована в BPMonline Service Desk (раздел "Инциденты" (или "Обращения"), деталь "Комментарии").
Принцип следующий:
на страницу детали добавляется два layout'а. В один помещается собственно реестр детали, а в другой - страница реестра дополнительной детали:

Обратите внимание на положение компонента DataSource. В текущей реализации это важно!

Нет возможности развернуть Service Desc (у клиента CRM) может там есть примеры, если нет, то не могли бы скинуть файлик окна?

Прикрепил архив с самим окном и связанными схемами (объект "Комментарий" и страница реестра файлов в комментарии), без которых, скорее всего, импортировать окно не получится.

commentary.rar

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

Добрый день,

Подскажите лучший способ отслеживать(сравнивать что было, что стало) изменение исходного кода в конфигурации. Например я хочу узнать кто(это я могу увидеть сейчас) и что изменил.

У меня идея в том, чтобы делать полный экспорт исходного кода по конфигурации. Хорошо ли это?
Понятно, что есть конфигурации, но как сравнить исходный код.

Нравится

1 комментарий

"Антон Сидоров" написал:У меня идея в том, чтобы делать полный экспорт исходного кода по конфигурации. Хорошо ли это?
Понятно, что есть конфигурации, но как сравнить исходный код.

Такое есть.

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

BPM 5.4.0
Необходимо ставить в поле "Ответственный" в карточке Задачи не только контактов с типом "Сотрудник своей организации", но и с другим типом (допустим его id записан в переменную OtherTypeId)
В карточке задачи в скрипте ChildInitAfterParentScriptExecute есть такой код (наверняка он фильтрует)

Page.OwnerEdit.PrepareLookupFilter += delegate (object sender, LookupEditEventArgs e) {
        var employersContactTypeUId = "60733efc-f36b-1410-a883-16d83cab0980";          
        CollectionDictionarystring, object>> filters = e.Filters;
        filters.Add(new Dictionarystring, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId}}});       
};

Как добавить еще один фильтр с условием ИЛИ?

Нравится

3 комментария
filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId}},
           {"logicalOperation", FilterComparisonType.Or}
}); 
filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {otherTypeUId}},
           {"logicalOperation", FilterComparisonType.Or}
}); 

Александр, думаю, вы немного ошиблись вместо FilterComparisonType.Or надо LogicalOperationStrict.Or.
Но все равно в результате этого у меня выводит пустой список.

Как часто: сам задал вопрос, сам ответил.
А все тупо:

filters.Add(new Dictionary<string, object> {
           {"comparisonType", FilterComparisonType.Equal},
           {"leftExpressionColumnPath", "Type"},
           {"useDisplayValue", false},
           {"rightExpressionParameterValues", new object[] {employersContactTypeUId,otherTypeUId}},
});
Показать все комментарии

В Журнале процессов на детали Элементы процесса, можно отобразить поле Ответственный, что в данном случае оно означает, и как его заполнить в самом процессе

Нравится

4 комментария

И второй вопрос вдогонку, как можно определить запущен ли уже процесс с идентичными входными параметрами

Ольга, поле "Ответственен" показывает владельца процесса (контакт пользователя, под которым выполняется БП).

А что по поводу второго вопроса

Что Вы подразумеваете под входными параметрами, приведите, пожалуйста, пример?

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

Добрый день!
При попытке заменить элемент "Карточка редактирования" на действие "открыть страницу" возникло два вопроса. (вызвано отсутствием у элемента "Карточка редактирования" события о закрытии окна)
1. как действием "открыть страницу" открыть существующий элемент?
2. как привязать существующий документ к процессу?

создал тестовый процесс

Хотелось сделать это: добавляю документ, привязываю к процессу и открываю в карточке.

По факту получается следующее:
документ создается, привязка не происходит, в карточке открывается новый документ.

открываю страницу так:

DocumentId = Guid.NewGuid();
DocumentId = AddDataUserTask1.RecordId;
string DefValuesKey = Guid.NewGuid().ToString();
var defValues = new Dictionary string, object>();
var parameters = new Dictionarystring, string>();

string nowDate = UserConnection.CurrentUser.GetCurrentDateTime().ToString("dd.MM.yyyy");
                       
string DocumentDefaultTitle = "asdfasdfasd " +  " " + nowDate;
var DocumentPlaneDate = DateTime.Now.AddDays(5);

//System.Guid SpecialistSKA;
//if(SpecialistSKA == Guid.Empty){
var             SpecialistSKA = Terrasoft.Configuration.ProcessUtils.DefaultContactId;
//}

System.Guid AccountId = Guid.Empty;
System.Guid Opportunity = Guid.Empty;

var opportunity = new Terrasoft.Configuration.Opportunity(UserConnection);
bool currentOpportunitySpecified = opportunity.ExistInDB(ActiveTreeGridCurrentRowId);
bool opportunityNotSpecified = (Opportunity == Guid.Empty);
if(opportunityNotSpecified && currentOpportunitySpecified){
        Opportunity = ActiveTreeGridCurrentRowId;
        bool res = opportunity.FetchFromDB(Opportunity);
        Guid accountId = res ? opportunity.GetTypedColumnValueGuid>("AccountId") : Guid.Empty;
        if (accountId != Guid.Empty){
                AccountId = accountId;
        }
}


parameters.Add("defValuesId", DefValuesKey);
defValues.Add("Id", DocumentId);
defValues.Add("recordId", DocumentId);
defValues.Add("AgreementStatus", new Guid("FDA64288-F36B-1410-2296-002618DB6C97")); //Подготовка
defValues.Add("AgreementType", new Guid("3B7F427E-F36B-1410-FC9B-002618DB6C97")); //Типовой

//new
defValues.Add("Name", DocumentDefaultTitle);
defValues.Add("Type", new Guid("4E8B76A3-182B-E111-BD99-00155D040C1F")); //Заключение СКА
defValues.Add("Status", new Guid("FD9F327A-F36B-1410-0D8B-002618DB6C97")); //Ожидается проверка
defValues.Add("Owner", SpecialistSKA); //Ответственный
defValues.Add("Account", AccountId); //Account
defValues.Add("Opportunity", Opportunity); //Opportunity
defValues.Add("PlanEndDate", DocumentPlaneDate); //Opportunity

UserConnection.UserContext.Add(DefValuesKey, defValues);
parameters.Add("createWithUId", DocumentId.ToString());

UserTask1.OpenerInstanceId = InstanceUId;
UserTask1.PageParameters = parameters;
UserTask1.PageUId = new Guid("E201DACB-F6E5-46BD-978B-0E743398AB4B"); //FinallyCKAEditPage
UserTask1.UseOpenerRegisterScript = true;
UserTask1.CloseMessage= "AgreementeditPageClose";

return true;

Нравится

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

Здравствуйте, Илья!

А зачем эта строка?

parameters.Add("createWithUId", DocumentId.ToString());

Ведь запись Вам не нужно создавать, она уже создана. Для того, чтобы ее открыть, достаточно передать идентификатор в DefValues, что Вы и делаете вот тут:

defValues.Add("RecordId", DocumentId);

Обратите внимание, название параметра чувствительно к регистру.

Здравствуйте, Анна!

К сожалению ничего не получается.
Прикладываю тестовый процесс.
moduleprocess3.zip

Здравствуйте, Илья!
Процесс импортировать не получится, так как в нем используются элементы не из базовой конфигурации, то есть Вам также нужно предоставить страницы и объекты, используемые в процессе.
Либо создайте простой процесс, в котором просто будет открываться какая-нибудь базовая страница, чтобы локализировать проблему.
Также настораживает то, что начальное событие "AgreementedPageClose" находится в событийном подпроцессе, а обработчик - нет. Это, конечно, не влияет на открытие страницы, но лучше так не делать.
И еще, какое действие указано в элементе "Создать документ 'Проверка СКА'"?

Андрей, вот процесс на стандартных элементах.
moduleprocess31.zip

Илья, сейчас потестирую и отпишусь.

Илья, как правильно писала Анна для открытия созданной задачи нужно писать

parameters.Add("recordId", DocumentId);

и удалить строку

defValues.Add("RecordId", DocumentId);

Также, можно удалить элемент "Привязать объект к процессу", так как созданные в процессе элементы автоматически привязываются к нему.

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

Есть ли у БП, созданного в конфигурации журналирование, по аналогии с БП созданным в разделе, чем они отличаются, и можно ли переннести БП из конфигурации в данный раздел

Нравится

2 комментария

Здравствуйте, Ольга!
Процессы, созданные из раздела "Конфигурация" отличаются от созданных из раздела "Дизайн процессов" только свойством "Тег".
У БП из раздела "Дизайн процессов" это свойство имеет значение "Business Process" и такие процессы имеют журналирование и отображаются в разделе "Дизайн процессов":

У других БП это свойство не заполнено, и они считаются служебными, но его можно заполнить и они появятся в разделе "Дизайн процессов".

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

Где осуществляется привязка процесса к объекту, чтобы можно было выбрать процесс из меню.
Хочется сделать также как например в карточке контрагента происходит вызов процесса импорта при нажатии на "Импортировать контрагенты"

Нравится

3 комментария

Ольга, для решения задачи Вам нужно создать действие. Для этого в разделе перейти в режим настройки, вызвать пункт контекстного меню "Настроить":

/system/files/18-10-2013_14-23-43.png

Добавить новое действие (логика работы действия определяется БП):

/system/files/18-10-2013_14-23-59.png

В разделе теперь действие отображается, а в карточке аналогичная кнопка не появилась

Ольга, чтобы действие отобразилось в карточке нужно очистить Redis и кеш браузера.

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