Подскажите, как правильно добавить пользователя портала через Odata?

Я делаю так

SysAdminUnit() sau = new SysAdminUnit();
sau.LDAPEntry = stripedLogin;
sau.Name = stripedLogin;
sau.SynchronizeWithLDAP = true;
contextWin.AddToSysAdminUnitCollection(sau);
responces = contextWin.SaveChanges();

при сохранении получаю ошибку Forbidden

xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  >4>
  xml:lang="">Forbidden>
  >
    >Forbidden>
    >System.Data.Services.DataServiceException>
    >
      at System.Data.Services.Serializers.Deserializer.HandlePostRequest()
      at System.Data.Services.DataService`1.HandlePostOperation(RequestDescription description, IDataService dataService)
      at System.Data.Services.DataService`1.ProcessIncomingRequest(RequestDescription description, IDataService dataService)
      at System.Data.Services.DataService`1.HandleNonBatchRequest(RequestDescription description)
      at System.Data.Services.DataService`1.HandleRequest()
    >
  >
>

хотя, например, Контакты и другие объекты создаются через Odata "на ура".
К Odata подключаюсь как Supervisor

Нравится

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

упс, видимо нужно создавать не SysAdminUnit а SysSSPUser, но по-прежнему возвращается ошибка Forbidden

Здравствуйте, Леонид!
Дело в том, что при работе через OData на уровне ядра запрещен доступ к системным таблицам, поэтому создавать пользователей таким образом не представляется возможным.

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

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

Возникла проблема с добавлением записи по OData. Формирую xml запрос на Python следующего формата по аналогии с примером на C#

version='1.0' encoding='utf-8'?>
   >
        type='application/xml'>
           >
                                                           
                 >John>

>
>
>

Сервер возвращает сообщение об ошибке: Префикс atom не объявленный

Другие запросы на чтение и удаление работают

Нравится

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

Упс, сорри, вопрос снимается. Забыл неймспейсы добавить

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

Здравствуйте уважаемые разработчики!

Стоит задача интеграции BPMOnline 7 со сторонним приложением. Есть стандартный бизнес процесс. Необходимо, чтобы при добавлении записи из внешнего приложения запускался бизнес процесс, наступало следующее действие (формировалась задача менеджеру и т.д.). Каким образом это лучше реализовать?

1. Добавление записи через OData. Но в таком случае сработает ли начальное событие "Сигнал"?

2. Использование механизма ProcessEngineService?

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

Нравится

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

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

При работе с объектами через сервис OData все внутренние события и обработчики в процессах системы отрабатывают так же, если бы вы добавляли запись через интерфейс или с помощью импорта из excel.
Вы можете создать процесс с начальным событием "Сигнал", отрабатывающим на создание нового объекта в системе и добавить условия которым должен соответствовать вновь созданный объект.
Но в таком случае процесс будет запускаться автоматически для всех созданных объектов, не зависимо от того объект создан пользователем через интерфейс или создан запросом к OData с помощью стороннего приложения.

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

Спасибо, Игорь! Понятно.

И вопрос по ProcessEngineService. Можно ли задавать динамически приходящие параметры: например, в одном случае приходит 3 параметра, в другом 5?

Да, при запуске процесса через ProcessEngineService установка значений в параметры не обязательна.

Если значение не передано, параметр будет проинициализирован значением по умолчанию.

Если у процесса есть два параметра ParamA и ParamB.

Оба запроса создадут новый экземпляр процесса и запустят на выполнение:

http://demo.bpmonline.com/0/ServiceModel/ProcessEngineService.svc/My_Pr…
http://demo.bpmonline.com/0/ServiceModel/ProcessEngineService.svc/My_Pr…
При втором вызове ParamB будет равен пустой строке.

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

Пр.
/Execute?ParamA=Den&ResultParameterName=Param2

После завершения процесса в теле ответа будет лежать сериализированное значение параметра Param2

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

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

подскажите решение такой задачи.

Необходимо реализовать двухстороннюю интеграцию BPMOnline On-Site 7.0 с 1С 8.2:

1. При сохранении продажи в BPMOnline должен создаваться новый документ в 1С - заказ покупателя

2. При создании/сохранении в 1С документа Приходный кассовый ордер в BPMOnline должен изменяться статус продажи на "Завершена"

Какими средствами это лучше реализовать?

