Вопрос

Доброго дня, коллеги!

Стоит следующая задача - необходимо считать и отправить данные из объекта на удаленный веб-сервис. Удаленный веб-сервис принимает данные в формате XML. Подскажите пожалуйста, каким образом лучше всего это реализовать - используя бизнес-процессы, DataService или каким-либо другим способом? Заранее благодарю за развернутые ответы. 

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

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

Добрый день!
Бизнес процесс, в котором скрипт С# с использованием HttpWebRequest.
Пример:

var request = (HttpWebRequest)WebRequest.Create(serviceAddress);
request.Method = "POST";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
request.Timeout = timeout * 1000;
using (var dataStream = request.GetRequestStream())
{
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();
}
var resp = (HttpWebResponse)request.GetResponse();

Где postData - строка XML

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

Пытаюсь обновить запись из внешнего приложения через сабж (0/dataservice/json/reply/UpdateQuery).

Формирую JSON

{
  "rootSchemaName": "UsrPrintTemplates",
  "operationType": 2,
  "filters": {
    "RootSchemaName": "UsrPrintTemplates",
    "logicalOperation": 0,
    "isEnabled": true,
    "filterType": 1,
    "ComparisonType": 3,
    "leftExpression": {
      "expressionType": 0,
      "columnPath": "UsrBitrixId"
    },
    "rightExpression": {
      "expressionType": 2,
      "parameter": {
        "dataValueType": 4,
        "value": 2098527
      }
    }
  },
  "columnValues": {
    "items": {
      "Name": {
        "expressionType": 2,
        "parameter": {
          "dataValueType": 1,
          "value": "Акт"
        }
      },
      "UsrFileType": {
        "expressionType": 2,
        "parameter": {
          "dataValueType": 0,
          "value": "dce4c8c1-4784-475e-8fac-7c244053095c"
        }
      }
    }
  },
  "isForceUpdate": false
}

Изображение удалено.Изображение удалено.

но у меня почему-то обновляются все записи в таблице, т.е. фильтр не отрабатывает.

Как мне его записать, чтобы обновилась 1 запись, в которой поле UsrBitrixId = 2098527 ?

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

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

Если есть доступ к базе, посмотрите в SQL-профайлере, что за запрос получается, с каким фильтром. Возможно, дело в неверно указанном типе для колонки UsrBitrixId.

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

Здравствуйте! Может мне кто-то подскажет как делать запрос в DataService, и получать данные, например справочника, с учетом локализации.
Делаю аутентификацию:

{
  "UserName": "Supervisor",
  "UserPassword": "Supervisor"
}

И делаю например запрос справочника
 

{
	"RootSchemaName":"CaseCategory",
	"OperationType":0,
	"AllColumns":true
}

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

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

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

Добрый вечер!

Локализируемые значения хранятся в таблицах с таким названием Sys + [Название основной таблицы] + Lcz, то есть в Вашем случае нужные Вам значения хранятся в таблице SysCaseCategoryLcz.

Алла Савельева,

Я это прекрасно понимаю, но такое себе, когда тебе нужно достать значения справочника, ещё и в таблицу Lcz лезть, проверять там значения нужной тебе локализации. Думал может есть какой-то параметр, при запросе через DataService, который сразу выдаст с локализацией.

Дульский Александр пишет:
Думал может есть какой-то параметр, при запросе через DataService, который сразу выдаст с локализацией.

Да, было бы отлично)))

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

Алла Савельева,

Да, кстати, DataService походу не видит таблицу SysCaseCategoryLcz, т.к. выдает что 

"Элемент с именем \"SysCaseCategoryLcz\" не найден". Получается локализируемые строки никак не взять.

Дульский Александр,

Точно - она же системная, но можно на основании таблицы 'SysCaseCategoryLcz' создать представление и к нему обращаться для получения нужной информации.

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

Добрый день!
Добавьте в запрос признак "UseLocalization": true
Пример:

{
	"RootSchemaName":"CommunicationType",
	"OperationType":0,
	"AllColumns":true,
    "UseLocalization": true
}

 

Сидоров Александр В.,

Спасибо огромное!

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

