Фоновые задания через внешную обработку

1. svvida 01.08.19 12:55 Сейчас в теме
Добрый день.
У меня есть дополнительная внешняя обработка (подкюченая через БСП) в ней есть команда, которая по расписанию обходит последовательно некоторые базы (заданные в параметрах обработки) и совершает с ними обмен на основе методов обработки. Теперь есть желание, чтобы обход баз происходил параллельно, т. е. одним рег. заданием, которое порождало несколько фоновых, для каждой базы отдельно. Однако упёрся в то, что фоновое задание выполняет экспортный метод общего модуля, а я хотел выполнить метод обработки. Что можете посоветовать?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VmvLer 01.08.19 12:58 Сейчас в теме
что мешает создать свой метод?
3. YannikAlx 28 01.08.19 13:22 Сейчас в теме
Параллельно - это это совершенно не значит одним рег. заданием, которое порождало несколько фоновых...
Кто вам мешает запускать параллельно фоновые задания из своей обработки, которые будут выполнять методы вашей обработки?
ЗаданиеРезультат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(.......


Либо мы тут не поняли суть вопроса...
4. svvida 01.08.19 16:03 Сейчас в теме
Никто мне не мешает так, я даже так сделал. Создал отдельное рег. задание для каждой базы. Но это не очень хорошо, когда так много рег. заданий, отслеживать не удобно. Тем более бывает, что отправляемся в базы информация одна и та же. Поэтому и интересует этот вопрос.
8. YannikAlx 28 01.08.19 16:18 Сейчас в теме
(4) Для чего вы делает Рег задания?
В чем смысл именно их использования для вас?
Запускайте свою обработку по расписанию а она пусть формирует фоновые задания ...
5. svvida 01.08.19 16:14 Сейчас в теме
(3)Обработка создана для подключения через дополнительные обработки, с использование команд через рег. задания.
7. YannikAlx 28 01.08.19 16:16 Сейчас в теме
(5) Что это меняет?
Моя обработка тоже внесена в дополнительные и именно оттуда запускает свои потоки при обработке документов
9. RustamZz 01.08.19 16:22 Сейчас в теме
(7) С клиента запускает или с сервера?
11. YannikAlx 28 01.08.19 16:25 Сейчас в теме
(9) Из модуля формы запускает серверную процедуру , см (10)
12. YannikAlx 28 01.08.19 16:27 Сейчас в теме
13. svvida 01.08.19 17:34 Сейчас в теме
(7) В модуле моей обработки есть команда, которая по расписанию выполняет обмен (благодаря созданию рег. задания и пораждаемого фонового задания используя функционал БСП для подключаемых обработк). Метод который вызывается содержится тоже в обработке.
И хотелось типовыми функциями БСП в момент перебора баз создавать фоновые задания и передавать и этот метод обработки.
14. YannikAlx 28 01.08.19 17:41 Сейчас в теме
(13) Вы можете четко сформулировать в чем ваша проблема и чего вы хотите добиться?
Текст в описании темы я бы сказал несколько размыт.

Вам уже и так и сяк советую запускайте методы своей обработки в фоновом режиме - никаких препятствий этому нет.
Но вы снова и снова возвращаетесь зачем-то к Рег заданиям...
15. svvida 01.08.19 17:55 Сейчас в теме
(14)Вы когда подключат свою обработку расписание где у Вас хранится? Чтобы создавались ваши фоновые задания потоком.... И кто их интересует, как не рег.задание, чтобы не каждый раз эту обработку вручную...
16. YannikAlx 28 01.08.19 18:08 Сейчас в теме
(15) Не будем детализировать что где хранится...

Вы сказали , что
упёрся в то, что фоновое задание выполняет экспортный метод общего модуля

Я вам пытаюсь объяснить что нет там этого барьера...
Либо это не барьер и не мешает использованию фоновых заданий из внешней обработки по расписанию...
17. YannikAlx 28 01.08.19 18:16 Сейчас в теме
(15) Вы настраиваете расписание в форме регистрации Дополнительной обработки.
Серверная Команда будет выполняться по расписанию как и Рег задание (для клиент-серверного варианта) .
А дальше ваша задача наполнить параметры вашей команды необходимыми данными для ее выполнения хоть в фоне хоть без фона
18. svvida 01.08.19 18:41 Сейчас в теме
(17)так в этом и заключается вопрос, как в моей северной команде создать поток фоновых заданий, которые вызывали методы моей внешней обработки... Из Вашего рассуждения я не могу понять как мне преодолеть барьер, не используя возможность размещения метода в общем модуле...
19. YannikAlx 28 02.08.19 09:04 Сейчас в теме
(18) Без какой процедуры модуля в общем модуле у вас не получается?

Я же привел пример в (10) где вызывается стандартный метод , который запускает процедуру из модуля объекта моей доп обработки ...
Никаких Общих модулей...

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


Вот кусок процедуры из модуля Доп Обработки, который непосредственно производит все манипуляции с базой , может в фоне , может без фона (например если обработку не подключать как Дополнительную - фон осуществить не удастся)

#Область ПроцедурыФоновыхЗаданий

Процедура ВыполнитьКоманду(ИдентификаторКоманды="", ПараметрыВыполненияКоманды="",Параметры="") Экспорт
	счИндификатора=0;
	Склад_="";
	НовоеВремя= ПараметрыВыполненияКоманды.НовоеВремя;
	НовыйПрефикс_= ПараметрыВыполненияКоманды.НовыйПрефикс;
	ПроводитьВыбранные_= ПараметрыВыполненияКоманды.ПроводитьВыбранные;
	ОтменятьПроведение_= ПараметрыВыполненияКоманды.ОтменятьПроведение;
	ПЕРЕПроведение_= ПараметрыВыполненияКоманды.ПЕРЕПроведение;
	ПометитьНаУдаление_= ПараметрыВыполненияКоманды.ПометитьНаУдаление;
	СнятьПометкуНаУдаление_= ПараметрыВыполненияКоманды.СнятьПометкуНаУдаление;
	ОстанавливатьсяПоОшибке_= ПараметрыВыполненияКоманды.ОстанавливатьсяПоОшибке;
	ИзменятьВремя_= ПараметрыВыполненияКоманды.ИзменятьВремя;
	ИсправитьПрефикс_= ПараметрыВыполненияКоманды.ИсправитьПрефикс;
	ФоноваяОбработка_= ПараметрыВыполненияКоманды.ФоноваяОбработка;
	ПотокиПоСкладу_= ПараметрыВыполненияКоманды.ПотокиПоСкладу;
	Если ИдентификаторКоманды = "КоммандаВыполнитьОбработку" Тогда
		Если ПараметрыВыполненияКоманды.Свойство("Операция") Тогда
			Если ПараметрыВыполненияКоманды.Операция = "Обработать" Тогда
				Если ФоноваяОбработка_ тогда 
					ЭтотОбъект.ТаблицаДокументовДляОбработки.Загрузить(ЗначениеИзСтрокиВнутр(ПараметрыВыполненияКоманды.Таблица).Получить());
				КонецЕсли;
				Для каждого Строка Из ЭтотОбъект.ТаблицаДокументовДляОбработки Цикл
					Если НЕ Строка.Пометка Тогда Продолжить;КонецЕсли;
					Документ = Строка.Документ.ПолучитьОбъект();
					
					Если ИзменятьВремя_ Тогда
						Документ.Дата= Дата(Год(Документ.Дата),Месяц(Документ.Дата),День(Документ.Дата),Час(НовоеВремя),Минута(НовоеВремя),Секунда(НовоеВремя));	
					КонецЕсли; 
#Область ______________ЗАМЕНА_ПРЕФИКСОВ					
												
					Если ИсправитьПрефикс_ Тогда
						НомерБезПрефикса=НомерБезПрефикса(Документ.Номер);
						Если НЕ ПустаяСтрока(НовыйПрефикс_) Тогда
														
							НомерБезПрефикса=НомерБезПрефикса(Документ.Номер);
							
									Документ.Номер=НовыйПрефикс_+"-"+НомерБезПрефикса	;
						КонецЕсли;
					КонецЕсли;
#КонецОбласти						
				Попытка
Показать
6. RustamZz 01.08.19 16:14 Сейчас в теме
На клиенте легко:
Обработчик = Новый ОписаниеОповещения("ОжидатьЗавершениеПроведение", ЭтотОбъект);
	
ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(ОбъектСсылка);
Для Каждого Элемент Из МассивСтруктур Цикл
		ПараметрыКоманды.Вставить("ДатаНачала",	   Элемент.ДатаНачала);
		ПараметрыКоманды.Вставить("ДатаОкончания", Элемент.ДатаОкончания);
		ПараметрыКоманды.Вставить("Организация",   Объект.Организация);
		ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выполняется проведение за период с "
													+ Формат(Элемент.ДатаНачала,	"ДЛФ=D") + " по "
													+ Формат(Элемент.ДатаОкончания, "ДЛФ=D") + "...'");
		ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне("ПровестиДокументы", ПараметрыКоманды, Обработчик);
