Вопрос

Подскажите пожалуйста, в каком формате содержится фильтр в поле SearchData объекта ContactFolder.

При чтении данного поля получаю следующую информацию:

{"className":"Terrasoft.FilterGroup","items":{"65af680d-1eb1-43be-86ca-b8925182f2a2":{"className":"Terrasoft.CompareFilter","filterType":1,"comparisonType":3,"isEnabled":true,"trimDateTimeParameterToDate":false,"leftExpression":{"className":"Terrasoft.ColumnExpression","expressionType":0,"columnPath":"Account.Name"},"isAggregative":false,"key":"65af680d-1eb1-43be-86ca-b8925182f2a2","dataValueType":1,"leftExpressionCaption":"Контрагент.Название","rightExpression":{"className":"Terrasoft.ParameterExpression","expressionType":2,"parameter":{"className":"Terrasoft.Parameter","dataValueType":1,"value":"Автомагазины"}}},"ebd926cc-b513-426c-a30b-212d7b38ca8c":{"className":"Terrasoft.CompareFilter","filterType":1,"comparisonType":3,"isEnabled":true,"trimDateTimeParameterToDate":false,"leftExpression":{"className":"Terrasoft.ColumnExpression","expressionType":0,"columnPath":"Account.Name"},"isAggregative":false,"key":"ebd926cc-b513-426c-a30b-212d7b38ca8c","dataValueType":1,"leftExpressionCaption":"Контрагент.Название","rightExpression":{"className":"Terrasoft.ParameterExpression","expressionType":2,"parameter":{"className":"Terrasoft.Parameter","dataValueType":1,"value":"Автолиния"}}}},"logicalOperation":1,"isEnabled":true,"filterType":6,"rootSchemaName":"Contact","key":"FolderFilters"}

Но загрузка обратно этих текстовых данных в формате Base64 сбрасывает фильтр.

Помогите знающие, каким образом можно программно через OData генерировать фильтры. Заранее благодарю.

У меня такой же вопрос

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

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

Да, это сериализированный объект. Если удалось разобраться в его структуре, то нужно выяснить, на каком этапе у Вас в базу попало неверное значение: при построении этого JSON или при преобразовании текста в бинарные данные и записи в поле по OData Если есть прямой доступ к базе, попробуйте сначала менять это поле средствами SQL, записывая исправленное значение в колонку таблицы, преобразовывая в нужный тип.

А когда удастся добиться работоспособности, то смотрите, что не так при передаче из веб-сервиса. Также можно запустить Fiddler, проделать изменение и сохранение фильтра в браузере и посмотреть, какой HTTP-запрос при этом уйдёт на сервер.

Изначально я настроил руками фильтр, далее этот фильтр я считал через OData в виде текста JSON. Далее заношу ровно тот же текст JSON упакованный в двоичные данные Base64. Если просто положить текст, то программа не открывает редактирование фильтра. А если в двоичных данных, то открывает пустой фильтр, как будто фильтра никогда там и не было...

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

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

Попробую что нибудь придумать, хотя со стороны 1С это сделать крайне проблематично...

Для начала попробуйте разобраться через базу. Если ещё и 1С привлекать, причину неверного фильтра искать будет ещё сложнее: слишком много мест, где что-то могло пойти не так.

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

У меня только в облаке. Скорее всего фильтр записан в кодировке ANSI, а 1С текст держит в UTF-8 кодировке... Я попробую разобраться считав двоичные данные или работая через поток...

Для эксперимента ещё можно отправлять HTTP-запросы прямо из Fiddler.

Учту, хотя в 1С гораздо проще и быстрее проверять идеи. Все инструменты работы с данными там есть...

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

Спасибо за моральную поддержку. Разобрался. В общем в поле содержится просто JSON текст в ANSI формате. Нужно немного доработать, а так фильтр работает...

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

Подскажи пожалуйста в какой кодировке сереализуется текст, если данная информация у вас есть?.. Уже испробовал кучу кодировок и без толку, только кроказябры изменяются в значении фильтра. Либо фильтр перестаёт открываться на кодировках UTF-7...UTF-32...

UTF-7, UTF-8, UTF-16, UTF-32, OEM, ANSI, US-ASCII, CP866, windows-1251 по 1254, KOI8R, KOI8U...

Видимо, преобразование в бинарные данные делается стандартными средствами SQL-сервера. Если написать:

SELECT [SearchData]
, cast ([SearchData] as varchar(max))
, cast(cast ([SearchData] as varchar(max)) as varbinary(max))
FROM [AccountFolder]

Получим в первой колонке бинарные данные, во второй — текст JSON, а в третьей — те же данные, что в первой. При этом во второй колонке кириллица выводится как «ÐžÑ‚Ñ€Ð°ÑÐ»ÑŒ Консалтинг». Если вставить в «Декодер» , он выдаст: «Отра�ль Кон�алтинг CP1252->UTF-8».

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

Добрый день.

Есть ли возможность массово поменять значения, например, объединив использование $filter и MERGE? Или единственный вариант по идентификатору?

Цели 2:

1. Действительно массово заменить общее значение на другое

2. Использовать кастомный идентификатор, известный внешней системе, без необходимости каждый раз разрешать его в guid.

Подход "в лоб" вернул ошибку

Query options $select, $expand, $filter, $orderby, $inlinecount, $skip, $skiptoken and $top are not supported by this request method or cannot be applied to the requested resource.

Может, просто синтаксис чуть неверен?

Отправленный запрос (по сути тоже по Id)

curl -X MERGE -H 'Content-Type: application/json;odata=verbose' -H 'Accept: application/atom+xml' -i 'http://terapp-t.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou? eq '\''648dbb58-2aea-578d-e053-2413a8c01794'\' --data '{Name: '\''Other name'\''}'