Добрый день, может кто-нибудь подскажет, в каком формате правильно передавать данные в DataService, для поля с типом varbinary(max), т.е. байты файла. Сейчас при попытке создания записи детали файлы и ссылки, возникает след. ошибка: 'Ссылка на объект не указывает на экземпляр объекта'.

                  "Items": {
                        "Name": {
                            "ExpressionType": 2,
                            "Parameter": {
                                "DataValueType": 1,
                                "Value": "test.doc"
                            }
                        },
                        "Data": {
                            "ExpressionType": 2,
                            "Parameter": {
                                "DataValueType": 13,
                                "Value":   base64.encodebytes(fi).decode('ascii')
                            }
                        }
                    }

или так 

                  "Items": {
                        "Name": {
                            "ExpressionType": 2,
                            "Parameter": {
                                "DataValueType": 1,
                                "Value": "test.doc"
                            }
                        },
                        "Data": {
                            "ExpressionType": 2,
                            "Parameter": {
                                "DataValueType": 13,
                                "Value": 0x504B030414000600080000002100DFA4D26C...
                            }
                        }
                    }

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

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

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

Я думаю что DataService не работает с varbinary(max), посмотрите как реализована загрузка и скачивание файлов на детали [Файлы и ссылки].

В догонку в документации, указано что

контакт UploadFile - Класс выгрузки файла. Не рекомендуется использовать.

Для работы с файлами используется не DataService, а FileService и FileApiService. Вот пример скачивания, а вот — загрузки.

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

Добрый день!

есть ли возможность обратиться к BpmOnline из клиентской части стороннего приложения?

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

можно ли вызвать DataService из js стороннего приложения?

если можно, то где можно посмотреть примеры

если я правильно понимаю, то можно работать при помощи oData из js стороннего приложения, но примеров тоже не нашла. 

 

 

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

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

Добрый день

Из клиентского приложения можно легко работать с DataService. Для этого нужно:

1. Авторизоваться в bpmonline

2. Отправлять данные

Здесь есть описание по авторизации https://academy.terrasoft.ua/documents/technic-sdk/7-12/integraciya-s-sistemoy-i-vneshniy-api

С клиентской стороны вы можете организовать "общение" c помощью ajax или XmlHttpRequest

Так как это будут кросс-доменные запросы, то вам нужно это учитывать

https://www.html5rocks.com/en/tutorials/cors/

https://stackoverflow.com/questions/298745/how-do-i-send-a-cross-domain-post-request-via-javascript

год назад писали, что это невозможно
https://community.terrasoft.ru/questions/cors-i-avtorizacia-iz-klientsk…
получается, теперь эта возможность доступна?
у вас нет примера подключения, пока возникают сложности с подключением

Коллеги, кто сталкивался с подобной проблемой?

В конфиг сайта добавил <httpProtocol>
      <customHeaders>
        <add name="X-Frame-Options" value="SAMEORIGIN" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
<add name="Access-Control-Allow-Headers" value="X-PINGOTHER, Origin, Cache-Control, Content-Type, Authorization, X-Requested-With, Accept" />
      </customHeaders>
    </httpProtocol>

 

С помощью JS отправляю запрос

$.ajax({
   url: serviceUrl + 'ContactCollection',
   headers: {
      'Content-Type': 'application/json;odata=verbose',
      'Authorization': 'Basic ' + btoa('Юзер:Пароль')
   },
   dataType: "json",
   data:  JSON.stringify({"Name": "123"}),
   method: 'POST'
});

Возвращается 401 ошибка, права Юзер в права доступ на операции к OData предоставил, в объекте Contact к OData также дал. Запросы кросс-доменные. в чем проблема?

Евгений Волоцкой,

Евгений, если зайти под пользователем в систему, он может перейти в раздел контакты? 

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

Подозреваю что должно выглядеть это как то так, но не получается:

 

$url = 'https://MYSITE.bpmonline.com/0/DataService/json/reply/UpdateQuery';

                $arr = [
                    'RootSchemaName' => "Contact",
                    'OperationType' => "Delete",
                    'ColumnValues' => [
                        'Items' => [
                            'Skype' => [
                                'ExpressionType' => 'Parameter',
                                'Parameter' => [
                                    'DataValueType' => 'Text',
                                    'Value' => 'skype_login_4'
                                ]
                            ]                
                        ]
                    ],
                    'Filters' => [
                        'RootSchemaName' => 'Contact',
                        'FilterType' => 'FilterGroup',
                        'Items' => [
                                'FilterByUsrMainMail' => [
                                    'FilterType' => 'CompareFilter',
                                    'ComparisonType' => 'Equal',
                                    'LeftExpression' => [
                                        'ExpressionType' => 'SchemaColumn',
                                        'ColumnPath' => 'UsrMainMail'
                                    ],
                                    'RightExpression' => [
                                        'ExpressionType' => 'Parameter',
                                        'Parameter' => [
                                            'DataValueType' => 'Text',
                                            'Value' => contactemail@example.com
                                        ]
                                    ]
                                ]
                        ]
                    ]
                ];

