Статьи‎ > ‎

Фоновое выполнение

Конструктор может выполнять:
  • Запросы на языке 1С;
  • SQL запросы;
  • Построитель отчетов;
  • Встроенный язык.
в фоне на сервере. Достаточно часто бывает так что либо конструкции слишком сложные  либо машина очень слабая, именно для таких случаев предназначена эта опция.
Процесс выполняет на сервере, и если модуль привилегированный тогда еще и под полными правами.
Для того что бы это было возможно. Общий модуль "МодульРегламентныхЗаданий". Должен содержать следующую процедуру:

МодульРегламетныхЗаданий

//Выполняет запросы или встроенный язык и возвращает результат Источнику инициировавшему выполнение
//Параметры:
// СтруктураПараметров
Процедура ФоноваяФункция(СтруктураПараметров) Экспорт
 
Если СтруктураПараметров.Свойство("Запрос") Тогда
   
Запрос=Новый Запрос(СтруктураПараметров.Запрос);
   
Для каждого Свойство из СтруктураПараметров.ПараметрыЗапроса Цикл
     
Запрос.УстановитьПараметр(Свойство.Ключ,Свойство.Значение);
   
КонецЦикла;
   
ХранилищеЗначения=Новый ХранилищеЗначения(Запрос.Выполнить(),Новый СжатиеДанных(5));
 
ИначеЕсли СтруктураПараметров.Свойство("ПостроительОтчета") Тогда
   
ПостроительОтчета=Новый ПостроительОтчета(СтруктураПараметров.ПостроительОтчета);
   
Для каждого Свойство из СтруктураПараметров.ПараметрыЗапроса Цикл
     
ПостроительОтчета.УстановитьПараметр(Свойство.Ключ,Свойство.Значение);
   
КонецЦикла;
   
ПостроительОтчета.УстановитьНастройки(СтруктураПараметров.Настройки);
   
ХранилищеЗначения=Новый ХранилищеЗначения(ПостроительОтчета.Выполнить(),Новый СжатиеДанных(5));
 
ИначеЕсли СтруктураПараметров.Свойство("ВстроенныйЯзык") Тогда
   
Результат=Неопределено;
   
Параметры = СтруктураПараметров.Параметры;
   
ЭтаФорма = СтруктураПараметров.ЭтаФорма;
   
Попытка
     
Результат=Вычислить(СтруктураПараметров.ВстроенныйЯзык);
   
Исключение
     
Попытка
       
Выполнить(СтруктураПараметров.ВстроенныйЯзык);
     
Исключение
     
КонецПопытки;
   
КонецПопытки;
   
ХранилищеЗначения=Новый ХранилищеЗначения(Результат,Новый СжатиеДанных(5));
 
ИначеЕсли СтруктураПараметров.Свойство("SQLЗапрос") Тогда
   
Connect= Новый COMОбъект("ADODB.Connection");
   
Connect.ConnectionString = СтруктураПараметров.СтрокаПодключения;
   
Connect.ConnectionTimeout=0;
   
Connect.CursorLocation=3;
   
Connect.Open();
   
RecSet=Connect.Execute(СтруктураПараметров.SQLЗапрос);
   
Таблица=Новый ТаблицаЗначений;
   
Если Не RecSet.State=0 Тогда
   
//колонки
   
Для i=0 ПО RecSet.Fields.Count-1 Цикл
        
Имя=RecSet.Fields(i).Name;
        
Если Не Таблица.Колонки.Найти(Имя)=Неопределено Тогда
          
Таблица.Колонки.Добавить(Имя+"_"+i,,Имя);
        
Иначе
          
Таблица.Колонки.Добавить(Имя);
        
КонецЕсли;
   
КонецЦикла;
    
//строки
   
Если Не RecSet.RecordCount=0 Тогда
      
RecSet.MoveFirst();
      
Для вр=1 ПО RecSet.RecordCount Цикл
        
НоваяСтрока =Таблица.Добавить();
        
Для j=0 ПО RecSet.Fields.Count-1 Цикл
           
Value=RecSet.Fields(j).Value;
           
НоваяСтрока.Установить(j,RecSet.Fields(j).Value);
        
КонецЦикла;
        
RecSet.MoveNext();
      
КонецЦикла;
   
КонецЕсли;
   
КонецЕсли;
 
ХранилищеЗначения=Новый ХранилищеЗначения(Таблица,Новый СжатиеДанных(5));
 
КонецЕсли;
  СтруктураПараметров.Вставить("Результат",ХранилищеЗначения);
  ВызватьИсключение ЗначениеВСтрокуВнутр(СтруктураПараметров);
КонецПроцедуры

Не забываем что при выполнение встроенного у нас доступен только синтаксис сервера. Поэтому не стоит писать там какие либо интерфейсные действия типа Сообщить() и прочее.
Данные метод вполне оправдывает себя на запросах(конструкциях)  длительностью более 1 секунды (опрос о завершении фонового задания производится 1 раз в сек.).
После запуска на выполнение конструкции в дереве запросов, справа появится определенная пиктограмма, также процесс живости задания будет отображать счетчик секунд прошедших с запуска задания. Вы можете перемещаться на другие запросы, и после окончания выполнения вернутся к своему запросу, с уже сформированным результатом.


Comments