Всем привет, подскажите, пожалуйста, сталкивался ли из вас кто со следующей проблей, или может предложит варианты решения. 

Есть объект и для него sql запрос. Доступ к коллекции объекта осуществляется через EntityDataService.svc. 
Одно из полей множественное, для такого поля в sql запросе сделана реализация через 

FOR XML PATH ('Goal'), TYPE

Но при запросе коллекции скобки xml тэгов заменяются их кодовыми значениями. 

<d:AccountLoginQualifiedGoal>&lt;Goal id="9857A30F-3F69-4D07-ADC8-02A61D686C82"&gt;&lt;Name&gt;ЦЕЛЬ№1&lt;/Name&gt;&lt;/Goal&gt;&lt;Goal id="187B496F-B7C5-449A-BDE6-7D07D28296DB"&gt;&lt;Name&gt;ЦЕЛЬ№2&lt;/Name&gt;&lt;/Goal&gt;</d:AccountLoginQualifiedGoal>

Можно ли как-то этого избежать и выводить просто как скобки? Чтобы было вот так.

 <d:AccountLoginQualifiedGoal><Goal id="9857A30F-3F69-4D07-ADC8-02A61D686C82"></Goal><Name>Цель№1</Name></Goal><Goal id="5985A03D-0162-4F02-AA64-BDFCFAC93B49"><Name>Ничего из этого</Name></Goal><Goal id="71EBF4E1-B344-490D-94D9-C67EC77206A9"><Name>Встречи</Name></Goal><Goal id="F6CA356F-635D-4C96-B1E6-D0409172F26E"><Name>Цель№2</Name></Goal></d:AccountLoginQualifiedGoal>

 

Нравится

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

Добрый день. 
Правильно ли я понимаю, что Вы получаете ответ от сервиса EntityDataService.svc в виде : 
 

<d:AccountLoginQualifiedGoal>&lt;Goal id="9857A30F-3F69-4D07-ADC8-02A61D686C82"&gt;&lt;Name&gt;ЦЕЛЬ№1&lt;/Name&gt;&lt;/Goal&gt;&lt;Goal id="187B496F-B7C5-449A-BDE6-7D07D28296DB"&gt;&lt;Name&gt;ЦЕЛЬ№2&lt;/Name&gt;&lt;/Goal&gt;</d:AccountLoginQualifiedGoal>

 

Mykhailo Storozhuk,

Да, все верно.

Данное поведения полностью корректное. Данную сериализацию делает базовая функциональность .net framework, именно System.Data.Services.DataService. Это нужно для того, что бы не нарушить основной xml.

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

 

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

Всем привет

https://{server}/0/odata/$metadata
через Postman такой запрос возвращает metadata всех таблиц, а интересует metadata определённой таблицы, скажем Contact. 
Возможно ли как-то получить такие данные?
Спасибо.

Нравится

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

Добрый день!

К сожелению, нет такого запроса, который позволит получить метаданные для конкретной таблицы. Вы можете работать с метаданными, которые вернулись по запросу: https://{server}/0/odata/$metadata 

Дима Вовченко,

Спасибо, жаль что такой возможности нету.

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

Добрый день!

При создании обращений через OData все поля формата data заполняются временем вида 01.01.0001 3:00, как это можно обойти?

Нравится

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