Насколько я понимаю 2 пункт реализуется с помощью oData методом PUT для изменения значения поля конкретной продажи.

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

Нравится

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

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

Все верно, второй пункт: запрос по Odata к BPM. Писать придется на 1С-языке.

Пример обращения к Odata из 1С

Site = "http://site:8081/WebApp/";//СокрЛП(Константа.BPMonline_Site);
DeletedEntityQueryTextTitle = "0/ServiceModel/EntityDataService.svc/DeletedEntityCollection?$select=";
DeletedEntityQueryText1 = "Id,ID1C,EntityUId,ModifiedOn,Date,DocumentDate,Entity,DocumentDate,AccountType/Id,AccountType/Name,DocumentType/Id,DocumentType/Name,Division/Id,Division/Code1C,Division/Name";
DeletedEntityQueryText2 = "&$expand=AccountType,DocumentType,Division";
DeletedEntityQueryTextConditions = "&$filter=(ModifiedOn gt datetime'" + ModifiedDateFrom + "' and Division/Code1C eq '"+ DivisionCode + "') ";
DeletedEntityRequestText = Site + DeletedEntityQueryTextTitle + DeletedEntityQueryText1 + DeletedEntityQueryText2 + DeletedEntityQueryTextConditions;
OdataRequest = PreapareRequestHeader(DeletedEntityRequestText);
OdataRequest.SetCredentials("O.Kotko", "O.Kotko", 0);
OdataRequest.Send();

Первый - вопрос достаточно сложный. Рекомендую ознакомиться с этой темой:

http://www.community.terrasoft.ru/forum/topic/9527

Дмитрий, спасибо за ответ!

Ознакомился с постом. Насколько я представляю (пока теоретически) создается на сервере 1С COM-объект со ссылкой на COM службу 1С. Далее через .NET Remoting BPMonline обращается к нему.

Для реализации этого в бизнес-процессе необходимо добавить компонент C# скрипта, где реализовать логику обращения и работы с методами?

Валентин, это как один из вариантов.

Есть более "удачный" что ли вариант, работая через веб-сервисы 1С (это если 8.2).

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

Подскажите, данный вариант (1c_and_bpm70.rar) подходит только для bpm7, т.е. его нельзя использовать для bpm5.4?

Нет, почему... Можно, конечно, и под 5.4 использовать. Но, разумеется, результатов гарантировать Вам не могу.
Интеграция по этой технологии разрабатывалась и появится именно в 7.х в скором времени.

"Олейник Дмитрий" написал:

Валентин, это как один из вариантов.

Есть более "удачный" что ли вариант, работая через веб-сервисы 1С (это если 8.2).

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

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

1c_and_bpm70.rar
1.19 Мб

С уважением,

Олейник Дмитрий


Добрый день!

А есть файл Requests.rtf?

Добрый день,

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

ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Справочник.Контрагенты.Изменения

где справочник.контрагенты - объект 1с, подключенный к плану обмена.

Спс, попробую.

Добрый день!

Не совсем понятно что в bpm'online (Версия 7.6.0.840) нужно добавить чтоб синхронизировать данные (например справочник контрагентов). Есть какое то видео или наглядный пример? Буду очень признателен.

Роман,

по 1C Connector как раз недавно выпустили статью и 2 обзорных видео.

Для включения функционала нужно накатить пакет поверх вашей системы. Скажите, у вас система OnSite или OnDemand?

Александр,
спасибо за очередную попытку впарить 1C Connector. Но скажите, пжл, как этот чудо продукт поможет мне использовать web сервисы сторонних разработчиков? Например, банальную загрузку курса валют. Или web сервис из этой статьи... Меня интересует информация как программиста, а не как пользователя.

Роман, базовая версия продукта 1C Connector абсолютно бесплатна и в скором времени будет включена во все базовые сборки bpm'online.
Изначально вопрос стоял, чтобы по событию в bpm'online вызывался web-сервис 1С, именно по такому принципу работает 1C Connector.

Если Вы хотите из кода 1С получить данные "web сервисов сторонних разработчиков", то не совсем понятно при чем тут bpm'online:smile:. Если все таки Вы хотите получить данные в код 1С из сервисов bpm'online, достаточно обратиться к сервисам bpm'online по протоколу OData, как указано в 1м комментарии к этому посту.
В приведенной Вами статье нет ни слова про синхронизацию, только про одностороннее получение данных в 1С из внешних сервисов. Кстати там в дисклеймере написано, что указанный код НЕ будет работать в последних версиях 1С.
Кстати, чтобы отправить какую то информацию из 1С в bpm'online, мы тоже не пишем код на 1С. Мы используем план обмена и обращения ИЗ bpm'online В 1C. Это отдельная тема, обещаю пост на эту тему до конца месяца:smile:

