Skip to content

Вывод информации об ошибках в клиентском приложении для Битрикс24

Добрый день.

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

В данной статье речь пойдет про вызов методов BX24.callBatch и BX24.callMethod.
Возьмем небольшой пример кода:
function saveDeal2Base(batch, did){
  BX24.callBatch(batch, function(result){
    checkErr(result, batch, 'saveDeal2Base.1');
    if(did > 0){
   BX24.callMethod('entity.item.get', {ENTITY: 'schedule', FILTER: {PROPERTY_dealId: did}}, function(result){
     checkErr(result, '', 'saveDeal2Base.2');
   });
    }
  });
}
После вызова метода я сразу использую вызов функции checkErr, в параметрах которой я передаю результат выполнения запроса result, сам пакет запросов batch в случае callBatch, и некоторую метку, которая позволит мне в случае ошибки точно идентифицировать строку кода, а которой она возникла.

Давайте посмотрим на функцию checkErr:
function checkErr(result, data, f){
  if(result.answer){//отработал метод BX24.callMethod
    status = result.status;
    err = result.answer.error;
    if(err){//если есть ошибка, выводим ее
      method = result.query.method;
      params = result.query.data;
      addErr(err, f, method, params);
    }
  }
  else{//сработал BX24.callBatch
    for(var q in result){
      status = result[q].status;
      if(result[q].answer){
        err = result[q].answer.error;
        if(err){//если есть ошибка, выводим ее
          method = data[q][0];
          params = data[q][1];
          addErr(err, f, method, params);
        }
      }
    }
  }
}

function addErr(err, f, method, params){
  html = '<table class="error_table"><thead><tr><td>'+f+'.'+method +'</td><td>'+err.error+ ' '+err.error_description+'</td></tr></thead><tbody>';
  for(var d in params){
    dd = params[d];
    if(typeof dd == 'object'){
      _dd = '';
      for(var x in dd){
        if(typeof dd[x] == 'object'){
          _dd += x + ' [ ';
          for(var y in dd[x]){
            _dd += y + ' => ' + dd[x][y] + ';';
          }
          _dd += ' ] ';
        }
        else{
            _dd += x + ' => ' + dd[x] + ';';
        }
      }
      dd= _dd;
    }
    html += '<tr><td>'+d+'</td><td>'+dd+'</td></tr>';
  }
  html += '</tbody></table><hr>';
  $('#error').append(html);
}
В результате можем получить картину вроде этой
err.png
Мы видим название функции, в которой произошла ошибка, название метода, который привел к ошибке, описание ошибки и список параметров.

В принципе, ничего сложного :)

Как это работает... Я создал пустой слой
<div id="error"></div>
и с помощью jQuery добавляю в него html-таблицу с информацией об ошибке.

Давайте рассмотрим функцию checkErr подробней.
1. Используем в BX24.callMethod
В этом случае 2й параметр нам не нужен, т.к. result содержит всю необходимую информацию и о методе, и о параметрах запроса.
method = result.query.method;
params = result.query.data;
2. Используем BX24.callBatch
В этом случае result не содержит данных о методе и параметрах, поэтому я передаю в функцию checkErr исходный пакет запросов batch.
Данный массив всегда состоит их двух элементов: метод и набор параметром.
method = data[q][0];
params = data[q][1];
где q - это идентификатор пакета из batch.