Здравствуй, уважаемое сообщество!

Долгое время назад был написан бизнес-процесс, который до некоторого времени стабильно выполнял свои функции, и в конце отправлял email пользователю... но последние несколько дней перестал это делать.

Решил проверить БП и при нажатии на элемент "Отправить email" появляются ошибки в консоли "Cannot read property 'setValue' of undefined", и параметры элемента не отображаются - вечная "Загрузка".

Изображение удалено.

 

Подскажите, пожалуйста, куда копать и что можно глянуть?

Нравится

1 комментарий
Лучший ответ

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

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

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

Доброго дня,

столкнулся с проблемой, прошу вашей помощи.

при попытке обновлении guid("UsrRegistrationStatusId") с помощью odata используя json формат полезной нагрузки получаю ошибку 

"message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details."
"message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)."

 привожу пример

http метод put,

передаваемый json  

{

"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06",

"UsrTitle":"myvalue",

"UsrFirstName":"myvalue",

"UsrLastName":"myvalue",

"UsrPreferredEmail":"myvalue@mm.mm",

"UsrDateOfBirth":"2019-04-18T11:14:26.697Z",

"UsrOccupation":"myvalue",

"UsrJobTitle":"myvalue",

"UsrCompanyPersonal":"myvalue",

"UsrComment":"myvalue",

"UsrModifiedOn":"2019-04-18T11:14:26.697Z",

"UsrPassportNumber":"myvalue",

"UsrContactNumber":"myvalue",

"UsrDateOfExpiry":"2019-04-18T11:14:26.697Z",

"UsrNationality":"myvalue",

"UsrGuestTypeId":"myvalue",

"UsrMainGuestId":"myvalue",

"UsrIsAccompanyingPerson":"myvalue",

"UsrFlightsModifiedOn":"2019-04-18T11:14:26.697Z"

}

Возможно ли сформировать поля в json  с определенным типом например Edm.Guid ? Было бы круто если покажите пример с описанием типа данных.

Спасибо за внимание!

 

 

Нравится

11 комментариев
Лучший ответ

Привидите полный код формирования запроса с установкой всех служебных заголовков и обратите внимание на примеры для c# 

Представьте Id  Guid в вашем Json как

guid'9d44061-de29-4578-9df6-d2f226573a06'

Спасибо за ответ!

но не помогло  ошибка таже,

urn запроса 0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')

json

{

"UsrRegistrationStatusId":"guid'a9d44061-de29-4578-9df6-d2f226573a06'"

}

полный ответ 

{
  "error": {
    "code": "4",
    "message": {
      "lang": "",
      "value": "An error occurred while processing this request."
    },
    "innererror": {
      "message": "An error occurred while processing this request.",
      "type": "System.Data.Services.DataServiceException",
      "stacktrace": "   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.Deserializer.HandlePutRequest()\r\n   at System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)\r\n   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)\r\n   at System.Data.Services.DataService`1.HandleRequest()",
      "internalexception": {
        "message": "Cannot convert a primitive value to the expected type 'Edm.Guid'. See the inner exception for more details.",
        "type": "Microsoft.Data.OData.ODataException",
        "stacktrace": "   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadPrimitiveValueImplementation(IEdmPrimitiveTypeReference expectedValueTypeReference, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonPropertyAndValueDeserializer.ReadNonEntityValueImplementation(IEdmTypeReference expectedTypeReference, DuplicatePropertyNamesChecker duplicatePropertyNamesChecker, CollectionWithoutExpectedTypeValidator collectionValidator, Boolean validateNullValue)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryProperty(IODataJsonReaderEntryState entryState, IEdmProperty edmProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonEntryAndFeedDeserializer.ReadEntryContent(IODataJsonReaderEntryState entryState, IEdmNavigationProperty& navigationProperty)\r\n   at Microsoft.Data.OData.Json.ODataJsonReader.ReadAtEntryStartImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.ReadImplementation()\r\n   at Microsoft.Data.OData.ODataReaderCore.InterceptException[T](Func`1 action)\r\n   at System.Data.Services.Serializers.EntityDeserializer.ReadEntry(ODataReader odataReader, SegmentInfo topLevelSegmentInfo)\r\n   at System.Data.Services.Serializers.EntityDeserializer.Read(SegmentInfo segmentInfo)\r\n   at System.Data.Services.Serializers.ODataMessageReaderDeserializer.Deserialize(SegmentInfo segmentInfo)",
        "internalexception": {
          "message": "Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).",
          "type": "System.FormatException",
          "stacktrace": "   at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)\r\n   at System.Guid.TryParseGuidWithDashes(String guidString, GuidResult& result)\r\n   at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)\r\n   at System.Guid..ctor(String g)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertStringValue(String stringValue, Type targetType)\r\n   at Microsoft.Data.OData.Json.ODataJsonReaderUtils.ConvertValue(Object value, IEdmPrimitiveTypeReference primitiveTypeReference, ODataMessageReaderSettings messageReaderSettings, ODataVersion version, Boolean validateNullValue)"
        }
      }
    }
  }
}