Александр, мне нужно в bpm'online использовать web сервисы. Все равно чьи, будто 1С или другой поставщик. По скольку я сам программист 1С, мне проще создать web сервис в ней. Не понятно как в bpm'online использовать эти сервисы. Например, в 1С есть WS-ссылки в которые позволяют подтянуть web-сервисы и работать с ними... Принцип работы через план обмена мне понятен...
Мне к концу месяца нужно увязать 1С и SharePoint с bpm'online, иначе смысла дальше не будет мне изучать... :-(

P.S. Где я могу получить 1C Connector?
Заранее благодарен.

Роман, теперь понял задачу.
Вам нужно:

  1. Создать бизнес-процесс и повесить его на сигнал, например так:
  2. Написать скрипт обращения к веб-сервисам так, как бы вы его писали на классическом C#

Приведу 2 примера скриптов:

  1. Отправка сообщения через сервис смс-рассылки по протоколу SMPP (код намерено упрощен, отсутствуют дополнительные проверки):
    SmppClient mmclient = new SmppClient();
    SmppConnectionProperties mmproperties;
    TextMessage msg = new TextMessage();
    mmproperties = mmclient.Properties;
     
    mmproperties.SystemID = "someClient";
    mmproperties.Password = "somePassword";
    mmproperties.Port = 4442;
    mmproperties.Host = "server1.smstraffic.ru";
     
    mmclient.Start();
     
    msg.DestinationAddress = "+79023218417";
    msg.SourceAddress = "PTSOFT";
    msg.Text = "Ваш номер телефона успешно зарегистрирован. Код подтверждения " + code;
    msg.RegisterDeliveryNotification = true;
     
    mmclient.SendMessage(msg);
  2. Обращение к сервисам 1С из того же 1C Connector:
    System.ServiceModel.EndpointAddress ep = new System.ServiceModel.EndpointAddress(settings.Integration.OneCServer);
    System.ServiceModel.BasicHttpBinding binding = new System.ServiceModel.BasicHttpBinding();
     
    binding.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly;
    binding.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Basic;
    binding.MaxReceivedMessageSize = 2147483647;
    syncClient = new SyncService.PT1CConnectorPortTypeClient(binding, ep);
    syncClient.ClientCredentials.UserName.UserName = settings.Integration.OneCUser;
    syncClient.ClientCredentials.UserName.Password = settings.Integration.OneCPassword;
    syncClient.Open();

По 1C Connector напишите мне пожалуйста на почту - svistunov@samarasoft.ru, я скину все материалы, дистрибутив и инструкцию по установке.

Вопрос может и простой, но ответа сам найти не могу, BPM 7.6, 1C 8.2, интеграция с СамараСофт, веб сервис IIS создан без файла 1cws, а для ссылки, мне сказали, он обязателен, на форумах пишут что в 8.2 его нет, как поступить?

Владимир, добрый день!
Все очень просто - следуете в точности шагам инструкции, настраиваете работоспособность коннектора в соответствии с пунктами руководства, а уже потом можете пытаться варьировать параметрами настройки на основе рекомендаций сторонних форумов и опыта в 1С.
На сколько я понимаю, у вас сейчас проблемы с пунктом 1.3.3 руководства (НАСТРОЙКА СВОЙСТВ WEB-СЕРВИСА)?
Я прошу вас проверить, что все предыдущие пункты вы выполнили без отклонений в точном соответствии с руководством и прислать свойства веб-сервиса. Согласно инструкции, они должны выглядеть именно так:

Здравствуйте, Александр
Вот так у меня выглядит 1С
http://joxi.ru/RmzqJgpUE3oRrO
вот так я обращаюсь к нему через браузер
http://joxi.ru/5md7PWjc9dEQr1
и вот что я вижу в интеграции bpm
http://joxi.ru/RmzqJgpUE38RrO
в чем все таки проблема?

Добрый день!

У меня то же самое выдало сообщения. Платформа 8.3. При подключении к web-сервисам из другой 1С все работает...