$this->crm_curl($url, $arr, 10);

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

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

Добрый день.

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

{
   "QueryType":2,
   "Filters":{
      "FilterType":6,
      "ComparisonType":0,
      "Items":{
         "FilterByName":{
            "FilterType":1,
            "ComparisonType":3,
            "LogicalOperation":0,
            "LeftExpression":{
               "ExpressionType":0,
               "ColumnPath":"Number",
            },
            "RightExpression":{
               "ExpressionType":2,
               "Parameter":{
                  "DataValueType":1,
                  "Value":"Skup4",
               },
            },
         }
      },
   },
   "RootSchemaName":"ContactCommunication",
   "OperationType":0
}

удалит скайп "Skup4". И не забывайте про куки, и заголовки, более подробно на академии (запрос изменится для DataService) https://academy.terrasoft.ua/documents/technic-sdk/7-12/vypolnenie-zapr…

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

В CRM есть возможность в "Средствах связи" добавлять любое количество полей с одним названием. Например можно добавить сколько угодно Email. Может кто-нибудь знает как при создании Контакта добавить несколько Email?

Вот что я передаю:

            $arr = [
                'RootSchemaName' => "Contact",
                'OperationType' => "Insert",
                'ColumnValues' => [
                    'Items' => [
                        'Name' => [
                            'ExpressionType' => 'Parameter',
                            'Parameter' => [
                                'DataValueType' => 'Text',
                                'Value' => $Name
                            ]
                        ],
                        'UsrMainMail' => [
                            'ExpressionType' => 'Parameter',
                            'Parameter' => [
                                'DataValueType' => 'Text',
                                'Value' => $UsrMainMail
                            ]
                        ],
                        'Gender' => [
                            'ExpressionType' => 'Parameter',
                            'Parameter' => [
                                'DataValueType' => 'Guid',
                                'Value' => $Gender
                            ]
                        ],
                        'Skype' => [
                            'ExpressionType' => 'Parameter',
                            'Parameter' => [
                                'DataValueType' => 'Text',
                                'Value' => $Skype
                            ]
                        ],        
                        'MobilePhone' => [
                            'ExpressionType' => 'Parameter',
                            'Parameter' => [
                                'DataValueType' => 'Text',
                                'Value' => $MobilePhone
                            ]
                        ],        
                        'Phone' => [
                            'ExpressionType' => 'Parameter',
                            'Parameter' => [
                                'DataValueType' => 'Text',
                                'Value' => $Phone
                            ]
                        ],
                        'Email' => [
                            'ExpressionType' => 'Parameter',
                            'Parameter' => [
                                'DataValueType' => 'Text',
                                'Value' => $Email
                            ]                        
                        ],                    
                    ]
                ]
            ];        

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

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

mlmvn

Деталь "Средства связи" на странице контакта = Объект "Средство связи контакта" = Таблица "ContactCommunication".

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

Толмачев Дмитрий Юрьевич,

Спасибо!!

 

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

При обновлении до 7.11.2 отвалился DataService. Ничего не поменялось в коде внешнего приложения, всё соответствует документации. Авторизация проходит нормально, но 

https://my.site/0/dataservice/json/reply/InsertQuery - выдает 403-ю ошибку Forbidden.

Подскажите, куда копать?

 

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

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

Добрый день, Алексей!