У меня такой же вопрос

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

Вы уверенны что правильно передали название объекта те что в системе есть объект Accou очень похоже что вы имели ввиду Account (Контрагент) но недокопипастили!

Если хотите получать помощь по ошибке приводите полностью описание ошибки.

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

 

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

 

Спасибо за ответ, но я пока не уверен, что хорошо объяснил свою задачу. Мне бы хотелось получить аналог update Account set Name='New name' where Name='Old Name'; я представляю, как сделать аналог select, но модифицировать могу только по первичному ключу
update Account set Name='New name' where Id='{61402C80-BB18-45FC-89A2-5BBFAC1A53F2}' через AccountCollection(guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2')

 

Мой запрос выглядит так:

curl -X PUT -H 'Accept: application/atom+xml' -H 'Content-Type: application/json;odata=verbose' -i 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'\''61402c80-bb18-45fc-89a2-5bbfac1a53f2'\' --data '{Name: "Other name3"}'

Ответ:

 

    Status Code: 405 Method Not Allowed
    Cache-Control: private
    Content-Length: 1197
    Content-Type: application/xml;charset=utf-8
    DataServiceVersion: 1.0;
    Date: Fri, 21 Sep 2018 10:03:14 GMT
    Server: Microsoft-IIS/8.5
    X-AspNet-Version: 4.0.30319
    X-Content-Type-Options: nosniff
    X-Frame-Options: SAMEORIGIN
    X-Powered-By: ASP.NET

 

<?xml version="1.0" encoding="utf-8" standalone="yes"?><error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code>4</code><message xml:lang="">The URI 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2'' is not valid for PUT operation. The URI must point to a single resource for PUT operations.</message><innererror><message>The URI 'http://terapp-d.hq.eximb.com/0/ServiceModel/EntityDataService.svc/Accou… eq guid'61402c80-bb18-45fc-89a2-5bbfac1a53f2'' is not valid for PUT operation. The URI must point to a single resource for PUT operations.</message><type>System.Data.Services.DataServiceException</type><stacktrace>   в System.Data.Services.DataService`1.HandlePutOperation(RequestDescription description, IDataService dataService)&#xD;
   в System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD;
   в System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;
   в System.Data.Services.DataService`1.HandleRequest()</stacktrace></innererror></error>

По поводу Accou - это валидатор сайта укоротил url, он был перенесен через клипборд прямо из браузера

The URI must point to a single resource for PUT operations!!!

Делайте в два прохода вызовите фильтр и получите коллекцию id пробежитесь по ним и проапдєйтите записи. Или используйте другие механизмы. (БП или кодом вариантов много)

Можно не использовать OData, а сделать свой БП с текстовыми входными параметрами, который делает нужное обновление записей. А потом для запуска дёргать его через веб-сервис.

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

Это не вариант, ищется generic решение, как заткнуть каждую конкретную дыру, мы и так знаем, но их ожидается неопределенное количество :)

 

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

Например, в bpm'online loyalty были специальные веб-сервисы и их методы для чтения, добавления, изменения контактов, карт, покупок и прочих сущностей. В любом случае специализированная логика будет работать быстрее стандартной, которая будет гонять тысячу Id туда и обратно, а потом тысячу раз обновлять по одной записи.

Итого ответ на 21.09.2018 такой:

указанная функциональность включена в OData V4.01, поэтому ожидать ее в bpm'online в ближайшее время бессмысленно; нужно искать обходные решения.

Начать искать можно с комментариев выше этого ^.

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

 спасибо, но как я уже написал, это не подходящий нам вариант по причине ограниченности типов входных параметров и, как следствие, необходимости либо выполнения серьезных трансформаций на уровне сервреа bpm'online, либо разработки многочисленных частных решений.

В текстовом параметре можно сериализировать какие угодно значения тем же JSON. Или передавать команды с любой разметкой, хоть прямо слать SQL-запросы (но это очень небезопасно, лучше так не делать).

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

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

Здравствуйте у меня небольшой вопрос по OData

Делаю OData запрос. Выставляю в $filter=ModifiedOn ge datetime'...+03:00', модифицирую запись, и запускаю запрос на выборку. Почему-то данные не считываются из-за того что текущее время на клиенте - 10 минут не пересчитывается во время сервера. Подскажите как мне можно задать вопрос чтобы с таблицы можно было считать изменённые записи за 10 минут. Время естественно у меня локальное.

У меня такой же вопрос

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

Добрый день, 

Для начала хочу обратить внимание на то,
что время в БД записывается в UTC (таймзона +00:00).

При отправке времени в формате "yyyy-mm-ddThh:mm:ssZ"
передается фактическое значение времени, без учета таймзоны сервера и клиента. 

Если отправлять время в формате "yyyy-mm-ddThh:mm:ss"
значение записывается в БД с учетом таймзоны сервера.

Если передавать данные в фармате  "yyyy-mm-ddThh:mm:ss+TZ"  пример "2018-01-31T08:24:49+03:00", это время с чететом часового пояса клиента. 

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

 

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

Добрый день!

Подскажите, в чем проблема. Делаю запрос http://x.x.x.x/0/ServiceModel/EntityDataService.svc/AccountCollection?$select=Id,Name,TypeId выводит все как надо, но если делаю фильтрацию по TypeId (http://x.x.x.x/0/ServiceModel/EntityDataService.svc/AccountCollection?$select=Id,Name,TypeId&$filter=TypeId eq guid'cefc45f2-3573-44fb-8602-264c57ae0ea6'), то выдает ошибку <message xml:lang="">Элемент коллекции с именем TypeId не найден</message>

Спасибо!

У меня такой же вопрос

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

Добрый день.

Попробуйте вместо TypeId указать Type. В похожем случае помогло: https://community.terrasoft.ru/questions/ese-odnin-vopros-po-filtram

