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

Публикация № 564617

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

Длительная операция внешняя обработка ВыполнитьВФоне ВнешняяОбработка ВнешниеОбработки

32
Переработанная внешняя обработка для запуска длительных операций на базе БСП 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" и "С" нет, прошу понять и простить.

32

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

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

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. andreymazurovdwine 29.11.17 21:53 Сейчас в теме
Спасибо! Очень своевременная статься.. а то на те же грабли наступал с Внешней обработкой и выводом прогресс бара..
2. Err0r 03.12.17 21:57 Сейчас в теме
Обработку скачать не могу :(

В статье не приведен код для процедуры
ВыполнитьДлительнуюОперацию

Что там ?
doublepuffer; letzteKraft; +2 Ответить
4. Nuuq 69 31.03.19 21:50 Сейчас в теме
Скачал, у себя применил - работает - отладка через "Файл - Открыть" без фонового режима, а открывая обработку из справочника ДополнительныеОтчетыИОбработки работает в фоне.
А вот как выводить сообщения пользователю в форме обработки из процедуры модуля Процедура ДлительнаяОперация1(СтруктураПараметров, АдресРезультата) Экспорт ?
5. Nuuq 69 31.03.19 22:23 Сейчас в теме
(4) Разобрался - нужно просто в параметрах установить "ПараметрыОжидания.ВыводитьСообщения = Истина;". Дальше стандартная функция ДлительныеОперацииКлиент.ОжидатьЗавершение сама все сделает.
Спасибо за обработку!
6. burgomister 3 29.05.19 12:53 Сейчас в теме
Скачал, запускаю. Нажимаю кнопки. Никаких процентов не вижу. Ничего не происходит. Только во втором случае сообщение об ошибке выходит (пример). Полагал использовать, но ничего не понятно. Что делать?
7. ЕСТЬNULL 147 30.05.19 01:36 Сейчас в теме
Проценты показываются если запустить обработку из с помощью стандартного механизма внешних обработок. То есть обработку надо поместить в "Дополнительные отчеты и обработки", и запустить её прямо оттуда или с помощью кода, который приведён в тексте статьи.
При показе процентов неудобно производить отладку.
Оставьте свое сообщение