Так же обратите внимание, на формирование строка запроса, в примере изменения имени контакта с идентификатором 00000000-0000-0000-0000-000000000000 из коллекции контактов ContactCollection.

// Строка запроса:
// PUT <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')
// или
// MERGE <Адрес приложения BPMonline>/0/ServiceModel/EntityDataService.svc/ContactCollection(guid'00000000-0000-0000-0000-000000000000')

Григорий Чех,

Сейчас выполняется запрос вида 

 PUT <Адрес приложения BPMonline>0/ServiceModel/EntityDataService.svc/UsrGuestCollection(guid'3b42f755-1f62-4358-878c-47f460ab9e57')

А если без двойных кавычек

Json

{

"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'

}

Григорий Чех,

Без двойных кавычек сработает ошибка парсинга json 

{

"UsrRegistrationStatusId":guid'a9d44061-de29-4578-9df6-d2f226573a06'

}

 "message": "Invalid JSON. A token was not recognized in the JSON content."

 

В принципе должно быть

{

"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"

}

А если попробовать поменять простое текстовое поле например Name (если оно есть в вашем объекте) запрос корректно отработает?

Григорий Чех,

Да если менять обычное текстовое поле всё проходит успешно.

Были проблемы с типами данных - числами и датой, та же ошибка с преобразованием типов, на дату решилось преобразованием строки к виду "2019-04-18T11:14:26.697Z" , с числом не получается воспроизвести.

{

"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"

}

На такой формат выводит ошибку приведенную во  2 коментарии 

Привидите полный код формирования запроса с установкой всех служебных заголовков и обратите внимание на примеры для c# 

Прошу прощёния, данном формате запрос работает корректно.

{

"UsrRegistrationStatusId":"a9d44061-de29-4578-9df6-d2f226573a06"

}

Извините что ввёл в заблуждение.

Проявилось не сразу.. запросы выполнял в rest api клиенте после перезапуска клиента данный формат успешно обновил запись.



Премного вам благодарен! Огромное спасибо за ваше время!

Есть и более сложный способ, там не просто голый Guid надо, а с упоминанием названия коллекции, как тут с полом:

{
    Name: 'John',
    BirthDate: new Date(123321123321),
    Gender: {__metadata: { uri: 'GenderCollection(guid\'FC2483F8-65B6-DF11-831A-001D60E938C6\')' }}
}

И в таком случае справочное поле пишется без Id в конце.

Больше примеров в этом обсуждении.

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

Добрый день, уважаемое сообщество!

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

А при обращения через OData я могу получить результат запроса, но не представляю, как в него добавить фильтр по текущему контакту.

Подскажите, пожалуйста, как мне быть.

Нравится

3 комментария
Лучший ответ

Посмотрите в академии ПРИМЕРЫ ЗАПРОСОВ НА ВЫБОРКУ С ФИЛЬТРАЦИЕЙ

На вскидку вам надо получить id текущего пользователя в переменую ContactCurrentUserId и вызвать чтото типа

В примере ниже e71dceda-9b0f-4509-aa10-f479aa69a9eb - Id контакта текущего пользователя а фильтрация идет по значению Guid в поле Contact объекта Project

Url сайта&gt;/0/ServiceModel/EntityDataService.svc/ProjectCollection?$filter=Contact/Id eq guid'e71dceda-9b0f-4509-aa10-f479aa69a9eb'

 

Посмотрите в академии ПРИМЕРЫ ЗАПРОСОВ НА ВЫБОРКУ С ФИЛЬТРАЦИЕЙ

На вскидку вам надо получить id текущего пользователя в переменую ContactCurrentUserId и вызвать чтото типа

В примере ниже e71dceda-9b0f-4509-aa10-f479aa69a9eb - Id контакта текущего пользователя а фильтрация идет по значению Guid в поле Contact объекта Project

