День добрый.

Не смог отыскать примера структуры JSON'а для DataService.

В запросе отправляю следующий Json, без блока Filters отрабатывает корректно.

{
	"RootSchemaName": "Opportunity",
	"OperationType": "Select",
	"Columns": {
		"Items": {
			"Title": {
				"Expression":{
					"ExpressionType": "SchemaColumn",
					"ColumnPath": "Title"
				}
			}
		}
	},
	"AllColumns": false,
	"IsPageable": false,
	"Filters": {
		"RootSchemaName": "Opportunity",
		"FilterType": "CompareFilter",
		"LogicalOperation": "And",
		"LeftExpression": {
			"ExpressionType": "SchemaColumn",
			"ColumnPath": "Title"
		},
		"ComparisonType": "Contain",
		"RightExpression": {
			"ExpressionType": "Parameter",
			"Parameter": "test"
		},
		"LeftExpressionCaption": "test",
		"IsAggregative": false,
		"Key": "Title filter"
	}
}

Но при попытке использовать Filters сервис дает следующий ответ.

{
    "success": false,
    "responseStatus": {
        "ErrorCode": "NullReferenceException",
        "Message": "Ссылка на объект не указывает на экземпляр объекта.",
        "Errors": []
    },
    "rowsAffected": -1,
    "nextPrcElReady": false
}

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

Нравится

2 комментария
Лучший ответ

Добрый день.

Попробуйте для параметра значение указать таким образом:

"Parameter":{
    "DataValueType":[Тип данных],
     "Value":"[Значение колонки]"
}

 

Добрый день.

Попробуйте для параметра значение указать таким образом:

"Parameter":{
    "DataValueType":[Тип данных],
     "Value":"[Значение колонки]"
}

 

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

получилось, спасибо.

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

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

Пытаюсь применить пагинацию к DataService, используя свойства isPageable, conditionalValues и rowCount.

{
	"rootSchemaName": "Account",
	"operationType": 0,
	"columns": {
		"items": {
			"Id": {
				"expression": {
					"expressionType": 0,
					"columnPath": "Id"
				}
			},
			"Name": {
				"expression": {
					"expressionType": 0,
					"columnPath": "Name"
				}
			}
		}
	},
	"isPageable": true,
	"conditionalValues": {
		"items": {
			"Id": {
				"orderDirection": 1,
				"orderPosition": 1,
				"columnPath": "Id",
				"expressionType": 0,
				"parameter": {
					"dataValueType": 0,
					"value": "10d84875-268a-468f-ad2c-2e4b047458d8"
				}
			}
		}
	},
	"rowCount": 1
}

Вот первый запрос и ответ

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

В чем проблема? Нужна еще какая-то конфигурация запроса?

Нравится

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

Если открыть раздел, начать листать вниз, дождаться появления очередной порции строк, в Fiddler увидим обращение к DataService с такими параметрами:

...
   "rowCount":15,
   "rowsOffset":15,
   "isPageable":true,
...

А дальше, соответственно, rowsOffset меняется на 30, 45, 60 и так далее. Для выбора с самого начала он был равен 0.

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

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

Стоит следующая задача - необходимо считать и отправить данные из объекта на удаленный веб-сервис. Удаленный веб-сервис принимает данные в формате 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

Добрый день!
Бизнес процесс, в котором скрипт С# с использованием 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 комментариев
Лучший ответ

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

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

 

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

Локализируемые значения хранятся в таблицах с таким названием 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,Спасибо. Отключил этот флаг и всё снова работает!

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