Выполнить фоне.
//
Функция ВыполнитьВФоне(Знач ИмяПроцедуры, Знач ПараметрыПроцедуры, Знач ПараметрыВыполнения) Экспорт
ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ДлительныеОперации.ВыполнитьВФоне", "ПараметрыВыполнения",
ПараметрыВыполнения, Тип("Структура"));
Если ПараметрыВыполнения.ЗапуститьНеВФоне И ПараметрыВыполнения.ЗапуститьВФоне Тогда
ВызватьИсключение НСтр("ru = 'Параметры ""ВсегдаНеВФоне"" и ""ВсегдаВФоне""
|не могут одновременно принимать значение Истина в ДлительныеОперации.ВыполнитьВФоне.'");
КонецЕсли;
#Если ВнешнееСоединение Тогда
ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая();
Если ПараметрыВыполнения.БезРасширений И ИнформационнаяБазаФайловая Тогда
ВызватьИсключение НСтр("ru = 'Фоновое задание не может быть запущено с параметром ""БезРасширений""
|в файловой информационной базе в ДлительныеОперации.ВыполнитьВФоне.'");
КонецЕсли;
#КонецЕсли
АдресРезультата = ?(ПараметрыВыполнения.АдресРезультата <> Неопределено,
ПараметрыВыполнения.АдресРезультата,
ПоместитьВоВременноеХранилище(Неопределено, ПараметрыВыполнения.ИдентификаторФормы));
Результат = Новый Структура;
Результат.Вставить("Статус", "Выполняется");
Результат.Вставить("ИдентификаторЗадания", Неопределено);
Результат.Вставить("АдресРезультата", АдресРезультата);
Результат.Вставить("АдресДополнительногоРезультата", "");
Результат.Вставить("КраткоеПредставлениеОшибки", "");
Результат.Вставить("ПодробноеПредставлениеОшибки", "");
Результат.Вставить("Сообщения", Новый ФиксированныйМассив(Новый Массив));
Если ПараметрыВыполнения.БезРасширений Тогда
ПараметрыВыполнения.БезРасширений = ЗначениеЗаполнено(ПараметрыСеанса.ПодключенныеРасширения);
КонецЕсли;
ПараметрыЭкспортнойПроцедуры = Новый Массив;
ПараметрыЭкспортнойПроцедуры.Добавить(ПараметрыПроцедуры);
ПараметрыЭкспортнойПроцедуры.Добавить(АдресРезультата);
Если ПараметрыВыполнения.ДополнительныйРезультат Тогда
Результат.АдресДополнительногоРезультата = ПоместитьВоВременноеХранилище(Неопределено, ПараметрыВыполнения.ИдентификаторФормы);
ПараметрыЭкспортнойПроцедуры.Добавить(Результат.АдресДополнительногоРезультата);
КонецЕсли;
#Если ВнешнееСоединение Тогда
ВыполнитьБезФоновогоЗадания = ИнформационнаяБазаФайловая
Или ОбщегоНазначения.РежимОтладки() Или ПараметрыВыполнения.ЗапуститьНеВФоне
Или (ЕстьФоновыеЗаданияВФайловойИБ() И Не ПараметрыВыполнения.ЗапуститьВФоне)
Или Не ВозможноВыполнитьВФоне(ИмяПроцедуры);
#Иначе
ВыполнитьБезФоновогоЗадания = Не ПараметрыВыполнения.БезРасширений
И (ОбщегоНазначения.РежимОтладки() Или ПараметрыВыполнения.ЗапуститьНеВФоне
Или (ЕстьФоновыеЗаданияВФайловойИБ() И Не ПараметрыВыполнения.ЗапуститьВФоне)
Или Не ВозможноВыполнитьВФоне(ИмяПроцедуры));
#КонецЕсли
// Выполнить в основном потоке.
Если ВыполнитьБезФоновогоЗадания Тогда
Попытка
ВыполнитьПроцедуру(ИмяПроцедуры, ПараметрыЭкспортнойПроцедуры);
Результат.Статус = "Выполнено";
Исключение
Результат.Статус = "Ошибка";
Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(НСтр("ru = 'Ошибка выполнения'", ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка, , , Результат.ПодробноеПредставлениеОшибки);
КонецПопытки;
Возврат Результат;
КонецЕсли;
// Выполнить в фоне.
Попытка
Задание = ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры, ПараметрыВыполнения, ПараметрыЭкспортнойПроцедуры);
Исключение
Результат.Статус = "Ошибка";
Если Задание <> Неопределено И Задание.ИнформацияОбОшибке <> Неопределено Тогда
Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
Иначе
Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецЕсли;
Возврат Результат;
КонецПопытки;
Если Задание <> Неопределено И Задание.ИнформацияОбОшибке <> Неопределено Тогда
Результат.Статус = "Ошибка";
Результат.КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
Результат.ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке);
Возврат Результат;
КонецЕсли;
Результат.ИдентификаторЗадания = Задание.УникальныйИдентификатор;
ЗаданиеВыполнено = Ложь;
Если ПараметрыВыполнения.ОжидатьЗавершение <> 0 Тогда
Задание = Задание.ОжидатьЗавершенияВыполнения(ПараметрыВыполнения.ОжидатьЗавершение);
Если Задание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда
ЗаданиеВыполнено = Истина;
КонецЕсли;
КонецЕсли;
Если ЗаданиеВыполнено Тогда
ПрогрессИСообщения = ПрочитатьПрогрессИСообщения(Задание.УникальныйИдентификатор, "ПрогрессИСообщения");
Результат.Сообщения = ПрогрессИСообщения.Сообщения;
КонецЕсли;
ЗаполнитьЗначенияСвойств(Результат, ОперацияВыполнена(Задание.УникальныйИдентификатор), , "Сообщения");
Возврат Результат;
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ВыполнитьОбновлениеДоступаСпискаВФоне (БСП)
ВыполнитьОбновлениеИнформационнойБазыВФоне (БСП)