Здравствуйте, у меня нет другой 1С...

Владимир, Роман, возможно, Вам будет полезна данная статья http://www.community.terrasoft.ru/blogs/10766 где также рассматривается вопрос по работе РТ 1С коннектора http://www.community.terrasoft.ru/blogs/10766 или статья на sdk где рассматривается работа через вебсервисы http://academy.terrasoft.ru/documents/docs/technic/SDK/7.4.1/Integratio…

Коллеги,

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

  1. НЕ указывать пространство имен
  2. Указать имя сервиса, как в инструкции
  3. Обращаться к созданному сервису, а не к веб-интерфейсу 1С, это принципиально разные вещи
  4. Проверил, сейчас даже базовый сервис не доступен - http://joxi.ru/a2XQZgdiP8lWAg

Владимир, просьба - устраните пожалуйста отклонения 1-4 от инструкции и напишите мне, если проблема сохранилась. Если сохранилась - подключимся и сразу решим!

Здравствуйте, Александр, у Вас ошибочка вкралась, не http://srdv-venta-nt.ru/bpmconnector, а http://srdv.venta-nt.ru/bpmconnector

Инструкция гласит http://joxi.ru/8An6R0LS6307AO, у меня http://joxi.ru/RmzqJgpUE3oRrO, так указывать пространство имен или нет, имя сервиса указано, bpmconnector и есть созданный сервис, файла 1cws в версии 8.2 нет

Владимир,
*.1cws в 8.2 есть, это я вам ответственно заявляю:smile:

И даже на Вашей системе, вот правильная ссылка, которая сформирована Вашей 1C с учетом Ваших настроек - http://srdv.venta-nt.ru/bpmconnector/ws/bpmconnector.1cws

Пропишите пожалуйста именно этот адрес на стороне bpm'online и попробуйте подключиться под своими учетными данными.

Владимир, Добрый день!

Небольшая ремарка: как мы Вам писали, пространство имен должно быть PT1CConnector.

С уважением,
Зайчиков Илья

Александр, этот вариант уже пробовался неоднократно, http://joxi.ru/Q2KpPxJFZDLkAj

Вот такой результат без bpm, http://joxi.ru/1A5z79NuLebMrE

Интересует более детальное описание, как правильно прописывать путь к веб сервису.
Вот у меня версия BPM onsite sales 7.6 установлена на компьютере, 1С Предприятие 8.2, имя публикации веб-сервиса ws1.1cws. Это все на локальном компьютере. Вот адрес системы: http://localhost:81/0/Nui/ViewModule.aspx#IntroPage/OmnichannelIntro Тогда как мне нужно прописать веб-сервис в 1С коннекторе?

Добрый день, коллеги! Проблема Владимира была выявлена. Она заключалась в том, что в логине прописали некорректные данные. Вместо английской буквы "Си" была использована, видимо, русская "С". Поэтому возникали ошибки. Сейчас веб-сервис доступен.

С уважением,
Зайчиков Илья

Николай, правильно писать путь следующим образом:

Например:
сервер stnd-1c-05
имя публикации Russia76
имя файла ws76.1cws

Ссылка: http://stnd-1c-05/Russia76/ws/ws76.1cws

Т.е. http://имя_сервера/имя_публикации/ws/ws1.1cws

С уважением,
Зайчиков Илья

Не могу понять, что мне писать вместо сервера stnd-1c-05?

У меня 1С на локальном компе.
http://localhost/TradeEntrUkr/ws/ws1.1cws не подходит, http://192.168.1.105/TradeEntrUkr/ws/ws1.1cws тоже не подходит.
Пишет: Not Found
The requested URL /TradeEntrUkr/ws/ws1.1cws was not found on this server.

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

Анатолій, добрый день.

Я правильно понял, что Вы прошли все шаги инструкции по установки до публикации и настройки сервисов включительно и сервисы у вас опубликованы и доступны из браузера, но недоступны из 1C Connector?

Да, я все проделал по инструкции. Я не знаю как проверить доступны ли они из браузера, потому как не понимаю, какой сервер прописать. 1С у меня на компе. Публикацию и настройку сервисов проделал.

Анатолій, смело добавляйте меня в скайп - поможем:smile:
aleksandr.svistunov@hotmail.com

P.S.: скайп сегодня подташнивает, поэтому можете написать на почту svistunov@samarasoft.ru