Url сайта&gt;/0/ServiceModel/EntityDataService.svc/ProjectCollection?$filter=Contact/Id eq guid'e71dceda-9b0f-4509-aa10-f479aa69a9eb'

 

Через OData можно считать SysAdminUnit с фильтрацией по логину пользователя, тем самым получить contactId. А дальше делать уже запрос на выборку и фильтрацию проектов.

Через ProcessEngineService можно получить значение пвраметра (указав название параметра в ResultParameterName), но с интерпретируемыми процессами это работает плохо

В 7.17.1 должен появиться возврат результата из нынешних интерпретируемых БП, в академии будут инструкции по запуску из клиентского и серверного кода.

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

Добрый день!

Подскажите, где (в каком месте) заполняется параметр БП [#Id созданного счета#] в БП CreateInvoice?

В этот параметр попадает Id вновь созданного счета, на каком этапе, не могу понять, помогите разобраться

Нравится

2 комментария
Лучший ответ

Заполняется в методе CreateInvoice БП CreateInvoiceFromOrder

public virtual void CreateInvoice() {
	OrderInvoiceHelper helper = Factories.ClassFactory.Get&lt;OrderInvoiceHelper&gt;(new Factories.ConstructorArgument("userConnection", UserConnection));
CreatedInvoiceId = helper.CreateEntity("Order", "Invoice", CurrentOrder, new Dictionary&lt;string, string&gt; {
	{"Currency", "Currency"},
	{"CurrencyRate", "CurrencyRate"},
	{"Contact", "Contact"},
	{"Account", "Account"},
	{"Owner", "Owner"},
	{"Amount", "Amount"},
	{"Opportunity", "Opportunity"}
}, new Dictionary&lt;string, object&gt; { { "Order", CurrentOrder } });
}

 

Заполняется в методе CreateInvoice БП CreateInvoiceFromOrder

public virtual void CreateInvoice() {
	OrderInvoiceHelper helper = Factories.ClassFactory.Get&lt;OrderInvoiceHelper&gt;(new Factories.ConstructorArgument("userConnection", UserConnection));
CreatedInvoiceId = helper.CreateEntity("Order", "Invoice", CurrentOrder, new Dictionary&lt;string, string&gt; {
	{"Currency", "Currency"},
	{"CurrencyRate", "CurrencyRate"},
	{"Contact", "Contact"},
	{"Account", "Account"},
	{"Owner", "Owner"},
	{"Amount", "Amount"},
	{"Opportunity", "Opportunity"}
}, new Dictionary&lt;string, object&gt; { { "Order", CurrentOrder } });
}

 

Вот я слепошарый! Спасибо!

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

Всем доброго дня. Версия 7.12.

Существует ли способ отписки от сообщения? Обычно в init идёт подписка на sandbox примерно в таком виде:

init: function(callback, scope) {
	this.callParent(arguments);
 
	this.sandbox.subscribe("startMessageEvent", function(arg) {
		console.log(arg)
	}, this, ["messageId"]);
},

Можно ли отписаться от sandbox? Конкретная задача - изменить обработчик, т.е. то, что внутри функции function(arg){}. Предполагаю, что для этого нужно сначала отписаться от сообщения, после чего подписаться на него заново.

Нравится

2 комментария
Лучший ответ

Проще использовать базовый функционал а именно unsubscribePtp примерно так:

this.sandbox.unsubscribePtp("startMessageEvent");

Попробуйте полностью переопределить метод init.

Проще использовать базовый функционал а именно unsubscribePtp примерно так:

this.sandbox.unsubscribePtp("startMessageEvent");
Показать все комментарии

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

таблице со столбцами

Ответственный | Количество активностей

Нравится

1 комментарий
Лучший ответ

Если Вам нужна возможность фильтрации для разных периодов, тогда придется разработать собственный виджет.

За основу можете взять пример воронки продаж в дешбордах - там тоже реализована возможность фильтрации периода.

Также посмотрите статью на Академии по добавлению пользовательского виджета итогов.

Если Вам нужна возможность фильтрации для разных периодов, тогда придется разработать собственный виджет.

За основу можете взять пример воронки продаж в дешбордах - там тоже реализована возможность фильтрации периода.

Также посмотрите статью на Академии по добавлению пользовательского виджета итогов.

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

Всем доброго дня. Версия 7.12.

При открытии дизайнера страницы возникает ошибка.

Изображение удалено.

Попытка генерации исходного кода и компиляции всей сборки не помогла. В чём может быть причина ошибки? 

Нравится

1 комментарий
Лучший ответ

При открытии любой страницы или только страницы (страниц) какогото конкретного раздела? Если это какой то конкретный раздел какие изменения в него вносились?

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

При открытии любой страницы или только страницы (страниц) какогото конкретного раздела? Если это какой то конкретный раздел какие изменения в него вносились?

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

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

Всем добрый день. Версия 7.12.

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

Изображение удалено.

 

Нравится

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

Добрый день, нужна помощь, есть трудности с построением такого фильтра:

 

Select * from "Contact"
LEFT JOIN "SysAdminUnit" ON "Contact"."Id" = "SysAdminUnit"."ContactId"
where "SysAdminUnit"."Id" IN 
	(Select "SysUserId" from "SysUserInRole" where "SysRoleId" IN 
		(Select FuncRoleId from SysFuncRoleInOrgRole))

Для filterGroup, должно получится что-то вроде такого: (мой вариант не верный).

 

filterGroup.add("ContactList", Terrasoft.createExistsFilter("[SysAdminUnit:Contact].[SysUserInRole:SysUser].SysRole.[SysFuncRoleInOrgRole:FuncRole]"));

 

Нравится

1 комментарий
Лучший ответ

Можно сначала вычитать все FuncRoleId из SysFuncRoleInOrgRole удовлетворяющие вашим условиям, а потом построить фильтр createColumnInFilterWithParameters, пример привел ниже (existsDocumentsCollection - массив с коллекциями которые нужно включить в запрос)

var filtersGroup = Terrasoft.createFilterGroup();
filtersGroup.logicalOperation = Terrasoft.LogicalOperatorType.AND;
var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
	existsDocumentsCollection);
