Меню


Курсы СтимулСправочникПолезные материалы1С:Предприятие 8.2РазработчикамРазработка пользовательских…

1С:Предприятие 8.2 /
Разработчикам /
Разработка пользовательских интерфейсов

Оглавление

Длительные операции

Приложение. Вспомогательные функции.

 

1. При разработке конфигураций , поддерживающих работу через веб-клиент, следует избегать длительных вызовов из клиентского кода в серверный. В клиент-серверном режиме работы все длительные серверные вызовы, которые могут выполняться более 20 секунд* в обычных сценариях работы пользователя , следует выполнять асинхронно, с помощью фонового задания.

* Примечание: условная оценка предельной длительности серверного вызова, допустимая для распространенных браузеров и веб-серверов

К таким операциям относятся: формирование отчета, групповая обработка объектов, загрузка или выгрузка данных в другое приложение, заполнение больших табличных частей и т.п.

В противном случае такие вызовы могут привести к потере работоспособности приложения:

2.1. Общий подход к асинхронному выполнению длительных серверных операций с помощью фонового задания:

2.2. Асинхронное формирование отчета требуется только для тех отчетов, которые

Поведение таких отчетов должно быть максимально похожим на поведение отчетов на базе СКД, а именно:

3. Пример заполнения табличной части Реализация документа ФормированиеЗаписейКнигиПродаж.

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

Процедура ПодготовитьДанныеДляЗаполнения(ПараметрыДокумента, АдресХранилища) Экспорт
	
	ДанныеДляЗаполнения = Новый Структура;
	ДанныеДляЗаполнения.Вставить("Реализация", ПодготовитьДанныеРазделаРеализация(ПараметрыДокумента));
	ПоместитьВоВременноеХранилище(ДанныеДляЗаполнения, АдресХранилища);
	
 КонецПроцедуры 

В модуле формы документа располагается обработчик команды заполнения документа :

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

который передает управление серверной функции ЗаполнитьДокументНаСервере, инициализирует клиентскую переменную модуля формы ПараметрыОбработчикаОжидания, подключает обработчик ожидания Подключаемый_ПроверитьВыполнениеЗадания и открывает форму-индикатор выполнения длительной операции ОбщаяФорма.ДлительнаяОперация.

Серверная функция ЗаполнитьДокументНаСервере в модуле формы выполняет непосредственно подготовку данных в файловом режиме работы, а в клиент-серверном режиме запускает подготовку в фоновом задании, в которое передает следующие параметры:

 &НаСервере
 Функция ЗаполнитьДокументНаСервере()
	 ПараметрыДокумента = Новый Структура("Дата, Организация ,Реализация0", 
	 Объект.Дата, Объект.Организация, Объект.Реализация0);
	 АдресХранилища = ПоместитьВоВременноеХранилище( Неопределено , УникальныйИдентификатор);
	 ЗаданиеВыполнено = Ложь;
	 // В файловом режиме работы выполняем операцию непосредственно (синхронно).
	 Если ИнформационнаяБазаФайловая() Тогда
		 Документы.ФормированиеЗаписейКнигиПродаж.ПодготовитьДанныеДляЗаполнения(ПараметрыДокумента, АдресХранилища);
		 Возврат Истина; 
	 КонецЕсли; 
	 // В клиент-серверном режиме работы выполняем операцию в фоновом задании (асинхронно).
	 НаименованиеЗадания = НСтр("ru = 'Заполнение документа ""Формирование записей  книги продаж ""'");
	 ПараметрыЗаполнения = Новый Массив;
	 ПараметрыЗаполнения.Добавить(ПараметрыДокумента);
	 ПараметрыЗаполнения.Добавить(АдресХранилища);
	 Если ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая Тогда
		 ВремяОжидания = 4;
	 Иначе
		 ВремяОжидания = 2;
	 КонецЕсли;
	 Задание = ФоновыеЗадания.Выполнить(
	 "Документы.ФормированиеЗаписейКнигиПродаж.ПодготовитьДанныеДляЗаполнения", 
	 ПараметрыЗаполнения, , НаименованиеЗадания);
	 Попытка
		 Задание.ОжидатьЗавершения(ВремяОжидания);
	 Исключение 
		 // Специальная обработка  не требуется . Предположительно, исключение вызвано истечением времени ожидания.
	 КонецПопытки;
	 ИдентификаторЗадания = Задание.УникальныйИдентификатор;
	 // Если операция уже завершилась, то сразу обрабатываем результат.
	 Если ЗаданиеВыполнено(Задание.УникальныйИдентификатор) Тогда
		 ЗаданиеВыполнено = Истина;
		 ЗагрузитьПодготовленныеДанные();
	 КонецЕсли; 
	 Возврат ЗаданиеВыполнено;
  КонецФункции  
 

