Вопрос

Я не могу найти где можно увидеть список файлов к Обращению.
Само обращение отображается по запросу 
***bpmonline.com/0/ServiceModel/EntityDataService.svc/CaseCollection(guid'ae67f3b8-c319-4a59-9d97-f8585f6b3d33')
Но внутри него я не могу найти список прикрепленный файлов.

Вопрос.

Где искать ? 

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

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

Для каждой детали используется свой адрес в OData. Файлы обращения, соответственно, будут: ***bpmonline.com/0/ServiceModel/EntityDataService.svc/CaseFileCollection/. Там можно посмотреть Id файлов и связи с обращениями. А непосредственно скачивание производить в FileService.

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

Нет ли другого метода ? Т.е. сделать какой-то запрос чтоб по ид обращения он выдал мне список файлов которые есть в данном обращении ? 

Конечно, все качать не надо. Можно наложить фильтр по полю связи с обращением. См. примеры тут.

не хватило разума мне понять.
view-source:https://*****.bpmonline.com/0/ServiceModel/EntityDataService.svc/CaseFileCollection?$filter=Name eq 'WhatsApp Image 2018-01-16 at 14.15.07 (1).jpeg'
По такому запросу ответ отдает верный.

view-source:https://*****.bpmonline.com/0/ServiceModel/EntityDataService.svc/CaseFileCollection?$filter=CaseId eq guid'829a0b1a-650b-4844-b664-59053f9434ad'
По этому запросу отдает Элемент коллекции с именем CaseId не найден

Что он от меня хочет ? 

CaseFileCollection?$filter=Case/Id eq guid'829a0b1a-650b-4844-b664-59053f9434ad'

 

Спасибо!
Никогда б не догадался. Ниже привожу рабочий пример.
https://*.bpmonline.com/0/ServiceModel/EntityDataService.svc/CaseFileCollection?$filter=Case/Id eq guid'1f779f3d-60b4-4a2c-a4b4-43e2cf89d8f0'

ссылку выше про  FileService. Я почитал. Но результата опять нет. 
 

http://адрес_сайта/0/rest/FileService/GetFile/e9eafee9-c4e4-4793-ad0a-003bd2c6a9b4/935b6ecb-3509-4c8a-bc7e-03ab0661da24

Тут первый GUID — ID схемы ContactFile (видно в URL, если её открыть в дизайнере), второй — ID записи в таблице.

Я думал что по этому запросу https://*.bpmonline.com/0/ServiceModel/EntityDataService.svc/CaseFileCollection?$filter=Case/Id eq guid'1f779f3d-60b4-4a2c-a4b4-43e2cf89d8f0'
я узнаю ид файла. Но нет. Ид тут другой. И ID схемы CaseFileCollection Тоже у меня нет.
Вопрос. 
Где я должен получить эти ИД ? 

По ссылке написано всё верно. Первый Id — для схемы CaseFile посмотрите в дизайнере. Второй — Id нужной записи в этой таблице, которую Вы получите по результату CaseFileCollection.

Да, все верно. Я не туда смотрел. Спасибо.

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

Добрый день Уважаемые!

Есть необходимость через веб приложение посредством протокола OData создавать (обновлять) объекты. Проблема в следующем:

После успешной аутентификации через (Supervisor) http://servername/ServiceModel/AuthService.svc/Login и получения необходимых куки отправляю на

http://servername/0/ServiceModel/EntityDataService.svc/AccountCollection

POST запросом  json объект. В приложении использую Apache-HttpClient/4.5.6.

Ответ сервера

<code>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
<title>403 - Запрещено: Доступ запрещен.</title>
<style type="text/css">
</style>
</head>
<body>
<div id="header"><h1>Ошибка сервера</h1></div>
<div id="content">
 <div class="content-container"><fieldset>
  <h2>403 - запрещено. Доступ запрещен.</h2>
  <h3>Предоставленные учетные данные не дают права на просмотр этого каталога или страницы.</h3>
 </fieldset></div>
</div>
</body>
</html>

</code>

При этом, если отправлять PUT  запрос на обновление существующего объекта - все работает. GET запросы тоже работают корректно.

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

Заранее благодарен.

 

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

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

Данил, проверь что в запрос добавления данных добавляется параметр BPMCSRF из запроса авторизации

Также должен быть настроен доступ к объекту для внешних сервисов

Wireshark подтвердил наличие всех необходимых куки. Настроил доступ к объекту для внешних сервисов и проверил доступ к операциям OData. Ничего не помогает.

Создал нового пользователя. Под новым пользователем смог получить  (get) данные только после внесения в группу SystemAdministartors. Post запросы - та же ошибка.

Такое может быть, если что-то неправильно в заголовках POST-запроса.

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

 Вручную устанавливаю только:

Content-Type = "application/json"

Accept = "application/json;odata=verbose"

Остальные устанавливаются автоматически при аутентификации. Пробовал двумя способами 1) Apache-HttpClient/4.5.6  и  2) RESTClient браузер Firefox - результат тот же.

Например, не передались обе куки, обычная авторизационная и BPMCSRF.

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

curl запросы

1) Аутентификация внешних запросов к bpm'online, запись куку в файл

curl -i -X POST -H "Content-Type: application/json" -d "{\"UserName\":\"Supervisor\", \"UserPassword\":\"Secret\"}" -c "D:\cookie.txt" "http://myserver.com/ServiceModel/AuthService.svc/Login"

Успешно.

2) Проверка аутентификации и правильности куки - запрос на изменение колонки Name объекста Account. Используем файл куки созданный предыдущим запросом

