IE2017

Образец внешней обработки с длительной операцией на базе БСП 2.3 (Переработанная)

Обработки - Универсальные обработки

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

Ранее на этом месте было описание первого варианта такой обработки. Она была в сильно упрощённом виде, статья содержала код, с помощью которого можно было её сделать самостоятельно, не скачивая. Весь старый текст я оставлю. Там изложены некоторые размышления, которые бы я хотел оставить.

Сразу хочу обратить ваше внимание на то, что во внешних обработках самой БСП используется метод запуска команд обработки с помощью длительных операций.(ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне). Этот метод я опробовал, но не смог с его помощью отобразить прогресс выполнения. Только поэтому я от него отказался.

Итак, обработка содержит две длительные операции. Вот пример описания одной из них на форме:

&НаКлиенте
Процедура ДлительнаяОперация1(Команда)
	
	НаименованиеЗадания = НСтр("ru = 'Длительная операция 1'");	
	ПараметрыЗапуска = ПодготовитьДанныеДляДлительнойОперации1(УникальныйИдентификатор);
	ВыполнитьДлительнуюОперацию("ДлительнаяОперация1",ПараметрыЗапуска,НаименованиеЗадания);
	
КонецПроцедуры

// <Описание процедуры>
//
// Процедура возвращает адрес временного хранилища со структурой передаваемых парметров
// 
&НаСервереБезКонтекста
Функция ПодготовитьДанныеДляДлительнойОперации1(УникальныйИдентификатор)
	
	Возврат ПоместитьВоВременноеХранилище(Новый Структура("КоличествоСекунд",10),УникальныйИдентификатор);	
	
КонецФункции // ПодготовитьДанныеДляДлительнойОперации1()

Вот описание самой длительной процедуры в модуле объекта внешней обработки:

Процедура ДлительнаяОперация1(СтруктураПараметров, АдресРезультата) Экспорт
	ВремяНачала = ТекущаяДата();
	ВремяОкончания = ВремяНачала + СтруктураПараметров.КоличествоСекунд;
	Пока ТекущаяДата() < ВремяОкончания Цикл
		ПройденноеВремя = ТекущаяДата() - ВремяНачала;
		ПроцентВыполнения = (ПройденноеВремя/СтруктураПараметров.КоличествоСекунд)*100;
		Описание = "Выполнено "+ПройденноеВремя+" из "+СтруктураПараметров.КоличествоСекунд;
		ДлительныеОперации.СообщитьПрогресс(Окр(ПроцентВыполнения, 0), Описание);
	КонецЦикла;
		
	ПоместитьВоВременноеХранилище(Новый Структура("Сообщение,КодПоЗавершению","Длительная операция 1 завершена","ОбновитьЧтоНибудьНаКлиенте();"),АдресРезультата);
КонецПроцедуры

Таким образом во внешней обработке можно описать несколько таких операций, и не тратить время на описание логики запуска. Всё из коробочки.

Логика запуска сводится к тому, что в случае запуска из файл-открыть - обработка будет выполнять не в фоновом режиме, а напрямую, тем самым не составляя никаких проблем при отладке. В случае вызова обработки из справочника ДополнительныеОтчетыИОбработки в любом виде, с помощью стандартных процедур БСП(я обычно через расширения добавляю команды, где открываю форму обработки, полученную из выше указанного справочника пример кода ниже) процедуры отрабатывают в фоне, по фен-шую. Вот видео пример запуска обработки: http://screencast.com/t/a0MfuLQP2

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
	Структура = ПодлючитьДопОтчетОбработку("Дислокация");
	ОткрытьФорму("ВнешняяОбработка."+Структура.ИмяОтчета+".Форма",Новый Структура("ДополнительнаяОбработкаСсылка",Структура.Ссылка));
КонецПроцедуры

&НаСервере
Функция ПодлючитьДопОтчетОбработку(НаименованиеОбработки)
	Ссылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеОбработки);
	Возврат Новый Структура("ИмяОтчета,Ссылка",ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Ссылка),Ссылка);
КонецФункции

// ------------------------------------------------------------------------- Старый вариант статьи с размышлениями --------------------------------------------------

Вдохновлённый статьёй //infostart.ru/public/458778/, решил её применить. Правда, когда решился на это, замучался искать её среди методов предыдущего поколения (с дополнительными реквизитами в форме). Поскольку я стараюсь делать всё по максимуму внешними обработками, и как запускать процедуру внешней обработки этим методом, исходя из статьи, совсем неясно, пришлось поизучать код. Немного поковырявшись, выяснил, что БСП 2.3 без проблем это позволяет. Собрал обработку образец - проверил и выложил. Для того, чтобы собрать свою на основании указанной статьи, достаточно той функции, которую я выложил, если лень ковыряться - скачивайте. 

Добавляю видео работы для ознакомления http://www.screencast.com/t/12mPz9o1

Первый недостататок в том, что обработка должна запускаться в небезопасном режиме. В безопасном просто вываливается ошибка. Видимо это стандартное ограничение.  Второй в том, что в серверной функции формы, возвращающей фоновое задание, необходимо получать ссылку на элемент справочника ДополнительныеОтчетыИОбработки. Я пытался этого избежать, и причем БСП предусматривает обращение по имени подключенной внешней обработки, но по крайней мере в файловом варианте на платформе 8.3.9.1818 это не сработало. Причем это срабатывает при параметре запуска "РежимОтладки",  а без него нет. Метод ВнешниеОбработки.Создать(ИмяОбработки) прекрасно отрабатывает во всех случаях(на форме, и в "РежимОтладки") но только не в боевом случае. Вот код этой функции:


&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере()
	СтруктураПараметров = Новый Структура("КоличествоСекунд",10);	

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

  Если параметр ДополнительнаяОбработкаСсылка не будет заполнен, то внешняя обработка ищется по имени (Вариант использования ВнешниеОбработки.Создать()). Но в режиме запуска фонового задания, происходит ругань на то, что "файл не найден", хотя в серверной процедуре формы этот же метод, с таким же составом входящих параметров без проблем возвращает объектвнешняяобработка. Попахивает ошибкой платформы и я решил не упрямиться и просто дополнить ссылкой справочника ДополнительныеОтчетыИОбработки, так как времени выкладывать слово "вечность" из букв "1" и "С" нет, прошу понять и простить.

Скачать файлы

Наименование Файл Версия Размер
ДлительнаяОперация23.epf
.epf 8,72Kb
30.11.16
33
.epf 8,72Kb 33 Скачать

См. также

В этой теме еще нет сообщений.
Оставьте свое сообщение