Боюсь, что нахожусь уже в черном списке поддержки Самарасофт, поэтому спрошу здесь на виду общественности :smile:
7.6.0 sales + 1с 8.3
В рамках самообразования проделал все шаги мануала по настройке коробочной интеграции.
Сервис созданный вижу в браузере, ссылка получилась вида "http://192.168.40.174/InfoBase/ws/PT1CCONNECTOR.1cws" и работает в браузере (то есть вебсервис 1c виден и откликается).
Но вот при запуске интеграции из bpm штатной кнопкой в логе вот такой текст:

13-10-2015 01:08:59:: message: Start Sync
13-10-2015 01:08:59:: message: Start Sync 80bb62e8-dbbe-4df3-9f68-6f2360b25ed1
13-10-2015 01:08:59:: message: to 1C. 1C Table:Контрагенты
13-10-2015 01:08:59:: message: to 1C. 1C Table:Контрагенты bpm table: Account
13-10-2015 01:08:59:: message: ESQ. Get 47 records
13-10-2015 01:09:00:: message: Start Sync 234f8e3a-d3f0-43a4-904d-02ae9b5e4a9b
13-10-2015 01:09:00:: message: Integration in bpm
13-10-2015 01:09:00:: message: start in bpm
13-10-2015 01:09:00:: message: Контрагенты
13-10-2015 01:09:00:: message: syncPairs.Count: 2
13-10-2015 01:09:00:: message: Запрос HTTP не разрешен для схемы аутентификации клиента "Basic". От сервера получен заголовок аутентификации "Basic realm="1C:Enterprise 8.3"".
13-10-2015 01:09:00: Error: error in  on 1C -> bpm'online with таблица bpm'online Account, таблица 1С Контрагенты, Запрос HTTP не разрешен для схемы аутентификации клиента "Basic". От сервера получен заголовок аутентификации "Basic realm="1C:Enterprise 8.3"".
13-10-2015 01:09:00:: message: Integration in bpm end

Очень хочется получить подсказку, куда копать и где искать причины того, что созданный вебсервис 1с не может достучаться до развернутого локально под iis сайта (правильно понял я источник проблемы?) - что надо хитрого сделать с настройками iis или windows server 2008 r2 (где развернут сайт), чтобы наконец соединение прошло?
1c вместе с вебсервисом поднято на другой машине под Windows 7, локальная сеть одна, домена нет.

Здравствуйте, Александр!

Написал ответ в тот же день, как Вы написали данный запрос.
Поддержка Программных технологий никого не ставит в черный список:)

Здесь может быть несколько вариантов:

1. Могут быть неверными логин и пароль
2. Может быть не включена анонимная аутентификация на iis
3. Возможно какой-то пункт из инструкции был сделан неправильно(к сожалению, такое чаще всего происходит)

Для более оперативного общение можно писать мне напрямую в скайп: zaichikovilya_samarasoft

С уважением,
Зайчиков Илья
Менеджер продуктов
ООО «Программные Технологии»
Центр разработки и внедрения Террасофт Поволжье
Тел. +7 (846) 266-55-69
samarasoft.com

"Зайчиков Илья Алексеевич" написал:1. Могут быть неверными логин и пароль
2. Может быть не включена анонимная аутентификация на iis
3. Возможно какой-то пункт из инструкции был сделан неправильно(к сожалению, такое чаще всего происходит)

Добрый день, Илья!

1. Логин/пароль в bpmonline задаются в параметрах синхронизации - там логин/пароль 1с верный, а вот для bpm только логин - проверил, все заполнено корректно.
2. Включена на стороне iis с вебсервисом и на стороне bmponline. Удостоверение анонимного пользователя=указанный пользователь IUSR
3. Вот это самое сложное, хотя проверял шаги несколько раз. Кстати кнопка Проверить соединение в настройках интеграции также выдает ошибку.

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

Александр,

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

В котором часу Вы завтра можете предоставить нам доступ?

С уважением,
Зайчиков Илья
Менеджер продуктов
ООО «Программные Технологии»
Центр разработки и внедрения Террасофт Поволжье
Тел. +7 (846) 266-55-69
Сот. +7 (937) 076-12-84
samarasoft.com

Стучусь в скайп :)
Спасибо!

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

