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

15.12.16

Разработка - БСП (Библиотека стандартных подсистем)

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

Скачать исходный код

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

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

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

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

&НаКлиенте
Процедура ДлительнаяОперация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" и "С" нет, прошу понять и простить.

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

См. также

БСП. Добавляем отчет в меню Отчеты

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Добавим новый отчет в меню нового документа средствами БСП.

02.04.2024    3063    John_d    10    

88

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

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

01.03.2024    1643    dimanich70    8    

14

Заполнение поля адреса в своей обработке [БСП]

Механизмы платформы 1С БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Небольшая шпаргалка по функциям БСП касательно адреса. Так скажем, еще один способ помимо https://infostart.ru/1c/articles/1060970/

12.02.2024    775    FilippovRI    0    

15

Расширяем возможности дополнительных обработок и настраиваем их отладку

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2568    YA_418728146    11    

42

1С:БСП Дополнительные реквизиты и сведения

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Бесплатно (free)

В этой статье расскажем об архитектуре, использовании и особенностях реализации подсистемы «Свойства» из инструментария разработчика «1С:Библиотека стандартных подсистем» (1С: БСП).

19.01.2024    6088    PROSTO-1C    5    

46

Бесплатный митап 9 февраля «Библиотеки и фреймворки на 1С и всё, что с этим связано»

БСП (Библиотека стандартных подсистем) Мероприятия Бесплатно (free)

Митап посвящен вопросам создания, использования и поддержке переиспользуемого кода при разработке решений на платформе 1С:Предприятие 8.

15.01.2024    3882    0    Infostart    0    

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

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

Что там ?
i.miheev; bilex; maxvcb; user1588523; devonec_team; BFT; Dmi|MiX; doublepuffer; letzteKraft; +9 Ответить
3. пользователь 04.12.17 02:45
Сообщение было скрыто модератором.
...
4. Nuuq 76 31.03.19 21:50 Сейчас в теме
Скачал, у себя применил - работает - отладка через "Файл - Открыть" без фонового режима, а открывая обработку из справочника ДополнительныеОтчетыИОбработки работает в фоне.
А вот как выводить сообщения пользователю в форме обработки из процедуры модуля Процедура ДлительнаяОперация1(СтруктураПараметров, АдресРезультата) Экспорт ?
5. Nuuq 76 31.03.19 22:23 Сейчас в теме
(4) Разобрался - нужно просто в параметрах установить "ПараметрыОжидания.ВыводитьСообщения = Истина;". Дальше стандартная функция ДлительныеОперацииКлиент.ОжидатьЗавершение сама все сделает.
Спасибо за обработку!
adhocprog; +1 Ответить
6. burgomister 59 29.05.19 12:53 Сейчас в теме
Скачал, запускаю. Нажимаю кнопки. Никаких процентов не вижу. Ничего не происходит. Только во втором случае сообщение об ошибке выходит (пример). Полагал использовать, но ничего не понятно. Что делать?
7. ЕСТЬNULL 206 30.05.19 01:36 Сейчас в теме
Проценты показываются если запустить обработку из с помощью стандартного механизма внешних обработок. То есть обработку надо поместить в "Дополнительные отчеты и обработки", и запустить её прямо оттуда или с помощью кода, который приведён в тексте статьи.
При показе процентов неудобно производить отладку.
8. RocKeR_13 1321 29.11.19 16:23 Сейчас в теме
Если хотим, чтобы запускалась в фоне обработка даже без добавления в справочник внешних обработок, то в ПараметрыЗадания передаем в качестве ИмяОбработки путь к открытой внешней обработке:

&НаСервере
Функция ИспользуемоеИмяФайла()
	
	ЭтотОб = РеквизитФормыВЗначение("Объект");
	Возврат ЭтотОб.ИспользуемоеИмяФайла;
	
КонецФункции


