Вопрос

Доброго дня,

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

при попытке обновлении 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 в конце.

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

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

Доброго дня!

При работе в CRM нередко сталкиваюсь со спонтанно появляющимися ошибками. Воспроизвести кейс повторно не получается, т.е. сейчас ошибка возникает, а после перезагрузки страницы все в порядке.

Подскажите, пожалуйста, по каким причинам могут возникать подобного рода ошибки? Что они значат? Каким образом можно от них избавиться?

Прикрепленные файлы

Нравится

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

По ошибке 1. После какого-то действия, вы пытаетесь добавить в базу данных значение с тем же ID, которое уже существует, соответственно получаете ошибку.

По ошибке 2, уже труднее, что-то сказать, какой-то объект данных, сериализуемый в JSON и переданный далее, не был правильно обработан на принимающей стороне.

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

Например вы передали this.$Contact в качестве параметра, а ожидался тип Guid, вместо object и чтобы такой ошибки не было, вы должны были бы передать this.$Contact.value

По ошибке 1. После какого-то действия, вы пытаетесь добавить в базу данных значение с тем же ID, которое уже существует, соответственно получаете ошибку.

По ошибке 2, уже труднее, что-то сказать, какой-то объект данных, сериализуемый в JSON и переданный далее, не был правильно обработан на принимающей стороне.

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

Например вы передали this.$Contact в качестве параметра, а ожидался тип Guid, вместо object и чтобы такой ошибки не было, вы должны были бы передать this.$Contact.value

Литвинко Павел,

Спасибо! 

Парадокс, но первая ошибка возникает при создании новой записи (счет/КП). И ладно бы действительно запись была, но ее нет!

 

Alex Zaslavsky,

Нет, т.е. опция "сохранить" при создании присутствует. Где это можно посмотреть наверняка? И почему вы уточнили?

 

Пикулик Тимур,

да у меня когда-то такое было, и я тогда по-моему принудительно сохранял запись, чтобы сделать копирование на определенные детали и для этого мне приходилось перед копированием сохранять запись с помощью this.save({isSilent: true}); 

Но я уже не помню в ем именно была проблема, если честно, сейчас попробую воссоздать маленький кейс, если получится, отпишусь)

Пикулик Тимур,

А у вас продажа создается по бизнес-процессу с помощью элемента "Открыть страницу редактирования" или с помощью какой-либо кнопки без запуска БП?

Alex Zaslavsky,

Вручную, путем обращения к детали и нажатию на "+". 

Пикулик Тимур,

что-то у меня не получилось воссоздать проблему годичной давности)

А какая у Вас версия CRM?

Пикулик Тимур,

а вообще, в первую очередь, я смотрел бы в OpportunityPageV2 в пользовательском пакете, не вызывается ли где-нибудь там метод 'save', а так, не знаю чем помочь)

Alex Zaslavsky,

7.12. Спасибо хотя бы за попытку.

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

Добрый день.
Решил разобраться с DataService(https://academy.terrasoft.ua/documents/technic-sdk/7-8-0/veb-sluzhba-dat...), пробую сделать выборку с бд, например передать номер телефона, и получить ФИО контакта, или наоборот передать ФИО/ID и получить все его номера.
Не получилось.

На SDK все как-то очень не ясно и запутано, и нет примера нормального json запроса.
Есть ли у кого нормальные(простые) примеры json body?
Может кто смог бы написать запрос по тексту выше?
Использую обыкновенные REST клиенты(из хрома и фаерфокса).
Буду очень благодарен.

Нравится

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

Неужели никто не знает как работать с DataService(

Здравствуйте.
Попробуйте смоделировать ситуацию и посмотреть запрос, например, при помощи fiddler. Пример прикрепил.

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

Привет.
Есть POST сервис на C#, который принимает и возвращает json.
Появилась идея, чтоб не регистрировать этот сервис в bpmonline запускать его через бизнес процесс.
Все нормально работает, но вот как передать в БП json тело и получить некий json обратно?
Пока удалось только передать параметры в Url.

Нравится

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

Добрый день,
На данный момент в сервисе ProcessEngineService нет такого метода, который бы позволял передавать параметры из тела POST запроса. Есть похожий метод ExecuteProcessWithResultPost но он устанавливает параметры процесса только из URL.

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

Добрый день!

Не подскажет ли кто-нибудь ответ на такой вопрос: можно ли "перехватить" json до его скармливания системе на десериализацию с тем, чтобы преобразовать его в массив и исключить ряд элементов?

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

Отсюда и возник вопрос - можно ли, до десериализации, "ненужные" данные вычленить из json (сохранив оригинал отдельно) и скормить системе только то, что нужно для работы?

Кроме преобразования в массив я ничего не могу придумать, а bpm не умеет работать с json как с текстом (только как с объектом... или нет?)

Спасибо и сорри, если немного невнятно :)

Нравится

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

JSON - это строка. Делайте что хотите с ней :)

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

