Содержание:
1. Отчет в управляемой форме в 1С
2. Шаги по выполнению фоновой процедуры в учетной программе 1С
1. Отчет в управляемой форме в 1С
Управляемые формы уже давно и плотно вошли в мир разработки на 1С, все уже давно научились отличать выполнение на клиенте от выполнения на сервере, но по-прежнему очень часто встречается код, выполняемый на сервере и приводящий к «фризам» интерфейса. Приведу пример, как можно любую процедуру перевести в фоновое выполнение без усложнения алгоритмов выполнения.
На текущий момент есть отчет, который формируется по кнопке и возвращает табличный документ.
|
&НаКлиенте Процедура Сформировать(Команда)
табДокумент = СформироватьОтчетНаСервере(); табДокумент.Показать(«Классификация расходов по статьям УУ»);
КонецПроцедуры
&НаСервере Функция СформироватьОтчетНаСервере() … КонецФункции |
Для того, чтобы выполнить существующую процедуру в фоне, необходимо выполнить несколько шагов.
2. Шаги по выполнению фоновой процедуры в учетной программе 1С
На клиенте выполним шаги для запуска фонового задания и возможности отслеживания результата выполнения. Разберем построчно, что мы делаем в процедуре «Сформировать».
В первой строке мы вызываем серверную процедуру, которая запустит выполнение в фоне и вернет нам идентификатор фонового задания.
Во второй строке сохраним Идентификатор чтобы использовать для отмены выполнения фонового задания, передав его в функцию ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторФоновогоЗадания);
В третьей строке с помощью общего модуля «ДлительныеОперацииКлиент» мы формируем структуру с параметрами ожидания, в которой при необходимости можно настраивать различные варианты поведения во время выполнения нашей процедуры. Пока ничего менять не будем.
В четвертой строке мы прописываем процедуру, в которой будет обрабатываться результат выполнения нашей процедуры.
В пятой строке мы с помощью процедуры общего модуля «ДлительныеОперацииКлиент» запускаем процесс ожидания выполнения, передав туда информацию о том, куда вернуть результат, и как отображать процесс ожидания.
В нашем примере запускает процедуру в фоне функция «НачатьВыполнениеНаСервере». Разберем три строки этой процедуры.
В первой строке мы получаем структуру «ПараметрыВыполнения», используя функционал БСП. В формирование этой структуры мы передаем УникальныйИдентификатор формы, чтобы платформа знала, в какую форму возвращать результат.
Во второй строке мы формируем структуру параметров необходимых для выполнения нашей процедуры («ПараметрыПроцедуры»). В нашем примере для выполнения отчета необходимо знать только период, за который нужно сформировать отчет, если бы были дополнительные условия, их также нужно было бы поместить в эту структуру.
В третьей строке мы запускаем выполнение с помощью функции общего модуля «ДлительныеОперации», которая возвращает идентификатор запущенного фонового задания.
Процедура «ВывестиРезультатыНаФорму» выполняется только тогда, когда фоновое завершится и передаст результат выполнения. В нашем случае это табличный документ, помещенный во временное хранилище.
|
&НаКлиенте Процедура Сформировать(Команда)
ДлительнаяОперация = НачатьВыполнениеНаСервере(); ЭтаФорма.ИдентификаторЗадания = ДлительнаяОперация.ИдетификаторЗадания; ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); ОповещениеОЗавершении = Новый ОписаниеОповещения(«ВывестиРезультатыНаФорму», ЭтотОбъект); ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
КонецПроцедуры
&НаСервере Функция НачатьВыполнениеНаСервере()
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); ПараметрыПроцедуры = Новый Структура(«ПериодНачало,ПериодКонец», ЭтаФорма.ПериодНачало, ЭтаФорма.ПериодКонец); Возврат ДлительныеОперации.ВыполнитьПроцедуру(ПараметрыВыполнения, «Справочники.аи_КлассификацияРасходов.СформироватьОтчет», ПараметрыПроцедуры,ПараметрыВыполнения);
КонецФункции
&НаКлиенте Процедура ВывестиРезультатыНаФорму(Результат, ДополнительныеПараметры) Экспорт Если Результат = Неопределено Тогда Возврат; КонецЕсли;
табДокумент = ПолучитьИзВременногоХранилища(Результат.АдресХранилища); табДокумент.Показать(«Классификация расходов по статьям УУ»);
КонецПроцедуры |
Саму процедуру, выполняющую наш функционал (в нашем примере формирование табличного документа) необходимо перенести в модуль менеджера, сделав её экспортной и на вход принимающей 2 параметра.
|
&НаСервере Процедура СформироватьОтчет(ПараметрыПроцедуры, ПараметрыФоновогоЗадания) Экспорт … КонецПроцедуры |
В конце процедуры поместим наш табличный документ во временное хранилище, ссылку на которое передадим для возврата на форму.
|
… ПоместитьВоВременноеХранилище(табДокумент, ПараметрыФоновогоЗадания.АдресРезультата);
КонецПроцедуры |
В результате, добавив 10 строк кода и затратив 30 минут нашего времени, мы не заставляем пользователя ждать выполнения нашего кода и переходим на качественно новый уровень разработки. В этой статье я не осветил передачу статусов выполнения из фонового задания на форму, не осветил обработку ошибок при выполнении фонового задания. Это будет темой для следующих статей.
Результат выполнения в фоне
Специалист компании ООО "Кодерлайн"
Константин Маркин
