// Выполнение запросов в параллельном режиме // ЗАО "Софтпоинт" // http://www.softpoint.tu // Модификации данного модуля без согласования с разработчиками ЗАО "Софтпоинт" запрещены! Функция РазностьДатВДнях(Дата1, Дата2) мДлинаСуток = 86400; // в секундах Возврат Окр((НачалоДня(Дата1) - НачалоДня(Дата2)) / мДлинаСуток); КонецФункции Функция НачатьПараллельноеВыполнениеЗапросов() Запрос1 = Новый Запрос; Запрос1.Текст = "select ""BeginParallelQueryExecution"",""00010101"""; Выборка = Запрос1.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда ДатаЛиц = Выборка[1]; Если (ДатаЛиц = '00010101') или (ДатаЛиц = '19000101') Тогда // Компонента не установлена или нет лицензии Сообщить("Компонента ""Параллельные запросы"" не установлена или отсутствует лицензия"); Возврат Ложь; Иначе ДатаЛиц = Дата(ДатаЛиц); ДнейЛиц = РазностьДатВДнях(ДатаЛиц,ТекущаяДата()); Если ДнейЛиц<0 Тогда Сообщить("Срок лицензии компоненты ""Параллельные запросы"" истек "+Формат(ДатаЛиц, "ДФ=дд.ММ.гггг")+".",СтатусСообщения.Внимание); Возврат Ложь; ИначеЕсли ДнейЛиц<10 Тогда Сообщить("Срок лицензии компоненты ""Параллельные запросы"" истекает "+Формат(ДатаЛиц, "ДФ=дд.ММ.гггг")+".",СтатусСообщения.Внимание); КонецЕсли; Возврат Истина; КонецЕсли; Иначе Возврат Ложь; КонецЕсли; КонецФункции Процедура ЗавершитьПараллельноеВыполнениеЗапросов() Запрос1 = Новый Запрос; Запрос1.Текст = "select ""EndParallelQueryExecution"""; Запрос1.Выполнить(); КонецПроцедуры Процедура ДождатьсяВыполненияЗапросов() Запрос1 = Новый Запрос; Запрос1.Текст = "select ""WaitQueryExecution"""; Запрос1.Выполнить(); КонецПроцедуры Процедура УстановитьGUIDСледующегоЗапросаДляВыполнения(GUID) Запрос = Новый Запрос; Запрос.Текст = "select ""SetQueryGUIDForExecute"","""+GUID+""""; Запрос.Выполнить(); КонецПроцедуры Процедура ОчиститьGUIDСледующегоЗапросаДляВыполнения() Запрос = Новый Запрос; Запрос.Текст = "select ""EndQueryGUIDForExecute"""; Запрос.Выполнить(); КонецПроцедуры Процедура УстановитьGUIDСледующегоЗапросаДляПолученияРезультата(GUID) Запрос = Новый Запрос; Запрос.Текст = "select ""SetQueryGUIDForGetResult"","""+GUID+""""; Запрос.Выполнить(); КонецПроцедуры Процедура ОчиститьGUIDСледующегоЗапросаДляПолученияРезультата() Запрос = Новый Запрос; Запрос.Текст = "select ""EndQueryGUIDForGetResult"""; Запрос.Выполнить(); КонецПроцедуры Функция ВыполнитьЗапросыПараллельно(МассивЗапросов, Знач ВыполнятьПоследовательно = Ложь) Экспорт Если Не ВыполнятьПоследовательно Тогда ВыполнятьПоследовательно = Не НачатьПараллельноеВыполнениеЗапросов(); КонецЕсли; Если Не ВыполнятьПоследовательно Тогда МассивЗапросовGUID = Новый Массив; Для Каждого Запрос Из МассивЗапросов Цикл GUID = Новый УникальныйИдентификатор(); УстановитьGUIDСледующегоЗапросаДляВыполнения(GUID); Запрос.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляВыполнения(); Структ = Новый Структура("GUID,Запрос",GUID,Запрос); МассивЗапросовGUID.Добавить(Структ); КонецЦикла; ДождатьсяВыполненияЗапросов(); Рез = Новый Массив; Для Каждого Структ Из МассивЗапросовGUID Цикл GUID = Структ.GUID; Запрос = Структ.Запрос; УстановитьGUIDСледующегоЗапросаДляПолученияРезультата(GUID); Выборка = Запрос.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляПолученияРезультата(); Рез.Добавить(Выборка); КонецЦикла; ЗавершитьПараллельноеВыполнениеЗапросов(); Иначе Рез = Новый Массив; Для Каждого Запрос Из МассивЗапросов Цикл Выборка = Запрос.Выполнить(); Рез.Добавить(Выборка); КонецЦикла; КонецЕсли; Возврат Рез; КонецФункции Функция ВыполнитьЗапросыПараллельно1(Запрос1, Знач ВыполнятьПоследовательно = Ложь) Экспорт Если Не ВыполнятьПоследовательно Тогда ВыполнятьПоследовательно = Не НачатьПараллельноеВыполнениеЗапросов(); КонецЕсли; Если Не ВыполнятьПоследовательно Тогда Попытка GUID1 = Новый УникальныйИдентификатор(); УстановитьGUIDСледующегоЗапросаДляВыполнения(GUID1); Запрос1.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляВыполнения(); ДождатьсяВыполненияЗапросов(); УстановитьGUIDСледующегоЗапросаДляПолученияРезультата(GUID1); Выборка1 = Запрос1.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляПолученияРезультата(); ЗавершитьПараллельноеВыполнениеЗапросов(); Исключение ЗавершитьПараллельноеВыполнениеЗапросов(); ВызватьИсключение; КонецПопытки; Иначе Выборка1 = Запрос1.Выполнить(); КонецЕсли; Рез = Новый Массив; Рез.Добавить(Выборка1); Возврат Рез; КонецФункции Функция ВыполнитьЗапросыПараллельно2(Запрос1,Запрос2, Знач ВыполнятьПоследовательно = Ложь) Экспорт Если Не ВыполнятьПоследовательно Тогда ВыполнятьПоследовательно = Не НачатьПараллельноеВыполнениеЗапросов(); КонецЕсли; Если Не ВыполнятьПоследовательно Тогда Попытка GUID1 = Новый УникальныйИдентификатор(); УстановитьGUIDСледующегоЗапросаДляВыполнения(GUID1); Запрос1.Выполнить(); GUID2 = Новый УникальныйИдентификатор(); ОчиститьGUIDСледующегоЗапросаДляВыполнения(); УстановитьGUIDСледующегоЗапросаДляВыполнения(GUID2); Запрос2.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляВыполнения(); ДождатьсяВыполненияЗапросов(); УстановитьGUIDСледующегоЗапросаДляПолученияРезультата(GUID1); Выборка1 = Запрос1.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляПолученияРезультата(); УстановитьGUIDСледующегоЗапросаДляПолученияРезультата(GUID2); Выборка2 = Запрос2.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляПолученияРезультата(); ЗавершитьПараллельноеВыполнениеЗапросов(); Исключение ЗавершитьПараллельноеВыполнениеЗапросов(); ВызватьИсключение; КонецПопытки; Иначе Выборка1 = Запрос1.Выполнить(); Выборка2 = Запрос2.Выполнить(); КонецЕсли; Рез = Новый Массив; Рез.Добавить(Выборка1); Рез.Добавить(Выборка2); Возврат Рез; КонецФункции Функция ВыполнитьЗапросыПараллельно3(Запрос1,Запрос2,Запрос3, Знач ВыполнятьПоследовательно = Ложь) Экспорт Если Не ВыполнятьПоследовательно Тогда ВыполнятьПоследовательно = Не НачатьПараллельноеВыполнениеЗапросов(); КонецЕсли; Если Не ВыполнятьПоследовательно Тогда Попытка GUID1 = Новый УникальныйИдентификатор(); УстановитьGUIDСледующегоЗапросаДляВыполнения(GUID1); Запрос1.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляВыполнения(); GUID2 = Новый УникальныйИдентификатор(); УстановитьGUIDСледующегоЗапросаДляВыполнения(GUID2); Запрос2.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляВыполнения(); GUID3 = Новый УникальныйИдентификатор(); УстановитьGUIDСледующегоЗапросаДляВыполнения(GUID3); Запрос3.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляВыполнения(); ДождатьсяВыполненияЗапросов(); УстановитьGUIDСледующегоЗапросаДляПолученияРезультата(GUID1); Выборка1 = Запрос1.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляПолученияРезультата(); УстановитьGUIDСледующегоЗапросаДляПолученияРезультата(GUID2); Выборка2 = Запрос2.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляПолученияРезультата(); УстановитьGUIDСледующегоЗапросаДляПолученияРезультата(GUID3); Выборка3 = Запрос3.Выполнить(); ОчиститьGUIDСледующегоЗапросаДляПолученияРезультата(); ЗавершитьПараллельноеВыполнениеЗапросов(); Исключение ЗавершитьПараллельноеВыполнениеЗапросов(); ВызватьИсключение; КонецПопытки; Иначе Выборка1 = Запрос1.Выполнить(); Выборка2 = Запрос2.Выполнить(); Выборка3 = Запрос3.Выполнить(); КонецЕсли; Рез = Новый Массив; Рез.Добавить(Выборка1); Рез.Добавить(Выборка2); Рез.Добавить(Выборка3); Возврат Рез; КонецФункции