Антон Малий,

Антон, добрый день!

Спасибо за ссылку!) Задачу удалось решить иначе, к ИД справочного объекта нужно через / обращаться. При таком запросе все отработало: http://x.x.x.x/0/ServiceModel/EntityDataService.svc/AccountCollection?$select=Id,Name,TypeId&$filter=Type/Id eq guid'cefc45f2-3573-44fb-8602-264c57ae0ea6'

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

Добрый день, сегодня ночью BPMonline обновилась до версии 7.10 и перестала работать авторизация: 403 - Forbidden: Access is denied. You do not have permission to view this directory or page using the credentials that you supplied.
Раньше осуществляли авторизацию по примеру из данной темы (http://www.community.terrasoft.ru/forum/topic/9613).
Можете, пожалуйста скинуть пример авторизации на php c добавлением CSRF-токена в заголовок запроса.

У меня такой же вопрос

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

Здравствуйте, Мария!

Готового запроса нет - его нужно писать. Если у вас получится, пожалуйста, поделитесь.

Спасибо за ответ.
получилось подкорректировать POST запрос, добавили вытягивание токена из файла:

$file = "cookie.txt";
$lines = file( $file ); 
$str =  $lines[6]; 
$prefix = "BPMCSRF";
$index = strpos($str, $prefix) + strlen($prefix);
$token = trim(substr($str, $index));

и добавили в заголовок:

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json;odata=verbose',
		'BPMCSRF:' .  $token,
        'Content-Length: ' . strlen($json))
);

После обновления необходимо теперь добавить CSRF токен
Есть пакет который уже предоставляет интерфейс для BPM

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

Добрый день!
У нас возникли проблемы с фильтрацией получаемых через odata данных.
Мы пробовали несколько вариантов:
client.AccountCollection.Where(x => x.CgrDistributorId == DistributorId).ToList();

также через LINQ:
var result = from account in (client.AccountCollection as IQueryable)
where account.CgrDistributorId == DistributorId
select account;
result.ToList();
Эти варианты выдают ошибку "Элемент коллекции с именем CgrDistributorId не найден", хотя данная колонка есть. Мы обновляли ServiceReference, а данные из неё получаються если загрузить список не используя фильтр.

работает только:
client.AccountCollection.ToList().Where(x => x.CgrDistributorId == DistributorId).ToList();
Но он не подходит, т.к. он перед фильтрацией подгружает весь список и фильтрует данные уже в ОЗУ, что не корректно.

У меня такой же вопрос

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

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

Выполните фильтрацию в самом обращение к ODATA:
using (var response = (HttpWebResponse)authRequest.GetResponse()) {
// Создание запроса на получение данных от сервиса OData.
//var dataRequest = HttpWebRequest.Create(serverUri + "ContactCollection?$select=Id, Name, Gender&$expand=Gender&$filter = Id eq guid'" + contactId + "'") as HttpWebRequest;
var dataRequest = HttpWebRequest.Create(serverUri + "ContactCollection?$select=*&$filter = Id eq guid'" + contactId + "'") as HttpWebRequest;
// Для получения данных используется HTTP-метод GET.
dataRequest.Method = "GET";
// Добавление полученных ранее аутентификационных cookie в запрос на получение данных. ,Products&$expand=Products/Suppliers
dataRequest.CookieContainer = bpmCookieContainer;
// Получение ответа от сервера.
using (var dataResponse = (HttpWebResponse)dataRequest.GetResponse()) {
// Загрузка ответа сервера в xml-документ для дальнейшей обработки.
XDocument xmlDoc = XDocument.Load(dataResponse.GetResponseStream());
// Получение коллекции объектов контактов, соответствующих условию запроса.
var contacts = from entry in xmlDoc.Descendants(atom + "entry")
select new {
Id = new Guid(entry.Element(atom + "content")
.Element(dsmd + "properties")
.Element(ds + "Id").Value),
Name = entry.Element(atom + "content")
.Element(dsmd + "properties")
.Element(ds + "Name").Value
};
foreach (var contact in contacts) {
// Выполнение действий с контактами.
}
}
}

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

Добрый день.

У нас возник выопрос, можно ли изменть значение системных настроек через Odata?
При попытке сохранить изменения под супервизором через odata нам выдаёт ошибку Forbidden.
Мы предполагаем, что это может быть связано с тем, что доступ к ним через Odata закрыт.
Подскажите, может кто то сталкивался с подобной проблемой.

У меня такой же вопрос

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

Здравствуйте, Богдан!

Изменение значений системных настроек через OData не предусмотрено.

Есть два варианта решения этой задачи:
1) Создать собственный web сервис, который будет менять значения системных настроек в таблице SysSettingsValue
2) Создать объект, к которому будут идти обращения по OData. Логикой в созданном объекте (или триггерами в БД) необходимо будет переносить новые значения в таблицу SysSettingsValue.

Раньше было нельзя, только несколько таблиц с префиксом Sys открыты на запись

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

Здравствуйте! В теме новичок, столкнулся с необходимостью интеграции сервиса клиента на сайт. В целом сервис был написан еще до меня и работал, но появилась непредвиденная ситуация. На сайт выгружаются объекты (квартиры/дома и т.п.) из crm клиента, проверка идет по полю ModifiedOn. И для самих объектов это срабатывает. Но в отдельной коллекции есть фото объектов, и там меняется именно поле updated (поле ModifiedOn при этом может быть года этак 2015 и в выборку свежих объектов не попадает). Пример запроса:

https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1

Результат:

version="1.0" encoding="utf-8"?>
xml:base="https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
        >
https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection>
        <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"text"</span><span style="color: #000000; font-weight: bold;">></span>PropertyGalleryImageCollection>
        >
