В БСП есть предустановленный функционал для запуска дополнительной обработки в фоновом режиме. Мы рассматриваем тот случай, когда запуск обработки выполняется на клиенте.
Необходимое условие: обработка должна быть добавлена в справочник ДополнительныеОтчетыИОбработки.
далее в модуле формы в команде кнопки выполнения добавляем текст:
//Для выполнение на серевере в фоновом режиме
ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
СопровождающийТекст = НСтр("ru = 'Выполняется обработка...'");
ПараметрыКоманды.СопровождающийТекст = СопровождающийТекст;
Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, СопровождающийТекст);
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(Параметры.ИдентификаторКоманды, ПараметрыКоманды, Обработчик);
Пояснения:
Параметры.ДополнительнаяОбработкаСсылка - это ссылка на справочник ДополнительныеОтчетыИОбработки
По этой ссылке формируем параметры команды.
Далее задаем текст сообщения пользователю вида "процесс идет..."
Вызываем процедуру ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(), которая будет возвращать в экспортную клиентскую процедуру ПослеЗавершенияДлительнойОперации() результат выполнения обработки
// Перехват окончания фонового выполнения
&НаКлиенте
Процедура ПослеЗавершенияДлительнойОперации(Операция, СопровождающийТекст) Экспорт
// Добавить код приемки результата.
// Например:
Если ТипЗнч(ВладелецФормы) = Тип("УправляемаяФорма") И Не ВладелецФормы.Модифицированность Тогда
Попытка
ВладелецФормы.Прочитать();
Исключение
// Значит это форма списка.
КонецПопытки;
КонецЕсли;
Если Открыта() Тогда
Закрыть();
КонецЕсли;
Если Операция.Статус = "Выполнено" Тогда
ПоказатьОповещениеПользователя(НСтр("ru = 'Успешное завершение'"), , СопровождающийТекст, БиблиотекаКартинок.Успешно32);
Иначе
ПоказатьПредупреждение(, Операция.КраткоеПредставлениеОшибки);
КонецЕсли;
КонецПроцедуры
Есть нюанс, как же без них...
В параметры обработки в фоне не передаются на прямую данные из формы. Так что если нам надо, чтобы были определены параметры выполнения обработки, то их надо передать через хранилище значений.
Для этого в модуле формы добавляем код для записи значений реквизитов формы в хранилище:
&НаСервере
Процедура СохранитьНастройкиФормы()
Если ЗначениеЗаполнено(Объект.ДополнительнаяОбработкаСсылка) Тогда
Настройки = Новый Соответствие;
//положим все значения реквизитов обработки
ОбъектОбработки = РеквизитФормыВЗначение("Объект");
Для каждого ОписаниеРеквизита Из ОбъектОбработки.Метаданные().Реквизиты Цикл
Настройки.Вставить(ОписаниеРеквизита.Имя,Объект[ОписаниеРеквизита.Имя]);
КонецЦикла;
Попытка
ЗаблокироватьДанныеДляРедактирования(Объект.ДополнительнаяОбработкаСсылка);
Исключение
ТекстОшибки = НСтр("ru='Не удалось заблокировать %Объект%. %ОписаниеОшибки%'");
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%Объект%", Объект.ДополнительнаяОбработкаСсылка);
ТекстОшибки = СтрЗаменить(ТекстОшибки, "%ОписаниеОшибки%", КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, Объект.ДополнительнаяОбработкаСсылка);
Возврат;
КонецПопытки;
ДополнительнаяОбработкаОбъект = Объект.ДополнительнаяОбработкаСсылка.ПолучитьОбъект();
ДополнительнаяОбработкаОбъект.ХранилищеНастроек = Новый ХранилищеЗначения(Настройки);
ДополнительнаяОбработкаОбъект.Записать();
КонецЕсли;
КонецПроцедуры
В модуле обработки в процедуре ВыполнитьКоманду, перед кодом самой обработки добавляем считывание настроек:
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
ДополнительнаяОбработкаСсылка = ПараметрыВыполненияКоманды.ДополнительнаяОбработкаСсылка;
ХранилищеНастроек = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ДополнительнаяОбработкаСсылка,"ХранилищеНастроек");
Настройки = ХранилищеНастроек.Получить();
ФлНетРеквизитов = Истина;
Если Настройки <> Неопределено Тогда
Для каждого ЭлементНастроек Из Настройки Цикл
ЭтотОбъект[ЭлементНастроек.Ключ] = ЭлементНастроек.Значение;
ФлНетРеквизитов = Ложь;
КонецЦикла;
КонецЕсли;
ВыполнитьФункционал(ИдентификаторКоманды); //там - сама обработка
КонецПроцедуры
Если реквизитов в хранилище нет, то переменная ФлНетРеквизитов = Истина, и надо определить настройки по умолчанию.
Шаблон внешней обработки можно скачать здесь.
|