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

15.12.16

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ДлительнаяОперация23.epf
.epf 8,72Kb
217
217 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

См. также

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

Синтакс-помощник БСП - cправочник по библиотекам стандартных подсистем и электронных документов. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП и БЭД.

1800 руб.

21.11.2024    3655    16    15    

18

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

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

27.12.2024    3450    PROSTO-1C    15    

43

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

Синтакс-помощник БСП - справочник по Библиотеке Стандартных Подсистем, профессиональный инструмент разработчика с интуитивно понятным интерфейсом. Читайте в статье как использовать все возможности справочника и сделать работу с БСП более комфортной и эффективной.

11.12.2024    3907    gorenski    0    

8

БСП (Библиотека стандартных подсистем) Менеджеры внешних отчетов Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом Абонемент ($m)

За последние лет 5 несколько раз сталкиваюсь с проблемой на разных проектах (в конфигурациях 1С:ERP, 1С:ERP УХ и многих других, основанных на БСП), когда много пользователей (около 30 тысяч) в информационной базе, время добавления доступа для пользователей занимает значительное время. Открытие списка занимает от 10 до 15 секунд, и каждое изменение списка еще примерно столько же.

1 стартмани

10.12.2024    997    Iaskeliainen    2    

7

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

Некоторые нюансы, если вы захотите создавать свои расширения. Доработка отчета "Связанные документы" для отражения документов расширения. Печатные формы с шаблоном Word.

20.11.2024    3345    milkers    3    

12

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

В статье описан алгоритм для включения документа или справочника в систему БСП. Будет полезно программистам 1С, начинающим работать с БСП.

24.10.2024    1688    PROSTO-1C    0    

18

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

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    1375    PROSTO-1C    4    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 208 30.05.19 01:36 Сейчас в теме
Проценты показываются если запустить обработку из с помощью стандартного механизма внешних обработок. То есть обработку надо поместить в "Дополнительные отчеты и обработки", и запустить её прямо оттуда или с помощью кода, который приведён в тексте статьи.
При показе процентов неудобно производить отладку.
8. RocKeR_13 1378 29.11.19 16:23 Сейчас в теме
Если хотим, чтобы запускалась в фоне обработка даже без добавления в справочник внешних обработок, то в ПараметрыЗадания передаем в качестве ИмяОбработки путь к открытой внешней обработке:

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


При этом ключ ДополнительнаяОбработкаСсылка вообще не заполняем
adhocprog; +1 Ответить
12. ЕСТЬNULL 208 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 208 25.02.20 15:23 Сейчас в теме
(10)
в ОбработкаПросто я должен засунуть функционал из ОбработкаШаблон.

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

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

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

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

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