Начиная с версии 5.3, в BPMonline появилась возможность интеграции с другими приложениями через протокол OData (www.odata.org). Рассмотрим пример интеграции с использованием данного протокола, реализованный на Microsoft Visual Studio. В приведенных примерах некоторые проверки и обработка исключений были специально пропущены для улучшения наглядности кода.
Схема взаимодействия стороннего приложения с BPMonline через протокол OData изображена на рисунке:

screenshot

Создание WCF клиента

WCF клиент может быть создан путем генерации прокси с помощью Microsoft Visual Studio.
Щелкните правой клавишей мыши по проекту, в котором должна быть реализована интеграция, и выберите комадну «Add Service Reference…». В открывшемся диалоговом окне введите адрес веб-сервиса BPMonline и пространство имен, после чего нажмите на кнопку «Go». Вам будет предложено ввести имя пользователя BPMonline и пароль. Это нужно для того, чтобы подключиться к указанному сервису BPMonline. Полученные от сервиса метаданные будут использованы для генерации прокси-классов, необходимых для дальнейшей работы.

screenshot

После нажатия на кнопку «ОК» будут созданы прокси-классы. Вы сможете обращаться к ним, используя пространство имен BPMonlineServiceReference. Данное пространство имен необходимо включить в блок using. Сгенерированные классы находятся в файле Reference.cs, который Вы можете отобразить, выполнив команду «Show All Files» в меню «Project».

Подготовка

Добавьте необходимые директивы:

using System.Data.Services.Client;
using ODataTestClient.BPMonlineServiceReference;

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

имя сервера> + "/WebApp/0/ServiceModel/EntityDataService.svc/"

Рекомендуется объявить в коде соответствующую константу, например:

private static readonly Uri dataSeviceUri = new Uri("http://localhost:2376/WebApp/0/ServiceModel/EntityDataService.svc/");

Авторизация

Запросы к BPMonline должны быть авторизованы. BPMonline поддерживает basic аутентификацию. Самый простой способ авторизации при этом – передача учетных данных в соответствующее свойство экземпляра класса BPMonline.
Например:

var context = new BPMonline(dataSeviceUri);
context.Credentials = new NetworkCredential("UserName", "UserPassword");

Получение списка записей

Например, стороннему приложению необходимо получить список всех контактов из BPMonline. Записи возвращаются постранично, по 40 записей на страницу. Если предполагается, что запрос вернет больше 40 записей, необходимо обеспечить получение следующей страницы по достижении конца текущей.
Например:

var context = new BPMonline(dataSeviceUri);
context.Credentials = new NetworkCredential("UserName", "UserPassword");
var responce = (context.ContactCollection).Execute() as QueryOperationResponseContact>;
while (responce != null) {
        foreach (var entry in responce) {
                // выполнение операций с контактом
        }
        var continuationToken = responce.GetContinuation();
        responce = continuationToken != null ? context.Execute(continuationToken) : null;
}

В противном случае можно опустить получение ссылки на следующую порцию данных.

Создание записи

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

var contactId = Guid.NewGuid();
Contact contact = new Contact() {
        Id = contactId,
        Name = "John Smith",
};
Account account = new Account() {
        Id = Guid.NewGuid(),
        Name = "Company"
};
contact.Account = account;
var context = new BPMonline(dataSeviceUri);
context.AddToAccountCollection(account);
context.AddToContactCollection(contact);
context.SetLink(contact, "Account", account);
context.Credentials = new NetworkCredential("UserName", "UserPassword");
DataServiceResponse responces = context.SaveChanges(SaveChangesOptions.Batch);

Изменение записи

var context = new BPMonline(dataSeviceUri);
context.Credentials = new NetworkCredential("UserName", "UserPassword");
var updContact = context.ContactCollection.Where(c => c.Id == contact.Id).First();
updContact.Name = "Johny";
context.UpdateObject(updContact);
responces = context.SaveChanges(SaveChangesOptions.Batch);

Удаление записи

context = new BPMonline(dataSeviceUri);
context.Credentials = new NetworkCredential("UserName", "UserPassword");
var deleteContact = context.ContactCollection.Where(c => c.Id == contact.Id).First();
context.DeleteObject(deleteContact);
responces = context.SaveChanges(SaveChangesOptions.Batch);

Нравится

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

В случае если не удалось создать WCF клиент описанным в статье способом.
Заходим в браузере на ссылку:

<имя сервера> + "/0/ServiceModel/EntityDataService.svc/$metadata"

