whole_func_string: 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)
      }
func_code_string: 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)
      }
func_documentation_string: Готовим данные по блокам