# Минимальная реализация длительной операции

<figure><img src="https://2507947367-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FOBcGTyvHVeWJRTHlfhl8%2Fuploads%2FgwHDCcFNaL8CA59c0PgB%2Fimage.png?alt=media&#x26;token=61ba7968-53a7-4af5-9b3c-1bf4340828a8" alt=""><figcaption></figcaption></figure>

В конфигурации существует обработка ВыгрузкаНаСайт

## Модуль менеджера обработки

В модуле менеджера обработки необходимо разметить процедуру или функцию которая обеспечит выполнение основного алгоритма длительной операции

```bsl
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Подготавливает архив для выгрузки на сайт
//
// Возвращаемое значение: 
// 	Строка
//
Функция ПодготовитьАрхив() Экспорт

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ПРЕДСТАВЛЕНИЕ(УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Аттракционы.Ссылка)) КАК Идентификатор,
	|	Аттракционы.Представление КАК Аттракцион,
	|	Аттракционы.ВидАттракциона.Представление КАК ВидАттракциона,
	|	ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
	|	Аттракционы.Фото КАК Фото
	|ИЗ
	|	Справочник.Аттракционы КАК Аттракционы
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
	|		ПО Аттракционы.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура";
	
	Выборка = Запрос.Выполнить().Выбрать();

	ИмяКаталога = ПолучитьИмяВременногоФайла("");
	СоздатьКаталог(ИмяКаталога);

	ОписаниеАттракционов = Новый Массив;
	ШаблонИмениКартинки = "%1%2%3";
	Разделитель = ПолучитьРазделительПути();

	// Пауза только для демонстрации работы фонового задания
	ОбновлениеИнформационнойБазыСлужебный.Пауза(5);

	Пока Выборка.Следующий() Цикл
		ОписаниеАттракциона = Новый Структура;
		ОписаниеАттракциона.Вставить("Идентификатор", Выборка.Идентификатор);
		ОписаниеАттракциона.Вставить("Аттракцион", Выборка.Аттракцион);
		ОписаниеАттракциона.Вставить("ВидАттракциона", Выборка.ВидАттракциона);
		ОписаниеАттракциона.Вставить("Цена", Выборка.Цена);
		ОписаниеАттракциона.Вставить("Фото", Неопределено);
		
		Если ЗначениеЗаполнено(Выборка.Фото) Тогда
			ДанныеФайла = РаботаСФайлами.ДанныеФайла(Выборка.Фото);
			ИмяФайла = Строка(Выборка.Фото.УникальныйИдентификатор()) + ДанныеФайла.ИмяФайла;
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла);
			ПолноеИмяФайла = СтрШаблон(ШаблонИмениКартинки, ИмяКаталога, Разделитель, ИмяФайла);
			ДвоичныеДанные.Записать(ПолноеИмяФайла);
			ОписаниеАттракциона.Фото = Разделитель + ИмяФайла;
		КонецЕсли;

		ОписаниеАттракционов.Добавить(ОписаниеАттракциона);

	КонецЦикла;

	ШаблонИмениФайлаВыгрузки = "%1%2export.json";
	ИмяФайлаВыгрузки = СтрШаблон(ШаблонИмениФайлаВыгрузки, ИмяКаталога, Разделитель);

	Запись = Новый ЗаписьJSON;
	Запись.ОткрытьФайл(ИмяФайлаВыгрузки);
	ЗаписатьJSON(Запись, ОписаниеАттракционов);
	Запись.Закрыть();

	Архиватор = Новый ЗаписьZipФайла;
	Архиватор.Добавить(ИмяКаталога + Разделитель + "*.*", , РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
	ДанныеАрхива = Архиватор.ПолучитьДвоичныеДанные();
	
	// Пауза только для демонстрации работы фонового задания
	ОбновлениеИнформационнойБазыСлужебный.Пауза(5);

	УдалитьФайлы(ИмяКаталога);

	Возврат ДанныеАрхива;

КонецФункции

#КонецОбласти

#КонецЕсли

```

## Модуль формы обработки

```bsl
#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Выгрузить(Команда)

	ДлительнаяОперация = НачатьВыгрузкуНаСервере(УникальныйИдентификатор);
	ОповещениеОЗавершении = Новый ОписаниеОповещения("Подключаемый_ВыгрузкаЗавершение", ЭтотОбъект);
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.Заголовок = НСтр("ru = 'Выгрузка аттракционов'");
	ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Формируем архив...'");
	ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);

КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура Подключаемый_ВыгрузкаЗавершение(Результат, ДополнительныеПараметы) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если Результат.Статус = "Ошибка" Тогда
		СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(Результат.ИнформацияОбОшибке);
		Возврат;
	КонецЕсли;

	ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов;
	ПолучитьФайлССервераАсинх(Результат.АдресРезультата, "export.zip", ПараметрыДиалога);

КонецПроцедуры

&НаСервереБезКонтекста
Функция НачатьВыгрузкуНаСервере(УникальныйИдентификатор)

	ИмяМетода = "Обработки.ВыгрузкаНаСайт.ПодготовитьАрхив";
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
	
	// Чтобы понять как работает см. описание ДлительныеОперации.ВыполнитьФункцию
	Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, ИмяМетода);

КонецФункции

#КонецОбласти
```