Видим примерно такую картину:

Сохраняем полученный xml документ на диске. Я у себя сохранил как C:\metadata.xml.
Далее следуем по пунктам указанным в статье. Когда доходим до открытого окна "Add Service Reference". Вместо ссылки на сервис в поле адреса вставляем путь к нашему файлу с добавлением префикса file://:

После чего нажмите на кнопку «Go» и следуйте дальнейшим инструкциям из статьи

Подскажите, что нужно вызвать чтоб получить права (уровень доступа) на каждую элемент коллекции, а ещё лучше до поля в каждом классе.

В конечном счёте мне нужно отфильтровать то, на что имеет права видеть пользователь...

Пример:

<collection href="ResourceFileInfoCollection">
<atom:title>ResourceFileInfoCollection</atom:title>
</collection>
<collection href="AccountCollection">
<atom:title>AccountCollection</atom:title>
</collection>
<collection href="EmployeeCollection">
<atom:title>EmployeeCollection</atom:title>
</collection>
<collection href="ContactCollection">
<atom:title>ContactCollection</atom:title>
</collection>
<collection href="ContactSalutationTypeCollection">
<atom:title>ContactSalutationTypeCollection</atom:title>
</collection>
<collection href="GenderCollection">
<atom:title>GenderCollection</atom:title>
</collection>
<collection href="ContactDecisionRoleCollection">
<atom:title>ContactDecisionRoleCollection</atom:title>
</collection>

У сервиса OData нет отдельного администрирования.
Все объекты, поля объектов и записи полностью администрируются стандартными средствами BPMonline.

Это означает что пользователь будет иметь возможность получить через OData все то же, что он может увидеть в интерфейсе системы.

За более детальной информацией по настройке прав в BPMonline, пожалуйста, обратитесь в тех. поддержку.

Игорь, а как на счёт такой вещи как - поле доступно для просмотра но нет возможности к редактированию? Чем веб-сервис может мне помочь в этом?

Это тоже решается правами на колонку или запись в целом.
Есть три уровня прав на каждую операцию (чтение, редактирование и удаление).
Каждую из операций можно запретить, разрешить и разрешить с правом делегирования.

Если при переходе по ссылке ".../0/ServiceModel"
появляется сообщение HTTP Error 403.14 - Forbidden

Убедитесь что у вас в системе BPMonline есть настройка Прав доступа к операциям
CanUseODataService / Доступ к OData

День добрый.
А как провести каскадное чтение данных.
Например, согласно коду получаю список заказов

bpm = new BPMonline(new Uri(_server));
bpm.Credentials = new NetworkCredential(_user, _password);
var responce = (bpm.OrderCollection).Execute() as QueryOperationResponse;
while (responce != null)
{
foreach (var order in responce)
{
list.Add(order);
}
var continuationToken = responce.GetContinuation();
responce = continuationToken != null ? bpm.Execute(continuationToken) : null;
}

Но все дочерние элементы равны null

order.Account = null
order.Owner = null
order.Contact = null
order.Status = null
Хотя они заполнены.

Может для каждого дочернего элемента надо отдельно догружать данные?

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

Начиная с версии 5.3, в BPMonline появилась возможность интеграции с другими приложениями через протокол OData (www.odata.org). Это дает возможность стороннему приложению, написанному на любом языке программирования, посылать HTTP-запросы к BPMonline и получать ответы в форматах XML, Atom или JSON .

Подготовка

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

имя сервера> + "/WebApp/0/ServiceModel/EntityDataService.svc/"

Рекомендуется объявить в коде соответствующую константу, например:

private const string serverUri = "https://mysite.com.ua/WebApp/0/ServiceModel/EntityDataService.svc/";

Также, поскольку по умолчанию ответ формируется в формате Atom, для обработки ответа используются следующие константы:

private static readonly XNamespace ds = "http://schemas.microsoft.com/ado/2007/08/dataservices";
private static readonly XNamespace dsmd = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";
private static readonly XNamespace atom = "http://www.w3.org/2005/Atom";

Авторизация

Запросы к BPMonline должны быть авторизованы. BPMonline поддерживает basic аутентификацию. Самый простой способ авторизации при этом – передача учетных данных в заголовке запроса.
Например:

var request = (HttpWebRequest)HttpWebRequest.Create(serverUri);
request.Credentials = new NetworkCredential("UserName", "UserPassword");

