Top.Mail.Ru

Как облегчить открытие формы в 1С

Расскажу о том, как можно ускорить открытие «тяжелой» формы. Иногда заказчики просят добавить на форму все возможные показатели, которые должны рассчитываться при открытии формы справочника или документа. При этом форма открывается дольше стандартного времени, и не всем пользователям необходимы все эти показатели.

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

Рассмотрим пример формы. На ней расположены три статичных реквизита и три рассчитываемых реквизита. При каждом открытии три показателя перезаполняются.

Время, за которое открывается форма, 15.7 сек.

В процедуре ПриСозданииНаСервере запускается долгая процедура расчета, которая и занимает большую часть времени открытия формы.

Для начала перенесем процедуру ДолгийРасчетПоказателей из формы в общий серверный модуль или в модуль менеджера объекта и добавим параметры: Параметры, АдресРезультата, где Параметры – необходимые входящие параметры.

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

В процедуре ПриОткрытии() вставляем код для запуска фонового задания.

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	ДлительнаяОперация = НачатьВыполнениеНаСервере();
    ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
    ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	
    ОповещениеОЗавершении = Новый ОписаниеОповещения("ДолгийРасчетПоказателейЗавершение", ЭтотОбъект);
    ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
	
КонецПроцедуры

Добавляем процедуру НачатьВыполнениеНаСервере(), в которой заполняем нужные параметры для выполнения долгой операции.

&НаСервере
Функция НачатьВыполнениеНаСервере()
	
	ПараметрыПроцедуры = Новый Структура;
	ПараметрыПроцедуры.Вставить("Реквизит1", Реквизит1);
	ПараметрыПроцедуры.Вставить("Реквизит2", Реквизит2);
	ПараметрыПроцедуры.Вставить("Реквизит3", Реквизит3);
	
    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	
	Возврат ДлительныеОперации.ВыполнитьВФоне("СвойОбщийМодуль.ДолгийРасчетПоказателей", ПараметрыПроцедуры, ПараметрыВыполнения);
	
КонецФункции

Добавляем процедуру ДолгийРасчетПоказателейЗавершение (), в которой обрабатываем результат выполнения операции.

&НаКлиенте
Процедура ДолгийРасчетПоказателейЗавершение(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗначениеРезультата = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
	Значение1 = ЗначениеРезультата.Значение1;
	Значение2 = ЗначениеРезультата.Значение2;
	Значение3 = ЗначениеРезультата.Значение3;
	
КонецПроцедуры

Теперь форма открывается за 2 сек. Параметры обновились примерно через 20 сек после открытия формы.

Недостаток в том, что показатели доступны не сразу. Пользователи будут видеть пустые поля сразу при открытии формы, их можно заменить на декорацию «Показатели рассчитываются…». Также рассчитываемые показатели могут располагаться в разных вкладках, пользователи не всегда работают с ними, поэтому они могут и не заметить задержку в расчетах.

Не стоит переносить легкие операции в фоновое задание, т.к. для его создания необходимо время. Это может выполняться дольше, чем если бы выполнялось в процедуре ПриСозданииНаСервере.

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar