Готовим данные по блокам
function(data) {

        for(var i=1;i<=me.tpls[data.tpl].blocks;i++) {
            data['BLOCK_'+i] = []    
        }
 
        // пройдем по всем блокам и выполним код в них
        // каждый последующий блок выполняется строго после предыдущего
        var recur = function(j) {
           
            if(!data || !data.blocks) {  // ToDo Why data.blocks is undefined sometime
                push2tpl(data)
                return;
            }
           
            var b = data.blocks[j],
                plg, ctr;

            if(!b) {  
                push2tpl(data)
                return;
            }

            if(!b.viewarea || 
            (request.page && b.viewarea == 2) ||
            (!request.page && b.viewarea == 1)) {}
            else {
                 recur(j+1)
                 return;
            }
            
            
            if(b.controller && b.controller != '') {
                                
                ctr = b.controller.split(':')
                b.controller = ctr[0]
                if(!ctr[1]) ctr[1] = 'run' // метод контролера по-умолчанию



                if(!!(plg = me.server.getModel(ctr[0])) && !!plg[ctr[1]]) {
                    
                    controllersCount++;
                    
                    request.pageData = data
                    
                    if(ctr.length>2) {
                        //if(!request.urlparams) 
                        request.urlparams = []
                        for(var ii=2;ii<ctr.length;ii++) request.urlparams.push(ctr[ii])
                    }
                  
                    plg[ctr[1]](request, function(bdata, error) {
      
                        if(error) {
                            callback(null, error)
                            return;
                        }
                        
                        if(!data['BLOCK_'+b.block]) data['BLOCK_'+b.block] = []
                        
                        if(bdata === Object(bdata)) {
                            if(bdata.html) data['BLOCK_'+b.block].push({html:bdata.html, m:true})
                            if(bdata.globals) {
                                for(var ii in bdata.globals) data[ii] = bdata.globals[ii]    
                            }
                        } else {
                            data['BLOCK_'+b.block].push({html:bdata, m:true})
                        }
                        recur(j+1)
                    }, auth, data)
                } else {
                    recur(j+1)
                }
            } else {
                if(b.text) {
                    data['BLOCK_'+b.block].push({html:b.text, m:false})
                }
                recur(j+1)
            }
            
        }
        recur(0)
    }