2017-02-27T14:32:38Z>
        rel="self" title="PropertyGalleryImageCollection" href="PropertyGalleryImageCollection" />
        >

                >
https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')>
                term="Terrasoft.Configuration.PropertyGalleryImage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
                rel="edit" title="PropertyGalleryImage" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/CreatedBy" type="application/atom+xml;type=entry" title="CreatedBy" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/CreatedBy" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/ModifiedBy" type="application/atom+xml;type=entry" title="ModifiedBy" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/ModifiedBy" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/LockedBy" type="application/atom+xml;type=entry" title="LockedBy" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/LockedBy" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Type" type="application/atom+xml;type=entry" title="Type" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/Type" />
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Property" type="application/atom+xml;type=entry" title="Property" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/Property" />
                <span style="color: #000000; font-weight: bold;">/></span>
                >
2017-02-27T14:32:38Z>
                >

                        />
                >
                rel="http://schemas.microsoft.com/ado/2007/08/dataservices/edit-media/Data" type="application/octet-stream" title="Data" href="PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/Data" />
                type="application/xml">
                        >

                                m:type="Edm.Guid">cc758317-6214-4d84-ab95-0002e72a9411>
                                >
IMG_8264_marged(14-05-2014).jpg>
                                m:type="Edm.DateTime">2015-12-16T15:47:39.2810926>
                                m:type="Edm.Guid">0a043409-0d95-4833-a11d-6b1d4e5ae568>
                                m:type="Edm.DateTime">2015-12-16T15:47:39.2810926>
                                m:type="Edm.Guid">0a043409-0d95-4833-a11d-6b1d4e5ae568>
                                m:type="Edm.Int32">0>
                                />
                                m:type="Edm.Guid">00000000-0000-0000-0000-000000000000>
                                m:type="Edm.DateTime">0001-01-01T00:00:00>
                                m:type="Edm.Guid">529bc2f8-0ee0-df11-971b-001d60e938c6>
                                m:type="Edm.Int32">1>
                                m:type="Edm.Int32">6106506>
                                m:type="Edm.Int32">9>
                                />
                                m:type="Edm.Guid">e70021e1-b7a2-4644-a121-7ca975b6bc73>
                        >
                >
        >
>

Видно, что updated свежий, а ModifiedOn - нет.

Фильтрация по ModifiedOn:
https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=ModifiedOn%20gt%20datetime%272017-02-20%27
При попытке изменения ModifiedOn на updated:
https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=updated%20gt%20datetime%272017-02-20%27

Ошибка следующего содержания.
No property 'updated' exists in type 'Terrasoft.Configuration.PropertyGalleryImage' at position 0.
Вопрос следующий: как модифицировать запрос для выборки именно по дате обновления исходного объекта, а не самого файла изображения?

У меня такой же вопрос

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

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

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

Результат выполнения простого запроса http://localhost:84/0/ServiceModel/EntityDataService.svc/ContactCollect…? в разное время:
2017-02-28T08:27:53Z

2017-02-28T09:01:13Z

При том, что данные в таблице не изменялись.
Когда устанавливаете фильтр $filter, то это означает, что Вы обращаетесь к значениям элементов

Здравствуйте,
вы неправильно поняли, поля updated не существует в базе данных для данной сущности. Это поле добавляется сервисом, и отображает серверное время ответа на ваш запрос, а дата изменения сущности в Bpmonline, это как раз колонка ModifiedOn, которая существует, и меняется в рамках Bpmonline когда данная сущность изменяется. Следовательно, если у картинки такая дата изменения, то возможно она именно тогда и была загружена\изменена. Сам объект недвижимости мог быть скорректирован вчера, но картинки загружены в него еще полгода назад, и конечно же их ModifiedOn не будет изменен только потому что ModifiedOn самого объекта изменен, и.т.д. В общем одата судя по всему работает корректно, а вам стоит пересмотреть саму бизнес задачу получения данных.
Вы можете получать свою информацию в несколько этапов, к примеру, вначале получаете объекты недвижимости, измененные сегодня, потом оббегая список этих объектов, делаете запрос к их картинкам, с условием по родителю. Id которого вы получили в предыдущем запросе.

Спасибо за ваши ответы, что-то такое я и подозревал (собственно, ранее уже пытался брать фотку по id исходного объекта, и столкнулся с той же ошибкой, что опишу далее).

Почитал еще по поводу фильтра, но делаю как в примерах, и ответ сервера не тот)

В данном случае id исходного объекта - PropertyId. Взял guid этого объекта из сообщения выше, создал запрос:

https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/Prope…

Ответ следующий:

<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
[geshifilter-code]1[/geshifilter-code]
<message xml:lang="">Элемент коллекции с именем PropertyId не найден</message>
<innererror>
<message>Элемент коллекции с именем PropertyId не найден</message>
<type>Terrasoft.Common.ItemNotFoundException</type>
<stacktrace>
at Terrasoft.Core.MetaItemCollection`1.GetByName(String name)
 at Terrasoft.Core.Entities.EntitySchema.GetInheritedPath(String columnPath)
 at Terrasoft.Core.Entities.EntitySchemaQuery.CreateSchemaColumnExpression(EntitySchemaQuery parentQuery, EntitySchema rootSchema, String columnPath, Boolean useCoalesceFunctionForMultiLookup, Boolean useDisplayValue)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.CreateExpression(Expression node)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.CreateSimpleFilter(BinaryExpression binary)
 at Terrasoft.Core.Entities.EntityQueryWhereBlockBuilder.BuildBlock(MethodCallExpression node)
 at Terrasoft.Core.Entities.EntityQueryProvider.VisitMethodCall(MethodCallExpression node)
 at Terrasoft.Core.Entities.EntityQueryProvider.Build(Expression expression)
 at Terrasoft.Core.Entities.EntityQueryProvider.LoadEntityCollection(Expression expression)
 at Terrasoft.Core.Entities.EntityQueryProvider.ExecuteEnumerable(Type elementType, Expression expression)
 at Terrasoft.Core.Entities.EntityQuery`1.GetEnumerator()
 at System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable enumerable)
 at System.Data.Services.DataService`1.SerializeResponseBody(RequestDescription description, IDataService dataService, IODataResponseMessage responseMessage)
 at System.Data.Services.DataService`1.HandleRequest()
</stacktrace>
</innererror>
</error>

Куда копать дальше?

Используйте запрос: https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/Prope… eq guid'e70021e1-b7a2-4644-a121-7ca975b6bc73')

Всем большое спасибо!

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

Добрый день!

У контакта имеются поля Phone, MobilePhone, HomePhone.
У лида MobilePhone, BusinesPhone.
У контрагента Phone, AdditionalPhone.

Раньше я делал поиск через через
$filter=substringof('6665544', MobilePhone)
Но в разделе "Средства связи" пользователи могут добавлять много номеров, поэтому поиск не работает по всем этим полям.

Я увидел тип ContactCommunication в котором и хранятся остальные номера.

Один из вариантов поиска это сначала сделать запрос

/0/ServiceModel/EntityDataService.svc/ContactCommunicationCollection?$filter=substringof('07562135947', SearchNumber)&$select=ContactId для получения Id контакта, а затем получить контакт из ContactCollection по Id.

Для этого нужно делать два запроса.

Подскажите, как сделать поиск всего лишь одним запросом ,чтобы искать сразу и по полям и в коллекции ContactCommunication ?

У меня такой же вопрос

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

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

Ознакомтесь со статьями:

  1. URI Conventions
  2. Using $select, $expand, and $value in ASP.NET Web

"Терещук Павел" написал:

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

Ознакомтесь со статьями:

  1. URI Conventions
  2. Using $select, $expand, and $value in ASP.NET Web

Спасибо! Получилось осуществить поиск конктакта через один запрос к ContactCommunicationCollection и $extend Contact.

Все хорошо, но мне надо получить лишь некоторые поля Contact, а именно Id, Name, OwnerId, AccountId.

Для этого я добавляю в запрос $select=Contact/Id, Contact/Name и это работает без ошибок.

Но если я добавляю Contact/OwnerId или Contact/AccountId, то получаю ошибку:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

    1
    Элемент коллекции с именем AccountId не найден
    
        Элемент коллекции с именем AccountId не найден
        Terrasoft.Common.ItemNotFoundException
           at Terrasoft.Core.MetaItemCollection`1.GetByName(String name)&#xD;
   at Terrasoft.Core.Entities.EntitySchema.GetInheritedPath(String columnPath)&#xD;
   at Terrasoft.Core.Entities.EntitySchemaQuery.CreateColumn(String columnPath)&#xD;
   at Terrasoft.Core.Entities.EntitySchemaQuery.AddColumn(String columnPath)&#xD;
   at Terrasoft.Core.Entities.EntityQueryProvider.Build(Expression expression)&#xD;
   at Terrasoft.Core.Entities.EntityQueryProvider.LoadEntityCollection(Expression expression)&#xD;
   at Terrasoft.Core.Entities.EntityQueryProvider.ExecuteEnumerable[TResult](Expression expression)&#xD;
   at Terrasoft.Core.Entities.EntityQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()&#xD;
   at System.Data.Services.Providers.BasicExpandProvider.ExpandedQueryable`1.GetEnumerator()&#xD;
   at System.Data.Services.WebUtil.GetRequestEnumerator(IEnumerable enumerable)&#xD;
   at System.Data.Services.DataService`1.SerializeResponseBody(RequestDescription description, IDataService dataService, IODataResponseMessage responseMessage)&#xD;
   at System.Data.Services.DataService`1.HandleRequest()
    

Хотя если не задавать $select, то эти поля присутствуют.

Вот запрос:

https://004057-sales-enterprise.bpmonline.com/0/ServiceModel/EntityDataService.svc/ContactCommunicationCollection?$filter=substringof('224433305083', SearchNumber)&$expand=Contact&$select=Contact/Id,Contact/Name,Contact/AccountId,Contact/OwnerId

Подскажите что не так делаю?

Разобрался. Вопрос закрыт. Спасибо за помощь!

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

Добрый день!

У одного из клиентов для сущностей: Лид, Контакт, Контрагент имеются обязательные поля.

Соответственно при попытке добавить сущность по протоколу OData получаем ошибку: такое то поле является обязательным.

Вопрос: как через OData получить список обязательных полей для сущностей Lead, Contact, Account ?

06.48.2017 14:48:26,472  INFO BpmConnector:56 - 11 * Sending client request on thread http-nio-8443-exec-3
11 > POST https://004057-sales-enterprise.bpmonline.com/0/ServiceModel/EntityDataS... > Accept: application/atom+xml;type=entry;charset=utf-8
11 > Authorization: Basic TWFyaW5hOk1hUmlONGlL
11 > Content-Type: application/json;odata=verbose;type=entry
{"LeadName":null,"Contact":"Новый контакт","MobilePhone":"+380991112233","CreatedBy":null,"ModifiedBy":null,"Owner":null}

06.48.2017 14:48:26,758  INFO BpmConnector:56 - 12 * Client response received on thread http-nio-8443-exec-3
12 12 12 12 12 12 12 12 12 12 12 12 3Поле Email является обязательным для заполненияПоле Email является обязательным для заполненияTerrasoft.Core.Entities.RequiredColumnsEmptyValuesException   at Terrasoft.Core.Entities.Services.ServiceContext.SaveChanges()
   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)
   at System.Data.Services.DataService`1.HandleRequest()

У меня такой же вопрос

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

Добрый день.

Вопрос получения списка обязательных полей через OData требует более глубокого анализа. Рекомендуем обратиться в Техническую поддержку Террасофт.

С уважением,
Группа компаний Terrasoft

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

Обратите внимание на статью Queryable OData Metadata

"Терещук Павел" написал:

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

Обратите внимание на статью Queryable OData Metadata


Могу выполнить только такой запрос

https://004057-sales-enterprise.bpmonline.com/0/ServiceModel/EntityDataService.svc/$metadata

У меня у лида обязательным полем является email.

<EntityType Name="Lead">
                <Key>
                    <PropertyRef Name="Id" />
                </Key>
                <Property Name="Id" Type="Edm.Guid" Nullable="false" />
                <Property Name="LeadName" Type="Edm.String" />
                <Property Name="CreatedOn" Type="Edm.DateTime" />
                <Property Name="CreatedById" Type="Edm.Guid" />
                <Property Name="ModifiedOn" Type="Edm.DateTime" />
                <Property Name="ModifiedById" Type="Edm.Guid" />
                <Property Name="ProcessListeners" Type="Edm.Int32" />
                <Property Name="Notes" Type="Edm.String" />
                <Property Name="Account" Type="Edm.String" />
                <Property Name="Contact" Type="Edm.String" />
                <Property Name="TitleId" Type="Edm.Guid" />
                <Property Name="FullJobTitle" Type="Edm.String" />
                <Property Name="StatusId" Type="Edm.Guid" />
                <Property Name="InformationSourceId" Type="Edm.Guid" />
                <Property Name="IndustryId" Type="Edm.Guid" />
                <Property Name="AnnualRevenueId" Type="Edm.Guid" />
                <Property Name="EmployeesNumberId" Type="Edm.Guid" />
                <Property Name="BusinesPhone" Type="Edm.String" />
                <Property Name="MobilePhone" Type="Edm.String" />
                <Property Name="Email" Type="Edm.String" />
                <Property Name="Fax" Type="Edm.String" />
                <Property Name="Website" Type="Edm.String" />
                <Property Name="AddressTypeId" Type="Edm.Guid" />
                <Property Name="CountryId" Type="Edm.Guid" />
                <Property Name="RegionId" Type="Edm.Guid" />
                <Property Name="CityId" Type="Edm.Guid" />
                <Property Name="Zip" Type="Edm.String" />
                <Property Name="Address" Type="Edm.String" />
                <Property Name="DoNotUseEmail" Type="Edm.Boolean" />
                <Property Name="DoNotUsePhone" Type="Edm.Boolean" />
                <Property Name="DoNotUseFax" Type="Edm.Boolean" />
                <Property Name="DoNotUseSMS" Type="Edm.Boolean" />
                <Property Name="DoNotUseMail" Type="Edm.Boolean" />
                <Property Name="Commentary" Type="Edm.String" />
                <Property Name="QualifiedContactId" Type="Edm.Guid" />
                <Property Name="QualifiedAccountId" Type="Edm.Guid" />
                <Property Name="LeadTypeId" Type="Edm.Guid" />
                <Property Name="LeadTypeStatusId" Type="Edm.Guid" />
                <Property Name="LeadDisqualifyReasonId" Type="Edm.Guid" />
                <Property Name="AccountCategoryId" Type="Edm.Guid" />
                <Property Name="AccountOwnershipId" Type="Edm.Guid" />
                <Property Name="DepartmentId" Type="Edm.Guid" />
                <Property Name="GenderId" Type="Edm.Guid" />
                <Property Name="JobId" Type="Edm.Guid" />
                <Property Name="DecisionRoleId" Type="Edm.Guid" />
                <Property Name="QualifyStatusId" Type="Edm.Guid" />
                <Property Name="Dear" Type="Edm.String" />
                <Property Name="QualificationProcessId" Type="Edm.Guid" />
                <Property Name="OwnerId" Type="Edm.Guid" />
                <Property Name="RemindToOwner" Type="Edm.Boolean" />
                <Property Name="SalesOwnerId" Type="Edm.Guid" />
                <Property Name="Budget" Type="Edm.Decimal" />
                <Property Name="MeetingDate" Type="Edm.DateTime" />
                <Property Name="DecisionDate" Type="Edm.DateTime" />
                <Property Name="ShowDistributionPage" Type="Edm.Boolean" />
                <Property Name="RegisterMethodId" Type="Edm.Guid" />
                <Property Name="LeadSourceId" Type="Edm.Guid" />
                <Property Name="LeadMediumId" Type="Edm.Guid" />
                <Property Name="OpportunityDepartmentId" Type="Edm.Guid" />
                <Property Name="IdentificationPassed" Type="Edm.Boolean" />
                <Property Name="StartLeadManagementProcess" Type="Edm.Boolean" />
                <Property Name="SaleType" Type="Edm.String" />
                <Property Name="Score" Type="Edm.Decimal" />
                <Property Name="QualificationPassed" Type="Edm.Boolean" />
                <Property Name="CountryStr" Type="Edm.String" />
                <Property Name="RegionStr" Type="Edm.String" />
                <Property Name="CityStr" Type="Edm.String" />
                <Property Name="WebFormId" Type="Edm.Guid" />
                <Property Name="BpmHref" Type="Edm.String" />
                <Property Name="BpmRef" Type="Edm.String" />
                <Property Name="Qualified" Type="Edm.Int32" />
                <Property Name="SaleParticipant" Type="Edm.Int32" />
                <Property Name="QualifiedPercent" Type="Edm.Decimal" />
                <Property Name="SalePercent" Type="Edm.Decimal" />
                <Property Name="OrderId" Type="Edm.Guid" />
                <Property Name="OpportunityId" Type="Edm.Guid" />
                <NavigationProperty Name="CreatedBy" Relationship="Terrasoft.Configuration.Lead_CreatedBy" ToRole="CreatedBy" FromRole="Lead" />
                <NavigationProperty Name="ModifiedBy" Relationship="Terrasoft.Configuration.Lead_ModifiedBy" ToRole="ModifiedBy" FromRole="Lead" />
                <NavigationProperty Name="Title" Relationship="Terrasoft.Configuration.Lead_Title_ContactSalutationType_LeadCollectionByTitle" ToRole="ContactSalutationType_LeadCollectionByTitle" FromRole="Lead_Title" />
                <NavigationProperty Name="Status" Relationship="Terrasoft.Configuration.Lead_Status_LeadStatus_LeadCollectionByStatus" ToRole="LeadStatus_LeadCollectionByStatus" FromRole="Lead_Status" />
                <NavigationProperty Name="InformationSource" Relationship="Terrasoft.Configuration.Lead_InformationSource_InformationSource_LeadCollectionByInformationSource" ToRole="InformationSource_LeadCollectionByInformationSource" FromRole="Lead_InformationSource" />
                <NavigationProperty Name="Industry" Relationship="Terrasoft.Configuration.Lead_Industry_AccountIndustry_LeadCollectionByIndustry" ToRole="AccountIndustry_LeadCollectionByIndustry" FromRole="Lead_Industry" />
                <NavigationProperty Name="AnnualRevenue" Relationship="Terrasoft.Configuration.Lead_AnnualRevenue_AccountAnnualRevenue_LeadCollectionByAnnualRevenue" ToRole="AccountAnnualRevenue_LeadCollectionByAnnualRevenue" FromRole="Lead_AnnualRevenue" />
                <NavigationProperty Name="EmployeesNumber" Relationship="Terrasoft.Configuration.Lead_EmployeesNumber_AccountEmployeesNumber_LeadCollectionByEmployeesNumber" ToRole="AccountEmployeesNumber_LeadCollectionByEmployeesNumber" FromRole="Lead_EmployeesNumber" />
                <NavigationProperty Name="AddressType" Relationship="Terrasoft.Configuration.Lead_AddressType_AddressType_LeadCollectionByAddressType" ToRole="AddressType_LeadCollectionByAddressType" FromRole="Lead_AddressType" />
                <NavigationProperty Name="Country" Relationship="Terrasoft.Configuration.Lead_Country_Country_LeadCollectionByCountry" ToRole="Country_LeadCollectionByCountry" FromRole="Lead_Country" />
                <NavigationProperty Name="Region" Relationship="Terrasoft.Configuration.Lead_Region_Region_LeadCollectionByRegion" ToRole="Region_LeadCollectionByRegion" FromRole="Lead_Region" />
                <NavigationProperty Name="City" Relationship="Terrasoft.Configuration.Lead_City_City_LeadCollectionByCity" ToRole="City_LeadCollectionByCity" FromRole="Lead_City" />
                <NavigationProperty Name="QualifiedContact" Relationship="Terrasoft.Configuration.Lead_QualifiedContact_Contact_LeadCollectionByQualifiedContact" ToRole="Contact_LeadCollectionByQualifiedContact" FromRole="Lead_QualifiedContact" />
                <NavigationProperty Name="QualifiedAccount" Relationship="Terrasoft.Configuration.Lead_QualifiedAccount_Account_LeadCollectionByQualifiedAccount" ToRole="Account_LeadCollectionByQualifiedAccount" FromRole="Lead_QualifiedAccount" />
                <NavigationProperty Name="LeadType" Relationship="Terrasoft.Configuration.Lead_LeadType_LeadType_LeadCollectionByLeadType" ToRole="LeadType_LeadCollectionByLeadType" FromRole="Lead_LeadType" />
                <NavigationProperty Name="LeadTypeStatus" Relationship="Terrasoft.Configuration.Lead_LeadTypeStatus_LeadTypeStatus_LeadCollectionByLeadTypeStatus" ToRole="LeadTypeStatus_LeadCollectionByLeadTypeStatus" FromRole="Lead_LeadTypeStatus" />
                <NavigationProperty Name="LeadDisqualifyReason" Relationship="Terrasoft.Configuration.Lead_LeadDisqualifyReason_LeadDisqualifyReason_LeadCollectionByLeadDisqualifyReason" ToRole="LeadDisqualifyReason_LeadCollectionByLeadDisqualifyReason" FromRole="Lead_LeadDisqualifyReason" />
                <NavigationProperty Name="AccountCategory" Relationship="Terrasoft.Configuration.Lead_AccountCategory_AccountCategory_LeadCollectionByAccountCategory" ToRole="AccountCategory_LeadCollectionByAccountCategory" FromRole="Lead_AccountCategory" />
                <NavigationProperty Name="AccountOwnership" Relationship="Terrasoft.Configuration.Lead_AccountOwnership_AccountOwnership_LeadCollectionByAccountOwnership" ToRole="AccountOwnership_LeadCollectionByAccountOwnership" FromRole="Lead_AccountOwnership" />
                <NavigationProperty Name="Department" Relationship="Terrasoft.Configuration.Lead_Department_Department_LeadCollectionByDepartment" ToRole="Department_LeadCollectionByDepartment" FromRole="Lead_Department" />
                <NavigationProperty Name="Gender" Relationship="Terrasoft.Configuration.Lead_Gender_Gender_LeadCollectionByGender" ToRole="Gender_LeadCollectionByGender" FromRole="Lead_Gender" />
                <NavigationProperty Name="Job" Relationship="Terrasoft.Configuration.Lead_Job_Job_LeadCollectionByJob" ToRole="Job_LeadCollectionByJob" FromRole="Lead_Job" />
                <NavigationProperty Name="DecisionRole" Relationship="Terrasoft.Configuration.Lead_DecisionRole_ContactDecisionRole_LeadCollectionByDecisionRole" ToRole="ContactDecisionRole_LeadCollectionByDecisionRole" FromRole="Lead_DecisionRole" />
                <NavigationProperty Name="QualifyStatus" Relationship="Terrasoft.Configuration.Lead_QualifyStatus_QualifyStatus_LeadCollectionByQualifyStatus" ToRole="QualifyStatus_LeadCollectionByQualifyStatus" FromRole="Lead_QualifyStatus" />
                <NavigationProperty Name="Owner" Relationship="Terrasoft.Configuration.Lead_Owner_Contact_LeadCollectionByOwner" ToRole="Contact_LeadCollectionByOwner" FromRole="Lead_Owner" />
                <NavigationProperty Name="SalesOwner" Relationship="Terrasoft.Configuration.Lead_SalesOwner_Contact_LeadCollectionBySalesOwner" ToRole="Contact_LeadCollectionBySalesOwner" FromRole="Lead_SalesOwner" />
                <NavigationProperty Name="RegisterMethod" Relationship="Terrasoft.Configuration.Lead_RegisterMethod_LeadRegisterMethod_LeadCollectionByRegisterMethod" ToRole="LeadRegisterMethod_LeadCollectionByRegisterMethod" FromRole="Lead_RegisterMethod" />
                <NavigationProperty Name="LeadSource" Relationship="Terrasoft.Configuration.Lead_LeadSource_LeadSource_LeadCollectionByLeadSource" ToRole="LeadSource_LeadCollectionByLeadSource" FromRole="Lead_LeadSource" />
                <NavigationProperty Name="LeadMedium" Relationship="Terrasoft.Configuration.Lead_LeadMedium_LeadMedium_LeadCollectionByLeadMedium" ToRole="LeadMedium_LeadCollectionByLeadMedium" FromRole="Lead_LeadMedium" />
                <NavigationProperty Name="OpportunityDepartment" Relationship="Terrasoft.Configuration.Lead_OpportunityDepartment_OpportunityDepartment_LeadCollectionByOpportunityDepartment" ToRole="OpportunityDepartment_LeadCollectionByOpportunityDepartment" FromRole="Lead_OpportunityDepartment" />
                <NavigationProperty Name="WebForm" Relationship="Terrasoft.Configuration.Lead_WebForm_GeneratedWebForm_LeadCollectionByWebForm" ToRole="GeneratedWebForm_LeadCollectionByWebForm" FromRole="Lead_WebForm" />
                <NavigationProperty Name="Order" Relationship="Terrasoft.Configuration.Lead_Order_Order_LeadCollectionByOrder" ToRole="Order_LeadCollectionByOrder" FromRole="Lead_Order" />
                <NavigationProperty Name="Opportunity" Relationship="Terrasoft.Configuration.Lead_Opportunity_Opportunity_LeadCollectionByOpportunity" ToRole="Opportunity_LeadCollectionByOpportunity" FromRole="Lead_Opportunity" />
                <NavigationProperty Name="ActivityCollectionByLead" Relationship="Terrasoft.Configuration.Activity_Lead_Lead_ActivityCollectionByLead" ToRole="Activity_Lead" FromRole="Lead_ActivityCollectionByLead" />
                <NavigationProperty Name="CallCollectionByLead" Relationship="Terrasoft.Configuration.Call_Lead_Lead_CallCollectionByLead" ToRole="Call_Lead" FromRole="Lead_CallCollectionByLead" />
                <NavigationProperty Name="FileLeadCollectionByLead" Relationship="Terrasoft.Configuration.FileLead_Lead_Lead_FileLeadCollectionByLead" ToRole="FileLead_Lead" FromRole="Lead_FileLeadCollectionByLead" />
                <NavigationProperty Name="LeadAddressCollectionByLead" Relationship="Terrasoft.Configuration.LeadAddress_Lead_Lead_LeadAddressCollectionByLead" ToRole="LeadAddress_Lead" FromRole="Lead_LeadAddressCollectionByLead" />
                <NavigationProperty Name="LeadInFolderCollectionByLead" Relationship="Terrasoft.Configuration.LeadInFolder_Lead_Lead_LeadInFolderCollectionByLead" ToRole="LeadInFolder_Lead" FromRole="Lead_LeadInFolderCollectionByLead" />
                <NavigationProperty Name="LeadInTagCollectionByEntity" Relationship="Terrasoft.Configuration.LeadInTag_Entity_Lead_LeadInTagCollectionByEntity" ToRole="LeadInTag_Entity" FromRole="Lead_LeadInTagCollectionByEntity" />
                <NavigationProperty Name="LeadProductCollectionByLead" Relationship="Terrasoft.Configuration.LeadProduct_Lead_Lead_LeadProductCollectionByLead" ToRole="LeadProduct_Lead" FromRole="Lead_LeadProductCollectionByLead" />
                <NavigationProperty Name="SpecificationInLeadCollectionByLead" Relationship="Terrasoft.Configuration.SpecificationInLead_Lead_Lead_SpecificationInLeadCollectionByLead" ToRole="SpecificationInLead_Lead" FromRole="Lead_SpecificationInLeadCollectionByLead" />
</EntityType>

Вот поле email для Lead

У него отсутствует аттрибут nullable="false", но добавить я его без поля Email не могу.

Конечно в данной ситуации мне известно какое поле не задано, но нужен способ узнать это через запрос. $metadata не дает мне такой информации

Добрый день.

Рекомендуем вам ознакомиться с информацией по Odata на сайте http://www.odata.org/. Либо задать вопрос на http://stackoverflow.com/.

С уважением,
Группа компаний Terrasoft

Войдите или зарегистрируйтесь, чтобы комментировать