curl -i -X PUT -H "Content-Type: application/json;odata=verbose" -H "Accept: application/json;odata=verbose" -d "{\"Name\":\"Our company_test\"}" -b "D:\cookie.txt" -c "D:\cookie.txt" "http://myserver.com/0/ServiceModel/EntityDataService.svc/AccountCollection(guid'E308B781-3C5B-4ECB-89EF-5C1ED4DA488E')"

Успешно.

3) Запрос на создание объекта BankAccount

curl -i -X POST -H "Content-Type: application/json" -H "Accept: application/json;odata=verbose" -b "D:\cookie.txt" -c "D:\cookie.txt" -d "{\"Id\":\"8080EDFF-9858-5D90-E053-2413A8C0E8DE\", \"CreatedOn\":\"Jan 29, 2019 9:50:25 AM\", \"CreatedById\":\"410006E1-CA4E-4502-A9EC-E54D922D2C00\", \"BankAccountNumber\":\"123456\"}" "http://myserver.com/0/ServiceModel/EntityDataService.svc/BankAccountCollection"

Ответ - ошибка 403 из вопроса.

Куки из файла

BPMLOADER    acth1svm4chyo1kde1tyhabi

.ASPXAUTH    F87665E30ADF2706A530B217A9EEBD49F7970A16EE377079185607C2675CDEE780E8CEF53C210C88579B063BA610E934AA43B9BC9995684C9BE83B3DCF65DEF3F8396A000BAE95E4EAB56B10C83BAEC684CDCA449499B5B98109C4281A07D3AC55DC9CE553850D8C5F0145C2B5E93661FB1DB3CDFDD5390C7B52955F365F0C86FBAE51F5AE6800B74F59DEB8984F38EFB1FB60EE9571CE7BAC926E838E8D3BDA6EB756270AAF1DD747094A62A68EA6B0E300216C474299FBF7BDD2C5AC86CCBC020BE29D480523ECDEE2F7E15A3E46FA7AD588401C8D37CB25E409975C755B63F5FD49989A5EFBBA3DA95590F325876DB911845D2A81DBE30B98A36CC4BEC373DC1C746C7D8EE7AE62658F60FD013C66A5F67023E0FCE30F15296A1686F9A74D01133441519B3EA7A5A3FBD62BBFC757665AE769CF0260E5E20EB963DD3BD3D9EBB47206A9B9B1B44E8D53048EA12B402290512509EC00733232B9DFEBB7DD2D2643E78A

BPMCSRF    u2jumlmWDoKSYOpQwfgJjO

UserName    83|117|112|101|114|118|105|115|111|114

BPMSESSIONID    4zcngupbd5iwesppbeux5mrr

Это два разных объекта, Account и BankAccount. Возможно, Вы разрешили всё по одному, а пытаетесь добавлять в другой.

Нет, пример с BankAccount привел из-за соображений компактности. Все доступы к объектам для внешних сервисов настроены. Пробовал Account, Contract, BankAccount  и Activity из примера академии(https://academy.terrasoft.ru/documents/technic-sdk/7-13/vypolnenie-zapr…) Результат тот же.

BPMCSRF нужно передавать не только в куках, а и отдельным заголовком. См. статью по отправке запросов из фиддлера.

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

 Спасибо БОЛЬШОЕ! После добавления BPMCSF в хэдэр - все получилось.

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

Шаги воспроизведения:
Сайт клиента:
Версия: 7.12 Service Ent
 
Коллеги, требуется помощь.
По штатному функционалу https://academy.terrasoft.ru/documents/technic-sdk/7-13/rabota-s-obekta….
При добавлении пользователя в коллекцию SysAdminUnitCollection при сохранении вылетает ошибка, хотя при создании, например Контактов - всё ОК:

<?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="">Forbidden</message><innererror><message>Forbidden</message><type>System.Data.Services.DataServiceException</type><stacktrace>   at System.Data.Services.DataServiceConfiguration.CheckResourceRights(ResourceSetWrapper container, EntitySetRights requiredRights)&#xD;
   at System.Data.Services.Serializers.Deserializer.HandlePostRequest()&#xD;
   at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)&#xD;
   at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)&#xD;
   at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)&#xD;
   at System.Data.Services.DataService`1.HandleRequest()</stacktrace></innererror></error>

Авторизуюсь в сервисе под Supervisor.
Доступ к операциям и Доступ к объекту для внешних сервисов добавлен для SysAdminUnit на чтение, добавление, удаление, изменение.

Заранее благодарен за помощь.

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

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

В коде веб-сервиса жёстко зашиты права только для чтения, если схема начинается на «Sys» или «VwSys» (с небольшим списком исключений).

Значит, добавление по OData для этой таблицы применять нельзя.

Спасибо за информацию!

Ну и дела!

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

Всем доброго времени суток.

Было бы замечательным реализовать определение откуда "пришло" действие из СРМ или же осуществили добавление/изменение/удаление через API.
Например некий маркер IsFromAPI = true/false
Это касается интеграции по протоколу OData.

Обсуждение
1 комментарий

А зачем плодить сущности?

Можно добавить в объект обычное логическое поле IsFromAPI и при записи в объект по OData писать туда true.

Можно завести отдельного пользователя только для интеграций и работать по OData под ним. Тогда всё будет видно в полях «создал» и «изменил».

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

Подскажите пожалуйста, в каком формате содержится фильтр в поле 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) {
// Выполнение действий с контактами.
}
}
}

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