При этом ключ ДополнительнаяОбработкаСсылка вообще не заполняем
adhocprog; +1 Ответить
12. ЕСТЬNULL 206 25.02.20 15:26 Сейчас в теме
(8)
День добрый, а полную методику где почитать? Или пример. Тоже хочу без регистрации в доп обработках.
9. Tommy82 65 21.02.20 15:05 Сейчас в теме
Коллеги, пожалуйста, об'ясните суть.
Есть у меня, например, обработка.
по кнопке примитивный запрос к номенклатуре.

Я скачал обработку от автора, но не могу понять как это всё связать со своей обработкой.

1. Зарегистрировал от автора внешнюю обработку с ДО в ДополнительныеОтчетахИОбработках.
оттуда проверил, ок, работает, статус-бар показывает.

2.

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

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

теперь как это связать с моей обработкой по номенклатуре?!?!

Эти две процедуры куда вешать?!

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

и чего получается - открывается форма обработки автора...

помогите, пожалуйста, очень хочу статус-бар видеть, надоело без него.
8.3.16.1063, БП 3.0.75.70
10. Tommy82 65 21.02.20 15:16 Сейчас в теме
я не понимаю как это работает
Есть обработка от автора - это шаблон вывода статус-бара (ОбработкаШаблон)
Есть обработка, для которой нужен статус-бар (ОбработкаПросто)
Что и как нужно сделать?!
Из ОбработкаПросто я должен передавать параметры для ОбработкаШаблон?!
ИЛИ
в ОбработкаПросто я должен засунуть функционал из ОбработкаШаблон?!?!?!??!
ИЛИ
вообще не так всё я понимаю?
11. ЕСТЬNULL 206 25.02.20 15:23 Сейчас в теме
(10)
в ОбработкаПросто я должен засунуть функционал из ОбработкаШаблон.

В форме есть клиентская функция ДлительнаяОперация1. Она вызывает экспортную процедуру ДлительнаяОперация1 из модуля ОБЪЕКТА процедуру.

То есть вы готовите данные на форме, на клиенте. Можете добавить данных с сервера без контекста (там есть пример), хотите - можете с контекстом. Передаёте всё как в примере в ПараметрыЗапуска, и потом эти параметры оказываются в процедуре ДлительнаяОперация1 в модуле ОБЪЕКТА.( может вы не знаете как попасть в модуль объекта внешней обработки?) - это не шутка. Прикладываю как.
Прикрепленные файлы:
15. MaxWalker 15.04.20 16:41 Сейчас в теме
(11)
Каким образом оно работает из модуля объекта?
Цитата с ИТС:
Код, выполняющий длительную обработку данных, располагается в модуле менеджера объекта

Из процедуры "ВыполнитьВФоне" вызывается процедура "ВыполнитьМетодКонфигурации", в описании которой также сказано
...<имя объекта>.<имя процедуры>, где <имя объекта> - это общий модуль или модуль менеджера объекта
16. ЕСТЬNULL 206 17.04.20 02:52 Сейчас в теме
(15)
Это чудеса БСП. Вы можете взять отладчик и посмотреть как именно это работает.
13. ЕСТЬNULL 206 25.02.20 15:31 Сейчас в теме
Или, если хотите вставить в свою обработину, вставьте на форму код области ПрограммныйИнтерфейсДО, создайте КЛЮЧЕВОЙ параметр формы ДополнительнаяОбработкаСсылка типа СправочникСсылка.ДополнительныеОтчетыИОбработки, и вызывайте из клиентской процедуры например так:

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

Этот код вызовет процедуру ДлительнаяОперация1 из модуля объекта или с прогресс баром, если обработка загружена в ДополнительныеОтчетыИОбработки, или без него, но с отладкой, если запущена просто как внешняя, из файла.
adhocprog; +1 Ответить
14. Tommy82 65 25.02.20 17:08 Сейчас в теме
(13) Спасибо, обязательно попробую
Оставьте свое сообщение