Проверьте Web.config, а именно значение атрибута UseCsrfToken (https://academy.terrasoft.ru/documents/technic-sdk/7-10/zashchita-ot-csrf-atak-pri-integracii-c-bpmonline), если указано значение true, тогда стоит обратить внимание на формирование хедера запроса.

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

 

Tsopa,Спасибо. Отключил этот флаг и всё снова работает!

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

Добрый день!

В рамках интеграции сайта клиента с bpm`online появилась необходимость добавлять с сайта файлы на деталь "Файлы и ссылки" обращения. Для этого был написал веб-сервис для добавления файла, так выглядит метод добавления:

 [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
      public string InserCaseFile(CaseFileData data)
    {
      try
      {
        var appConnection = HttpContext.Current.Application["AppConnection"] as AppConnection;
        var userConnection = HttpContext.Current.Session["UserConnection"] as UserConnection;
        var caseFile = new Terrasoft.Configuration.CaseFile(userConnection);
 
    //    byte[] bytes = Convert.FromBase64String(data.File);
     ASCIIEncoding ascii = new ASCIIEncoding();
    var t = ascii.GetBytes(data.File);
	Stream stream = new MemoryStream(t);
 
          var id = Guid.NewGuid();
          caseFile.SetDefColumnValues();
           caseFile.Id = id;
           caseFile.Name = data.Name;
           caseFile.Size = (int)stream.Length;
           caseFile.SetStreamValue("Data", stream);
           caseFile.CaseId = new Guid(data.CaseId);
          caseFile.Save();
          return "Ok";
      }
      catch(Exception er)
      {
        return er.ToString();
      }
 
    }

Для тестирования с помощью SelectQuery веб-службы DataService был получен уже существующий в bpm файл *.txt, при получении значения из колонки Data в json возвращалась строка в кодировке 7-bit ASCII. 

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

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

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

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

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

Посмотрите, как передается файл в ConfigurationFileApi, метод upload.

И принимается в схеме FileApiService, метод public string Upload(Stream fileContent)

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

Добрый день, коллеги.  Проблема была в TypeId, как и написал Максим. Спасибо.

я имею в виду поле TypeId='529BC2F8-0EE0-DF11-971B-001D60E938C6' (это тип File из таблицы FileType)

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

Столкнулся со странной ошибкой во время выполнения UpdateQuery:

{
    "success":false,
    "responseStatus": {
        "ErrorCode":"FormatException",
        "Message": "Expected hex 0x in '{0}'.",
        "Errors":[]
    },
    "rowsAffected":-1,
    "nextPrcElReady":false
}

Кто-нибудь знает, в чем может быть причина? Буду благодарен за подсказки

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

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

"Франчук Виталий" написал:Кто-нибудь знает, в чем может быть причина?

В типе колонки. Дебаггером пройдите по update.setParameterValue(поле, значение, тип) и посмотрите соответствие между указаным типом и тем, какое значение задаётся.

"Варфоломеев Данила" написал:
Франчук Виталий пишет:

Кто-нибудь знает, в чем может быть причина?

В типе колонки. Дебаггером пройдите по update.setParameterValue(поле, значение, тип) и посмотрите соответствие между указаным типом и тем, какое значение задаётся.


Вот функция, которая вызывает UpdateQuery:

updateGame: function(id, newTitle) {
    if (id && newTitle) {
  	window.console.log("New title:", newTitle);
	var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
		rootSchemaName: "clrsGamesAvailable"
	});
	updateQuery.filters.addItem(this.createIdColumnFilter(id));
	updateQuery.setParameterValue("clrsGameTitle", newTitle, Terrasoft.DataValueType.TEXT);
 
	updateQuery.execute(function() {
		window.console.log("Game", id, "was updated.");
	});
    }
}

Там в значении параметра - строка (проверил). Есть аналогичная функция, которая создает объекты с еще двумя параметрами. Конкретно этот параметр задан также. Но с InsertQuery все работает, а с UpdateQuery - нет(

"Франчук Виталий" написал:Но с InsertQuery все работает, а с UpdateQuery - нет(

значит проверить фильтр. что this.createIdColumnFilter(id) формирует (надеюсь id - это guid).
плюс скорее всего после execute будет ошибка. id в коллбеке пропадёт

"Варфоломеев Данила" написал:
Франчук Виталий пишет:

Но с InsertQuery все работает, а с UpdateQuery - нет(

значит проверить фильтр. что this.createIdColumnFilter(id) формирует (надеюсь id - это guid).
плюс скорее всего после execute будет ошибка. id в коллбеке пропадёт

createIdColumnFilter: function(id) {
	return Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id", id);
}

Фильтр вроде как надо создаеться. Смотрел в теле запроса, который получился - там guid

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