existsFilter.comparisonType = this.Terrasoft.ComparisonType.EQUAL;
existsFilter.Name = "existsFilter";
filtersGroup.addItem(existsFilter);
filtersGroup.addItem(discontListFilter);

 

Можно сначала вычитать все FuncRoleId из SysFuncRoleInOrgRole удовлетворяющие вашим условиям, а потом построить фильтр createColumnInFilterWithParameters, пример привел ниже (existsDocumentsCollection - массив с коллекциями которые нужно включить в запрос)

var filtersGroup = Terrasoft.createFilterGroup();
filtersGroup.logicalOperation = Terrasoft.LogicalOperatorType.AND;
var existsFilter = this.Terrasoft.createColumnInFilterWithParameters("Id",
	existsDocumentsCollection);
existsFilter.comparisonType = this.Terrasoft.ComparisonType.EQUAL;
existsFilter.Name = "existsFilter";
filtersGroup.addItem(existsFilter);
filtersGroup.addItem(discontListFilter);

 

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

Добрый день. Версия 7.12.

Возникла проблема с отправкой сообщения из БП на клиентскую часть. Используем стандартный механизм:

Terrasoft.Configuration.MsgChannelUtilities.PostMessage(userConnection, MessageName ,MessageText );

Выяснилось, что если в системе залогинены одновременно два пользователя под одним аккаунтом (с разных компьютеров), то сообщение приходит только одному из них, причём не всегда тому, кто непосредственно запускал бизнес-процесс.

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

Нравится

3 комментария
Лучший ответ

Добрый день

Работа 2-х пользователей в системе под одним аккаунтом - не совсем корректная работа с системой.

Скорее всего будет приходить сообщение только одному пользователю.



Чтобы отослать сообщение всем, используйте метод MsgChannelUtilities.PostMessageToAll с передачей Id пользователя, запустившего БП, а на клиенте уже разбирайте ответ

Добрый день

Работа 2-х пользователей в системе под одним аккаунтом - не совсем корректная работа с системой.

Скорее всего будет приходить сообщение только одному пользователю.



Чтобы отослать сообщение всем, используйте метод MsgChannelUtilities.PostMessageToAll с передачей Id пользователя, запустившего БП, а на клиенте уже разбирайте ответ

ясно, спасибо, попробую с PostMessageToAll 

Логично, когда под одной учёткой работает один реальный пользователь. В противном случае теряется смысл в разграничении прав, журнале изменений и лицензировании. Приход сообщения в один браузер — нормальная работа системы, в более старых версиях приходило во все, потом исправили.

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