Чтобы установить именно пустую дату, можно сделать процесс, который при установке минимальной даты выполняет напрямую Update в базе данных (https://community.terrasoft.ua/questions/pustaya-data-data-null)

Установите в поле объекта в конфигурации значение по умолчанию равное текущей дате. Если после этого будет такая же дата вероятно вы ее посылает в своем запросе в odata посылаете дату как пустую или неопределенную. При запросе в odata самостоятельно посылайте текущее значение даты времени.

Можно еще написать процесс который будет исправлять даты при создании или после создания обращения.

Чтобы установить именно пустую дату, можно сделать процесс, который при установке минимальной даты выполняет напрямую Update в базе данных (https://community.terrasoft.ua/questions/pustaya-data-data-null)

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

Добрый день,

 

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

curl --location --request GET 'https://ht-lab.terrasoft.ru/0/odata/Contact(ebd2424b-6aad-422e-9bb4-b93f11d5f0db)' \
--header 'ForceUseSession: true' \

--header 'BPMCSRF: -----' \

--header 'Content-Type: application/json; charset=UTF-8'

В ответе ошибка:

{ "error": { "code": "", "message": "An error has occurred." } }

Запрос на получение списка всех контактов возвращает аналогичную ошибку.

В чем может быть причина?

Нравится

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

Владимир, попробуйте опубликовать объект «Контакт» в конфигурации. Если этого будет недостаточно, нужно будет смотреть в логах сайта подробности ошибки.

Зверев Александр,

Спасибо, "опубликовать" помогло.  Раньше обычно делал компиляцию измененных элементов, сейчас это уже не срабатывает.

Вадим, при добавлении/изменении объектов нужно публиковать для каждого именно его схему, чтобы отработало обновление структуры таблицы в БД, создались новые поля. Для других типов компилируемых схем (БП, действия, в 5.Х-интерфейсе были и страницы) это уже не обязательно, достаточно, чтобы опубликовалась любая.

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

При обращении к обьекту UsrBonus(https://0937113-pharm-zakaz.terrasoft.ru/0/odata/UsrBonus?$top=10) получаем ошибку 

{"error":{"code":"","message":"An error has occurred."}}

Подскажите, в чем может быть причина ошибки?

Нравится

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

Альмир, проверил на стандартном разделе, ошибки не наблюдается.

Может, после доработок не опубликовали схему объекта UsrBonus?

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

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

Добрый день!

Планирую интеграцию одного приложения с Creatio CRM через внешний API на OData4.
Читаю документацию, и вижу, что любую сущность можно получить через отдельный запрос. Но изначально система не знает какие сущности могут быть в системе, и чтобы получить их список нужно выполнить SQL-запрос (по инстркуции):
 

для MySQL
SELECT * FROM INFORMATION_SCHEMA.TABLES
для Oracle
SELECT * FROM ALL_TABLES
для PostgreSQL
SELECT table_name FROM information_schema.tables

 

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

Есть ли какой-то способ через внешний API получить список всех таблиц?

Нравится

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

Павел, можно ещё

https://{server}/0/odata/

Так будет результат в  JSON.

 

Либо воспользоваться информацией из таблицы SysSchema, которая тоже доступна по OData. За объекты отвечает EntitySchemaManager, получить список можно с таким фильтром:

https://{server}/0/odata/SysSchema?$filter=ManagerName%20eq%20%27EntitySchemaManager%27

А вариант с выбором из базы не очень подходит, поскольку зависит от платформы, плюс не все таблицы в базе связаны с объектами конфигурации и могут быть доступны по OData. И наоборот, часть объектов сделаны не на основе table, а по view.

Нашел сам

Запрос на 

https://{server}/0/odata/$metadata

возвращает внутри <Schema Namespace="Terrasoft.Configuration.OData" xmlns="http://docs.oasis-open.org/odata/ns/edm"> все сущности

Павел, можно ещё

https://{server}/0/odata/

Так будет результат в  JSON.

 

Либо воспользоваться информацией из таблицы SysSchema, которая тоже доступна по OData. За объекты отвечает EntitySchemaManager, получить список можно с таким фильтром:

https://{server}/0/odata/SysSchema?$filter=ManagerName%20eq%20%27EntitySchemaManager%27

А вариант с выбором из базы не очень подходит, поскольку зависит от платформы, плюс не все таблицы в базе связаны с объектами конфигурации и могут быть доступны по OData. И наоборот, часть объектов сделаны не на основе table, а по view.

Зверев Александр, Спасибо! А метадату конкретной сущности как получить? 
Требуется узнать какие поля у модели.

В https://{server}/0/odata/$metadata всё есть.

Pavel Buev,

Добрый день Павел, нашли решение получение метадаты конктретной сущности? ищу рещение такой же проблемы

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

Добрый день! Пытался обновить версию OData по инструкции:

https://academy.terrasoft.ru/documents/technic-sdk/7-16/integraciya-s-creatio-po-protokolu-odata-4?_ga=2.183260710.1232967641.1598249864-1095365786.1598249864

 

Добавил в Web.Config, который находится в корневой папке в блок <appSettings>

строку:

<add key="Feature-UseODataV4" value="true" />

Сохранил файл конфигурации.

Следующий запрос через Postman для проверки возвращает статус 404: 

http://myapp/0/odata/Employee?$filter=FullJobTitle eq 'Developer' and Account/Name ne 'Our company'

 

В то же время запрос для версии OData 3 возвращает статус 200:

http://myapp/0/ServiceModel/EntityDataService.svc/EmployeeCollection?$f… eq 'Developer' and Account/Name ne 'Our company'

 

Полная компиляция, очистка редис и перезапуск приложения в IIS не помогло.

Версия продукта 7.15.0.634

Нравится

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

Никита, нужно добавить не во внешний, а во внутренний Web.Config, который в папке Terrasoft.WebApp.

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

Доброго дня, имеется bpm которая при GET запросе 0/ServiceModel/EntityDataService.svc/ContactColletion возвращает xml с контактами, можно ли GET запросом возвращать JSON и если да, то где про это написанно? Если нельзя, то как вернуть JSON для oData 3?

Нравится

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

Добавьте header к запросу

Accept: application/json;odata=verbose

Добавьте header к запросу

Accept: application/json;odata=verbose

я смог сделать это в постмане, но все же не понятно, мб подскажете возможно ли в террасофте возвращать json по обращению к uri, если можно сделать это не переписывая сервис, буду благодарен за подсказку)
условно я иду по адресу /0/ServiceModel/EntityDataService.svc/ContactCollection и мне падает 
 

{

    "d": {

        "results": [

            {

                "__metadata": {

                    "id": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…",

                    "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…",

                    "type": "Terrasoft.Configuration.Contact"

                },

                "Photo": {

                    "__deferred": {

                        "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…"

                    }

                },

                "Owner": {

                    "__deferred": {

                        "uri": "http://localhost:85/0/ServiceModel/EntityDataService.svc/ContactCollect…"

                    }
...и т.д.

Насколько понял, только заголовком. Такой формат здесь не поддерживается: «ContactCollection?$format=json». А в OData 4 по умолчанию идёт JSON.

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

Добрый день, коллеги!

 

Недавно вышло обновление к Creatio, где расширили функционал oData, а точнее добавили действие upsert, я хотел бы узнать, как правильно генерировать данный запрос?

Я работаю через postman.

 

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

Нравится

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

Михаил, для того, чтобы сделать upsert, нужно выполнить patch-запрос с указанием id в списке полей. Раньше если записи не было, возвращало ошибку, сейчас производится вставка. А если есть, то и раньше, и сейчас — изменение. Готовых именно таких примеров нет, о patch есть в справочнике по API.

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

Добрый день!

Необходимо получить список обращений с фильтрацией по колонке Status. Но поскольку это поле не заполнено, беру колонку StatusId в которой указаны справочные ID статусов обращения.

Отправляю запрос в следующем виде:

https://mysite/0/odata/Case?$filter=StatusId eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

получаю ответ:

{
    "error": {
        "code": "",
        "message": "The query specified in the URI is not valid. Unrecognized 'Edm.String' literal 'guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'' at '12' in 'StatusId eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38''."
    }
}

 

Какие комбинации я только не пробовал:

https://mysite/0/odata/Case?$filter=StatusId/Id eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

https://mysite/0/odata/Case?$filter=StatusId eq guid'7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

https://mysite/0/odata/Case?$filter=StatusId eq '7e9f1204-f46b-1410-fb9a-0050ba5d6c38'

и т.д. - результат один и тот же - ошибка 400

 

При этом если я делаю запрос по колонке с данными типа string - запрос отрабатывает корректно и возвращает ответ 200, например так:

https://mysite/0/odata/Case?$filter=Number eq 'SR00000262'

 

Что я делаю не так?

Нравится

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

Должно работать так:

https://mysite/0/odata/Case?$filter=Status/Id eq 7e9f1204-f46b-1410-fb9a-0050ba5d6c38

 

Должно работать так:

https://mysite/0/odata/Case?$filter=Status/Id eq 7e9f1204-f46b-1410-fb9a-0050ba5d6c38

 

Спасибо, теперь ответ приходит корректный.

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