Каждый запрос к сервису должен содержать эту информацию.
Обратите внимание: имя пользователя и пароль передаются в открытом виде.
Указанный способ авторизации рекомендуется только в случае использования SSL шифрования (https).

Получение списка записей

Для получения набора записей используется HTTP метод GET. Записи возвращаются постранично, по 40 записей на страницу. Если предполагается, что запрос вернет больше 40 записей, необходимо обеспечить получение следующей страницы по достижении конца текущей.
Например:

string requestUri = serverUri + "ContactCollection?$select=Id,Name";
while (!string.IsNullOrEmpty(requestUri)) {
var request = HttpWebRequest.Create(requestUri) as HttpWebRequest;
request.Method = "GET";
request.Credentials = new NetworkCredential("UserName", "UserPassword");
using (var responce = request.GetResponse()) {
XDocument xmlDoc = XDocument.Load(responce.GetResponseStream());
var entries = 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
};
requestUri = (from link in xmlDoc.Descendants(atom + "link")
where link.FirstAttribute.Value == "next"
select link.FirstAttribute.NextAttribute.Value).FirstOrDefault();
foreach (var contact in entries) {
//выполнение операций с контактом
}
}
}

В противном случае можно опустить получение ссылки на следующую порцию данных.
Если же необходимо одним запросом получить более чем 40 записей, требуемое количество записей можно указать при помощи параметра $top.
Например:

string requestUri = serverUri + "ContactCollection?$select=Id,Name&$top=60";

Создание записи

Для создания записи используется HTTP метод POST. Необходимо сформировать тело запроса согласно формату XML, Atom или JSON таким образом, чтобы он содержал все необходимые поля записи.
Например:

var content = new XElement(dsmd + "properties",
        new XElement(ds + "Name", "John Smith"),
        new XElement(ds + "Dear", "Johny"));
var entry = new XElement(atom + "entry",
new XElement(atom + "content",
        new XAttribute("type", "application/xml"),
        content));
var request =
        (HttpWebRequest)HttpWebRequest.Create(serverUri + "ContactCollection/");
request.Credentials = new NetworkCredential("UserName", "UserPassword");
request.Method = "POST";
request.Accept = "application/atom+xml";
request.ContentType = "application/atom+xml;type=entry";
using (var writer = XmlWriter.Create(request.GetRequestStream())) {
        entry.WriteTo(writer);
}
using (WebResponse response = request.GetResponse()) {
if (((HttpWebResponse)response).StatusCode == HttpStatusCode.Created) {
// response.Headers["Location"]; ссылка на адрес созданной записи
}
}

Изменение записи

Для изменения записи используется HTTP метод PUT. В запросе указываются новые значения полей, которые нужно изменить.
Например:

string contactId = ""; // Id записи, которую нужно изменить
var content = new XElement(dsmd + "properties",
        new XElement(ds + "Name", "Smith")
);
var entry = new XElement(atom + "entry",
        new XElement(atom + "content",
                new XAttribute("type", "application/xml"),
                content)
        );
var request = (HttpWebRequest)HttpWebRequest.Create(serverUri
        + "ContactCollection(guid'" + contactId + "')");
request.Credentials = new NetworkCredential("UserName", "UserPassword");
request.Method = "PUT";
request.Accept = "application/atom+xml";
request.ContentType = "application/atom+xml;type=entry";
using (var writer = XmlWriter.Create(request.GetRequestStream())) {
        entry.WriteTo(writer);
}
using (WebResponse response = request.GetResponse()) {
}

Удаление записи

Для удаления записи используется HTTP метод DELETE.
Например:

string contactId = ""; // Id записи, которую нужно удалить
var request = (HttpWebRequest)HttpWebRequest.Create(serverUri
        + "ContactCollection(guid'" + contactId + "')");
request.Credentials = new NetworkCredential("UserName", "UserPassword");
request.Method = "DELETE";
using (WebResponse response = request.GetResponse()) {
}

Нравится

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

А можно добавить пример заполнение "лукапных" полей?

Здравствуйте! Передо мной стоит задача передавать заявки с сайта в Bpmonline. При этом сайт находится на стороннем хосте, а Bpmonline - на корпоративном, связь с ним осуществляется через VPN. Как осуществить эту связь, ведь от стороннего хоста мы не можем потребовать включения VPN?

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