Bitrix24 Tasks: Класс BX.Tasks.Util.Query

Данный аяксовый класс позволяет на клиенте выполнять вызовы удаленных методов. На PHP список доступных экшнов можно просмотреть, выполнив код:

CModule::IncludeModule('tasks');

$d = new \Bitrix\Tasks\Dispatcher();
print($d->getDescriptionFormatted());

Подключение js-extension`а:

CJSCore::Init('tasks_util_query');

Примеры работы с js-апи

Статический вызов, без пакетирования операций

В 99% случаев используется именно он :-/

BX.Tasks.Util.Query.runOnce(
    'task.template.find', 
    {parameters: {select: ['ID', 'TITLE']}}
).then(function(result){
    if(result.isSuccess())
    {
        console.dir(result.getData());
    }
    else
    {
        console.dir(result.getErrors());
    }
});

Порождение инстанса и пакетирование

При таком подходе операции будут выполнены в одном запросе, по очереди

var query = new BX.Tasks.Util.Query({autoExec: true});

query.run('task.update', {id: 100, data: {TITLE: 'New title'}}).then(function(result){
    if(result.isSuccess())
    {
        console.dir('This is task update');
    };
}, function(){
    console.dir('Oopsss...');
});

query.run('task.get', {id: 100}).then(function(result){
    if(result.isSuccess())
    {
        console.dir('Task:');
        console.dir(result.getData());
    };
}, function(){
     console.dir('Oopsss...');
});

query.run('task.template.get', {id: 200}).then(function(result){
    if(result.isSuccess())
    {
        console.dir('Template:');
        console.dir(result.getData());
    };
}, function(){
     console.dir('Oopsss...');
});

Смена точки обработки запроса

По умолчанию используется точка tasks.base, то есть components/bitrix/tasks.base/ajax.php. Можно поменять точку обработки, чтобы получить доступ к кастомным обработчикам компонента-наследника. При этом, методы должны вызываться либо как this.methodname, либо по названия класса компонента: tasksuserfieldpanelcomponent.methodname

var query = new BX.Tasks.Util.Query({url: '/bitrix/components/bitrix/tasks.userfield.panel/ajax.php', autoExec: true});

query.run('this.savefield', {id: 100, data: {USER_TYPE_ID: 'datetime', MULTIPLE: 'Y'}}).then(function(result){
    if(result.isSuccess())
    {
        console.dir('Field created:');
        console.dir(result.getData());
    };
}, function(){
     console.dir('Oopsss...');
});

Если вы используете в качестве js-контроллера компонента класс-наследник от BX.Tasks.Component, тогда внутри этого контроллера есть возможность делать просто вызов this.callRemote():

BX.Tasks.Component = BX.Tasks.Util.Widget.extend({
    methods: {
    
        ...
    
        doSmth: function(){
            this.callRemote('this.saveField', {id: 100}).then(function(result){
                if(result.isSuccess())
                {
                    ...
                }
            });
        }
        
        ...
    }
});

При передаче autoExec: false, запросы не будут отправлены на выполнение. В таком случае необходимо вручную вызвать метод query.execute();

Итератор вызовов

Бывает полезен класс BX.Tasks.Util.Query.Iterator, который реализует удобный интерфейс к пошаговке через ajax