Обработчик ожидания в модуле формы проверяет, завершено ли фоновое задание и загружает результат из временного хранилища с помощью вызовы процедуры ЗагрузитьПодготовленныеДанные:

&НаКлиенте
Процедура Подключаемый_ПроверитьВыполнениеЗадания()
	Попытка
		Если ЗаданиеВыполнено() Тогда 
			ЗагрузитьПодготовленныеДанные();
			ЗакрытьФормуДлительнойОперации();
			Возврат;
		КонецЕсли;
		
	Исключение
		ЗакрытьФормуДлительнойОперации();
		ВызватьИсключение;
	КонецПопытки;
	ПараметрыОбработчикаОжидания.ТекущийИнтервал = ПараметрыОбработчикаОжидания.ТекущийИнтервал * ПараметрыОбработчикаОжидания.КоэффициентУвеличенияИнтервала;
	Если ПараметрыОбработчикаОжидания.ТекущийИнтервал > ПараметрыОбработчикаОжидания.МаксимальныйИнтервал Тогда
		ПараметрыОбработчикаОжидания.ТекущийИнтервал = ПараметрыОбработчикаОжидания.МаксимальныйИнтервал;
	КонецЕсли;
	ПодключитьОбработчикОжидания(
	"Подключаемый_ПроверитьВыполнениеЗадания", 
	ПараметрыОбработчикаОжидания.ТекущийИнтервал, 
	Истина);
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьПодготовленныеДанные()
	Результат = ПолучитьИзВременногоХранилища(АдресХранилища);
	Если ТипЗнч(СтруктураДанных) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;
	Если СтруктураДанных.Свойство("Реализация") Тогда
		Объект.Реализация.Загрузить(СтруктураДанных.Реализация);
	КонецЕсли;
КонецПроцедуры

В приложении ниже приведен пример реализации вспомогательных функций ЗакрытьФормуДлительнойОперации, ИнформационнаяБазаФайловая и ЗаданиеВыполнено. 4. При использовании в конфигурации Библиотеки стандартных подсистем в распоряжении разработчика имеются вспомогательные функции и процедуры общих модулей ДлительныеОперации, ДлительныеОперацииКлиент, а также процедура УстановитьСостояниеПоляТабличногоДокумента общего модуля ОбщегоНазначенияКлиентСервер. Приложение. Вспомогательные функции.


&НаКлиенте
Процедура ЗакрытьФормуДлительнойОперации()
	Если ТипЗнч(ФормаДлительнойОперации) = Тип("УправляемаяФорма") Тогда
		Если ФормаДлительнойОперации.Открыта() Тогда
			ФормаДлительнойОперации.Закрыть();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ИнформационнаяБазаФайловая(СтрокаСоединенияИнформационнойБазы = "") Экспорт
	Если ПустаяСтрока(СтрокаСоединенияИнформационнойБазы) Тогда
		СтрокаСоединенияИнформационнойБазы = СтрокаСоединенияИнформационнойБазы();
	КонецЕсли;
	Возврат Найти(Врег(СтрокаСоединенияИнформационнойБазы), "FILE=") = 1;
КонецФункции



Нас находят: ОшибкиПерепроведения = ПолучитьИзВременногоХранилища(АдресХранилища), поле объекта не обнаружено (портагентасервера), ОшибкиПерепроведения = ПолучитьИзВременногоХранилища(АдресХранилища);, длительные операции, асинхронное выполнение длительных операций 1с 8 3, поле объекта не обнаружено портагентасервера, ОбщийМодуль ДлительныеОперации Модуль(164)}: Поле объекта не обнаружено (ПортАгентаСервера) ВызватьИсключение(ТекстОшибки) УТ 11 1 5 16, Длительные операции epf скачать, 1с длительные операции, {ОбщийМодуль ДлительныеОперации Модуль(164)}: Поле объекта не обнаружено (ПортАгентаСервера) ВызватьИсключение(ТекстОшибки);


Подписка на новости RSS

Мы на Facebook