1.Имеем некоторый код,который отправляет данные на сервер.Получем данные в виде JSON.
2.Хочу эти данные обрабоать и отобразить в контрагентах.
3.Какие дейстивия мне пошагово надо сделать(какие вкадки открывать, что и куда писать)?

Нравится

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

Владимир, интеграция с внешними ресурсами возможна через протокол OData. Данные можно получить в формате JSON или XML.

С детальной документацией по запросам OData можете ознакомиться на http://www.terrasoft.ru/bpmonlinesdk/ по пути Статьи -> API BPMOnline -> OData, а именно:
http://www.terrasoft.ru/bpmonlinesdk/WorkWithBpmByOdata.html
http://www.terrasoft.ru/bpmonlinesdk/WorkWithBpmByOdataHttp.html

Добрый день!
Тоже интересует этот вопрос.
Может есть у кого скрины такой реализации или более детальный метод решения?
Буду очень признательным.

Здравствуйте, Николай!

Реализация полностью зависит от данных, которые Вы хотите получать. Примера, на основании которого можно реализовать получение любых данных, нет. Главное начать, а по точечным вопросам уже легче получить ответ:wink:.

Здравствуйте.
Вопрос следующий:
Вот у нас есть свой билинг и он может отдавать РОST запросы если оплата произведена. В запросе будет хранится информация об OrderId заказа и Email клиента что сделал оплату. Что мне нужно сделать чтобы bpmonline получил и обработал этот запрос и в счете поменялась состояние оплаты на оплачен полностью.

Здравствуйте!

Создайте бизнес процесс ChangeOrderStatus с параметром OrderId. Элементом изменить данные Вы будете менять состояние счета, у которого Id совпадает с параметром процесса OrderId.

С биллинга отправляйте http запрос на адрес http[s]://<адрес_приложения_bpm'online>/0/ServiceModel/ProcessEngineService.svc/ChangeOrderStatus/Execute?OrderId='Здесь должен быть Id заказа'

Более подробно Вы можете узнать по ссылке.

Спасибо, Алексей.
А скажите еще. Может ли bpmonline отправлять запросы? Если да, то как это сделать?

"Демьяник Алексей" написал:

Здравствуйте!

Создайте бизнес процесс ChangeOrderStatus с параметром OrderId. Элементом изменить данные Вы будете менять состояние счета, у которого Id совпадает с параметром процесса OrderId.

С биллинга отправляйте http запрос на адрес http[s]://<адрес_приложения_bpm'online>/0/ServiceModel/ProcessEngineService.svc/ChangeOrderStatus/Execute?OrderId='Здесь должен быть Id заказа'

Более подробно Вы можете узнать по ссылке.


Я так понимаю это get запрос. А можна сделать Post запрос, ибо у нас еще одна задача - в запросе передать значения карточок контакта (150 полей в одной карточке) и они не поместятся все в строку.

В документации написано следующее:
"Запуск бизнес-процесса

Чтобы запустить в системе определенный бизнес-процесс, необходимо вызвать метод Execute сервиса ProcessEngineService.

Вызов метода Execute можно выполнять с помощью HTTP-запросов GET и POST."

Так что все поместится) Главное, чтобы параметра был с типом "Строка 500 символов".

Я так понял, Я после Post запроса получу в бизнесс-процессе (например) файл Json и присвою его параметру с типом "Строка 500 символов".
А как мне достать из этого вайла все нужные мне поля? Есть какой-то пример?
Спасибо вам большое за ваши ответы, Алексей!

У сервиса ProcessEngineService есть результирующий параметр ResultParameterName, результат которого может быть получен в результате выполнения бизнес-процесса. В этот параметр Вы можете записать JSON строку.

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