КонецЦикла;
Показать

на сервере пока не получилось найти решение. Написал что бы подписаться на тему.
10. YannikAlx 28 01.08.19 16:22 Сейчас в теме
(6) какое решение вы ищете на сервере?

Фон запускается на сервере....

&НаСервере
Процедура ЗапуститьВФоне(Таб,УникальныйИдентификатор,ПараметрыЗапускаФоновогоЗаданияДляВыполнения="",Поток="")
	Если ПараметрыЗапускаФоновогоЗаданияДляВыполнения="" Тогда
		ПараметрыЗапускаФоновогоЗаданияДляВыполнения = Параметры.ПараметрыЗапуска;
	КонецЕсли;
	
	Если ПараметрыЗапускаФоновогоЗаданияДляВыполнения.Свойство("Таблица") Тогда
		
	
		Если НЕ Поток="" Тогда
			РазобраннаяТаблица = Таб;
			ПараметрыЗапускаФоновогоЗаданияДляВыполнения.Таблица = ЗначениеВСтрокуВнутр(Новый ХранилищеЗначения(РазобраннаяТаблица, Новый СжатиеДанных(9)));	
		КонецЕсли;
		
	КонецЕсли;
	
	ЗаданиеРезультат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
	УникальныйИдентификатор,
	"ДополнительныеОтчетыИОбработки.ВыполнитьКоманду", 
	ПараметрыЗапускаФоновогоЗаданияДляВыполнения,
	СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
	НСтр("ru = 'Выполнение дополнительного отчета или обработки ""%1"", имя команды ""%2""'"),
	Строка(ПараметрыЗапускаФоновогоЗаданияДляВыполнения.ДополнительнаяОбработкаСсылка),
	ПараметрыЗапускаФоновогоЗаданияДляВыполнения.ИдентификаторКоманды));
	
	Выполнено = ЗаданиеРезультат.ЗаданиеВыполнено;
	ВызваноИсключение = Ложь;
	
	Если Выполнено Тогда
		Результат = ПолучитьИзВременногоХранилища(ЗаданиеРезультат.АдресХранилища);
	Иначе
		СтрокаФЗ = ТаблицаФоновыхЗаданий.Добавить();
		СтрокаФЗ.ФоновоеЗаданиеИдентификатор  = ЗаданиеРезультат.ИдентификаторЗадания;
		СтрокаФЗ.ФоновоеЗаданиеАдресХранилища = ЗаданиеРезультат.АдресХранилища;
		СтрокаФЗ.ФоновоеЗаданиеПроверитьПриЗакрытии = Истина;
		СтрокаФЗ.МаксимальноеЗначение = ?(РазобраннаяТаблица=Неопределено,0,РазобраннаяТаблица.Количество());
		
		СтрокаФЗ.ТипЗадания = ПараметрыЗапускаФоновогоЗаданияДляВыполнения.Операция;
		СтрокаФЗ.НомерИндикатора = Поток;
		
	КонецЕсли;
	
	ПараметрыЗапускаФоновогоЗаданияДляВыполнения="";	
КонецПроцедуры
Показать
RustamZz; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот