Здравствуйте у меня небольшой вопрос по 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'), то выдает ошибку Элемент коллекции с именем TypeId не найден

Спасибо!

Нравится

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.
Раньше осуществляли авторизацию по примеру из данной темы (https://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> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"text"</span><span style="color: #000000; font-weight: bold;">></span></span>PropertyGalleryImageCollection<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">>
        >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> <span style="color: #000000; font-weight: bold;">/></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><updated<span style="color: #000000; font-weight: bold;">></span></span></span>2017-02-27T14:32:38Z<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></updated<span style="color: #000000; font-weight: bold;">></span></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><author<span style="color: #000000; font-weight: bold;">></span></span></span><br />                         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><name</span> <span style="color: #000000; font-weight: bold;">/></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></author<span style="color: #000000; font-weight: bold;">></span></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><link</span> <span style="color: #000066;">rel</span>=<span style="color: #ff0000;">"http://schemas.microsoft.com/ado/2007/08/dataservices/edit-media/Data"</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"application/octet-stream"</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">"Data"</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">"PropertyGalleryImageCollection(guid'cc758317-6214-4d84-ab95-0002e72a9411')/Data"</span> <span style="color: #000000; font-weight: bold;">/></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><content</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">"application/xml"</span><span style="color: #000000; font-weight: bold;">></span></span><br />                         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><m:properties<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Id</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>cc758317-6214-4d84-ab95-0002e72a9411<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Id<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Name<span style="color: #000000; font-weight: bold;">></span></span></span>IMG_8264_marged(14-05-2014).jpg<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Name<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:CreatedOn</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.DateTime"</span><span style="color: #000000; font-weight: bold;">></span></span>2015-12-16T15:47:39.2810926<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:CreatedOn<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:CreatedById</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>0a043409-0d95-4833-a11d-6b1d4e5ae568<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:CreatedById<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:ModifiedOn</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.DateTime"</span><span style="color: #000000; font-weight: bold;">></span></span>2015-12-16T15:47:39.2810926<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:ModifiedOn<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:ModifiedById</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>0a043409-0d95-4833-a11d-6b1d4e5ae568<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:ModifiedById<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:ProcessListeners</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Int32"</span><span style="color: #000000; font-weight: bold;">></span></span>0<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:ProcessListeners<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Notes</span><span style="color: #000000; font-weight: bold;">/></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:LockedById</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>00000000-0000-0000-0000-000000000000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:LockedById<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:LockedOn</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.DateTime"</span><span style="color: #000000; font-weight: bold;">></span></span>0001-01-01T00:00:00<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:LockedOn<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:TypeId</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>529bc2f8-0ee0-df11-971b-001d60e938c6<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:TypeId<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Version</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Int32"</span><span style="color: #000000; font-weight: bold;">></span></span>1<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Version<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Size</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Int32"</span><span style="color: #000000; font-weight: bold;">></span></span>6106506<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Size<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Position</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Int32"</span><span style="color: #000000; font-weight: bold;">></span></span>9<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:Position<span style="color: #000000; font-weight: bold;">></span></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:Link</span><span style="color: #000000; font-weight: bold;">/></span></span><br />                                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"><d:PropertyId</span> <span style="color: #000066;">m:type</span>=<span style="color: #ff0000;">"Edm.Guid"</span><span style="color: #000000; font-weight: bold;">></span></span>e70021e1-b7a2-4644-a121-7ca975b6bc73<span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></d:PropertyId<span style="color: #000000; font-weight: bold;">></span></span></span><br />                         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></m:properties<span style="color: #000000; font-weight: bold;">></span></span></span><br />                 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></content<span style="color: #000000; font-weight: bold;">></span></span></span><br />         <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></entry<span style="color: #000000; font-weight: bold;">></span></span></span><br /> <span style="color: #009900;"><span style="color: #000000; font-weight: bold;"></feed<span style="color: #000000; font-weight: bold;">></span></span></span></div></div></p> <p>Видно, что updated свежий, а ModifiedOn - нет.</p> <p>Фильтрация по ModifiedOn:<br /> <a href="https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=ModifiedOn%20gt%20datetime%272017-02-20%27" rel="nofollow" >https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=ModifiedOn%20gt%20datetime%272017-02-20%27</a><br /> При попытке изменения ModifiedOn на updated:<br /> <a href="https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=updated%20gt%20datetime%272017-02-20%27" rel="nofollow" >https://ordoag.bpmonline.com/0/ServiceModel/EntityDataService.svc/PropertyGalleryImageCollection?$top=1&$filter=updated%20gt%20datetime%272017-02-20%27</a></p> <p>Ошибка следующего содержания.<br /> No property 'updated' exists in type 'Terrasoft.Configuration.PropertyGalleryImage' at position 0.<br /> Вопрос следующий: как модифицировать запрос для выборки именно по дате обновления исходного объекта, а не самого файла изображения?</p>

Нравится

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 500
12 Cache-Control: no-cache
12 Content-Length: 724
12 Content-Type: application/xml;charset=utf-8
12 DataServiceVersion: 1.0;
12 Date: Mon, 06 Feb 2017 12:48:23 GMT
12 Server: Microsoft-IIS/8.5
12 Set-Cookie: BPMSESSIONID=0azjot4gqr0dqjmvcln4k0ri; path=/; HttpOnly
12 X-AspNet-Version: 4.0.30319
12 X-Content-Type-Options: nosniff
12 X-Frame-Options: SAMEORIGIN
12 X-Powered-By: ASP.NET
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

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

Подскажите пожалуйста, как можно реализовать передачу PDF документа в "файлы и примечания" раздела по протоколу OData с использованием Http-запросов?

Нравится

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

Добрый день.

Для хранения файлов и ссылок по каждому разделу есть отдельная таблица. Например, для раздела [Обращения] - это CaseFile.
Для загрузки файлов используется сервис FileApiService (метод Upload).
Пример вызова сервиса можно посмотреть на примере детали "Файлы и ссылки" (FileDetailV2).

Добрый день, спасибо за быстрый отклик.
Но как я понимаю FileApiService можно использовать для обработки события upload в самой crm. А задача состояла в обратном: на сайте генерируется pdf файл и необходимо его передать в карточку договора в файлы и примечания.
Разобралась как это сделать с помощью OData. Необходимо сначала создать файл, к примеру в ContractFileCollection, с помощью POST с привязкой к Id договора и с необходимым типом, а потом уже в созданный Id документа в /Data записывать необходимый файл с помощью запроса PUT с Content-Type: application/octet-stream.

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

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

// Создание сообщения xml, содержащего данные о создаваемом объекте.
var content = new XElement(dsmd + "properties",
new XElement(ds + "Contact", contactId),
new XElement(ds + "Subject", some),
new XElement(ds + "Symptoms", someone));
var entry = new XElement(atom + "entry",
new XElement(atom + "content",
new XAttribute("type", "application/xml"), content));
var request = (HttpWebRequest)HttpWebRequest.Create(serverUri + "ActivityCollection/");

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

Нравится

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

Здравствуйте, Михаил.

Скорей всего ошибка заключается в "Contact", попробуйте изменить данный текст на "ContactId". Так же рекомендую Вам ознакомиться с следующими темами:

http://www.community.terrasoft.ru/forum/topic/12218
http://www.community.terrasoft.ru/forum/topic/10486

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