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

15.12.16

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

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

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

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

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

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

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

&НаКлиенте
Процедура ДлительнаяОперация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 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Розница 3.0 Абонемент ($m)

Часто нужно ограничить дополнительные отчеты по видимости для разных пользователей. В "варианте отчета" для дополнительного отчета (БСП) можно указать конкретных пользователей, которым доступен данный вариант. Но данная настройка не срабатывает, т.к. варианты дополнительных отчетов считаются "предопределенными".

1 стартмани

14.09.2023    352    1    itmind    0    

10

Оптимизация персонализированных рассылок отчетов в БСП

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

Представленная в публикации разработка позволяет оптимизировать персонализированную рассылку отчетов БСП за счет предварительной выборки получателей отчетов.

1 стартмани

10.07.2023    825    0    Sirruf    0    

3

Снова об использовании ТекущаяДата() на клиенте и на сервере и о работе в разных часовых поясах

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

Можно ли применять ТекущаяДата() вопреки требованиям стандартов 1С? Безопасно ли использование функции ОбщегоНазначенияКлиент.ДатаСеанса() из БСП? Как правильно поступать при работе пользователей в разных часовых поясах?

24.04.2023    5651    Alxby    26    

45

Печать в WORD при помощи БСП. Вывод уникальных ссылок в строки таблицы

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

Пример вывода уникальных ссылок в строку таблицы макета WORD при печати с помощью БСП. Может быть полезна при создании интерактивных прайсов.

03.04.2023    1292    user1575928    0    

18

Учим БСП печатать активные ссылки и подложку в документе WORD

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

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

1 стартмани

13.03.2023    1644    4    user1575928    0    

7

Многопоточное выполнение процедуры с помощью ДлительныеОперации

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

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

1 стартмани

26.02.2023    6230    egoriy111    24    

79
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 55 29.05.19 12:53 Сейчас в теме
Скачал, запускаю. Нажимаю кнопки. Никаких процентов не вижу. Ничего не происходит. Только во втором случае сообщение об ошибке выходит (пример). Полагал использовать, но ничего не понятно. Что делать?
7. ЕСТЬNULL 199 30.05.19 01:36 Сейчас в теме
Проценты показываются если запустить обработку из с помощью стандартного механизма внешних обработок. То есть обработку надо поместить в "Дополнительные отчеты и обработки", и запустить её прямо оттуда или с помощью кода, который приведён в тексте статьи.
При показе процентов неудобно производить отладку.
8. RocKeR_13 1244 29.11.19 16:23 Сейчас в теме
Если хотим, чтобы запускалась в фоне обработка даже без добавления в справочник внешних обработок, то в ПараметрыЗадания передаем в качестве ИмяОбработки путь к открытой внешней обработке:

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


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

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

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

2.

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

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

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

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

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

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

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

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

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

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

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

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