Фоновые задания через внешную обработку
Добрый день.
У меня есть дополнительная внешняя обработка (подкюченая через БСП) в ней есть команда, которая по расписанию обходит последовательно некоторые базы (заданные в параметрах обработки) и совершает с ними обмен на основе методов обработки. Теперь есть желание, чтобы обход баз происходил параллельно, т. е. одним рег. заданием, которое порождало несколько фоновых, для каждой базы отдельно. Однако упёрся в то, что фоновое задание выполняет экспортный метод общего модуля, а я хотел выполнить метод обработки. Что можете посоветовать?
У меня есть дополнительная внешняя обработка (подкюченая через БСП) в ней есть команда, которая по расписанию обходит последовательно некоторые базы (заданные в параметрах обработки) и совершает с ними обмен на основе методов обработки. Теперь есть желание, чтобы обход баз происходил параллельно, т. е. одним рег. заданием, которое порождало несколько фоновых, для каждой базы отдельно. Однако упёрся в то, что фоновое задание выполняет экспортный метод общего модуля, а я хотел выполнить метод обработки. Что можете посоветовать?
По теме из базы знаний
- Отслеживание выполнения фонового задания
- Фоновые задания: быстро получить большие данные в 1С
- Запуск фонового задания во внешней обработке без регистрации в справочнике "Дополнительные отчеты и обработки"
- Эффективное управление фоновыми заданиями и коммуникация сеансов сервера с Фоном с помощью Структуры обмена (ноу-хау) + Бонус: Альтернативный вариант через Хранилище настроек
- Запуск внешней обработки фоном БСП
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Параллельно - это это совершенно не значит одним рег. заданием, которое порождало несколько фоновых...
Кто вам мешает запускать параллельно фоновые задания из своей обработки, которые будут выполнять методы вашей обработки?
Либо мы тут не поняли суть вопроса...
Кто вам мешает запускать параллельно фоновые задания из своей обработки, которые будут выполнять методы вашей обработки?
ЗаданиеРезультат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(.......
Либо мы тут не поняли суть вопроса...
Никто мне не мешает так, я даже так сделал. Создал отдельное рег. задание для каждой базы. Но это не очень хорошо, когда так много рег. заданий, отслеживать не удобно. Тем более бывает, что отправляемся в базы информация одна и та же. Поэтому и интересует этот вопрос.
(7) В модуле моей обработки есть команда, которая по расписанию выполняет обмен (благодаря созданию рег. задания и пораждаемого фонового задания используя функционал БСП для подключаемых обработк). Метод который вызывается содержится тоже в обработке.
И хотелось типовыми функциями БСП в момент перебора баз создавать фоновые задания и передавать и этот метод обработки.
И хотелось типовыми функциями БСП в момент перебора баз создавать фоновые задания и передавать и этот метод обработки.
(13) Вы можете четко сформулировать в чем ваша проблема и чего вы хотите добиться?
Текст в описании темы я бы сказал несколько размыт.
Вам уже и так и сяк советую запускайте методы своей обработки в фоновом режиме - никаких препятствий этому нет.
Но вы снова и снова возвращаетесь зачем-то к Рег заданиям...
Текст в описании темы я бы сказал несколько размыт.
Вам уже и так и сяк советую запускайте методы своей обработки в фоновом режиме - никаких препятствий этому нет.
Но вы снова и снова возвращаетесь зачем-то к Рег заданиям...
(15) Не будем детализировать что где хранится...
Вы сказали , что
Я вам пытаюсь объяснить что нет там этого барьера...
Либо это не барьер и не мешает использованию фоновых заданий из внешней обработки по расписанию...
Вы сказали , что
упёрся в то, что фоновое задание выполняет экспортный метод общего модуля
Я вам пытаюсь объяснить что нет там этого барьера...
Либо это не барьер и не мешает использованию фоновых заданий из внешней обработки по расписанию...
(15) Вы настраиваете расписание в форме регистрации Дополнительной обработки.
Серверная Команда будет выполняться по расписанию как и Рег задание (для клиент-серверного варианта) .
А дальше ваша задача наполнить параметры вашей команды необходимыми данными для ее выполнения хоть в фоне хоть без фона
Серверная Команда будет выполняться по расписанию как и Рег задание (для клиент-серверного варианта) .
А дальше ваша задача наполнить параметры вашей команды необходимыми данными для ее выполнения хоть в фоне хоть без фона
(17)так в этом и заключается вопрос, как в моей северной команде создать поток фоновых заданий, которые вызывали методы моей внешней обработки... Из Вашего рассуждения я не могу понять как мне преодолеть барьер, не используя возможность размещения метода в общем модуле...
(18) Без какой процедуры модуля в общем модуле у вас не получается?
Я же привел пример в (10) где вызывается стандартный метод , который запускает процедуру из модуля объекта моей доп обработки ...
Никаких Общих модулей...
Вот кусок процедуры из модуля Доп Обработки, который непосредственно производит все манипуляции с базой , может в фоне , может без фона (например если обработку не подключать как Дополнительную - фон осуществить не удастся)
Я же привел пример в (10) где вызывается стандартный метод , который запускает процедуру из модуля объекта моей доп обработки ...
Никаких Общих модулей...
ЗаданиеРезультат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
"ДополнительныеОтчетыИОбработки.ВыполнитьКоманду",
ПараметрыЗапускаФоновогоЗаданияДляВыполнения,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Выполнение дополнительного отчета или обработки ""%1"", имя команды ""%2""'"),
Строка(ПараметрыЗапускаФоновогоЗаданияДляВыполнения.ДополнительнаяОбработкаСсылка),
ПараметрыЗапускаФоновогоЗаданияДляВыполнения.ИдентификаторКоманды));
Вот кусок процедуры из модуля Доп Обработки, который непосредственно производит все манипуляции с базой , может в фоне , может без фона (например если обработку не подключать как Дополнительную - фон осуществить не удастся)
#Область ПроцедурыФоновыхЗаданий
Процедура ВыполнитьКоманду(ИдентификаторКоманды="", ПараметрыВыполненияКоманды="",Параметры="") Экспорт
счИндификатора=0;
Склад_="";
НовоеВремя= ПараметрыВыполненияКоманды.НовоеВремя;
НовыйПрефикс_= ПараметрыВыполненияКоманды.НовыйПрефикс;
ПроводитьВыбранные_= ПараметрыВыполненияКоманды.ПроводитьВыбранные;
ОтменятьПроведение_= ПараметрыВыполненияКоманды.ОтменятьПроведение;
ПЕРЕПроведение_= ПараметрыВыполненияКоманды.ПЕРЕПроведение;
ПометитьНаУдаление_= ПараметрыВыполненияКоманды.ПометитьНаУдаление;
СнятьПометкуНаУдаление_= ПараметрыВыполненияКоманды.СнятьПометкуНаУдаление;
ОстанавливатьсяПоОшибке_= ПараметрыВыполненияКоманды.ОстанавливатьсяПоОшибке;
ИзменятьВремя_= ПараметрыВыполненияКоманды.ИзменятьВремя;
ИсправитьПрефикс_= ПараметрыВыполненияКоманды.ИсправитьПрефикс;
ФоноваяОбработка_= ПараметрыВыполненияКоманды.ФоноваяОбработка;
ПотокиПоСкладу_= ПараметрыВыполненияКоманды.ПотокиПоСкладу;
Если ИдентификаторКоманды = "КоммандаВыполнитьОбработку" Тогда
Если ПараметрыВыполненияКоманды.Свойство("Операция") Тогда
Если ПараметрыВыполненияКоманды.Операция = "Обработать" Тогда
Если ФоноваяОбработка_ тогда
ЭтотОбъект.ТаблицаДокументовДляОбработки.Загрузить(ЗначениеИзСтрокиВнутр(ПараметрыВыполненияКоманды.Таблица).Получить());
КонецЕсли;
Для каждого Строка Из ЭтотОбъект.ТаблицаДокументовДляОбработки Цикл
Если НЕ Строка.Пометка Тогда Продолжить;КонецЕсли;
Документ = Строка.Документ.ПолучитьОбъект();
Если ИзменятьВремя_ Тогда
Документ.Дата= Дата(Год(Документ.Дата),Месяц(Документ.Дата),День(Документ.Дата),Час(НовоеВремя),Минута(НовоеВремя),Секунда(НовоеВремя));
КонецЕсли;
#Область ______________ЗАМЕНА_ПРЕФИКСОВ
Если ИсправитьПрефикс_ Тогда
НомерБезПрефикса=НомерБезПрефикса(Документ.Номер);
Если НЕ ПустаяСтрока(НовыйПрефикс_) Тогда
НомерБезПрефикса=НомерБезПрефикса(Документ.Номер);
Документ.Номер=НовыйПрефикс_+"-"+НомерБезПрефикса ;
КонецЕсли;
КонецЕсли;
#КонецОбласти
Попытка
Показать
На клиенте легко:
на сервере пока не получилось найти решение. Написал что бы подписаться на тему.
Обработчик = Новый ОписаниеОповещения("ОжидатьЗавершениеПроведение", ЭтотОбъект);
ПараметрыКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(ОбъектСсылка);
Для Каждого Элемент Из МассивСтруктур Цикл
ПараметрыКоманды.Вставить("ДатаНачала", Элемент.ДатаНачала);
ПараметрыКоманды.Вставить("ДатаОкончания", Элемент.ДатаОкончания);
ПараметрыКоманды.Вставить("Организация", Объект.Организация);
ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Выполняется проведение за период с "
+ Формат(Элемент.ДатаНачала, "ДЛФ=D") + " по "
+ Формат(Элемент.ДатаОкончания, "ДЛФ=D") + "...'");
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне("ПровестиДокументы", ПараметрыКоманды, Обработчик);
КонецЦикла;
Показатьна сервере пока не получилось найти решение. Написал что бы подписаться на тему.
(6) какое решение вы ищете на сервере?
Фон запускается на сервере....
Фон запускается на сервере....
&НаСервере
Процедура ЗапуститьВФоне(Таб,УникальныйИдентификатор,ПараметрыЗапускаФоновогоЗаданияДляВыполнения="",Поток="")
Если ПараметрыЗапускаФоновогоЗаданияДляВыполнения="" Тогда
ПараметрыЗапускаФоновогоЗаданияДляВыполнения = Параметры.ПараметрыЗапуска;
КонецЕсли;
Если ПараметрыЗапускаФоновогоЗаданияДляВыполнения.Свойство("Таблица") Тогда
Если НЕ Поток="" Тогда
РазобраннаяТаблица = Таб;
ПараметрыЗапускаФоновогоЗаданияДляВыполнения.Таблица = ЗначениеВСтрокуВнутр(Новый ХранилищеЗначения(РазобраннаяТаблица, Новый СжатиеДанных(9)));
КонецЕсли;
КонецЕсли;
ЗаданиеРезультат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
"ДополнительныеОтчетыИОбработки.ВыполнитьКоманду",
ПараметрыЗапускаФоновогоЗаданияДляВыполнения,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Выполнение дополнительного отчета или обработки ""%1"", имя команды ""%2""'"),
Строка(ПараметрыЗапускаФоновогоЗаданияДляВыполнения.ДополнительнаяОбработкаСсылка),
ПараметрыЗапускаФоновогоЗаданияДляВыполнения.ИдентификаторКоманды));
Выполнено = ЗаданиеРезультат.ЗаданиеВыполнено;
ВызваноИсключение = Ложь;
Если Выполнено Тогда
Результат = ПолучитьИзВременногоХранилища(ЗаданиеРезультат.АдресХранилища);
Иначе
СтрокаФЗ = ТаблицаФоновыхЗаданий.Добавить();
СтрокаФЗ.ФоновоеЗаданиеИдентификатор = ЗаданиеРезультат.ИдентификаторЗадания;
СтрокаФЗ.ФоновоеЗаданиеАдресХранилища = ЗаданиеРезультат.АдресХранилища;
СтрокаФЗ.ФоновоеЗаданиеПроверитьПриЗакрытии = Истина;
СтрокаФЗ.МаксимальноеЗначение = ?(РазобраннаяТаблица=Неопределено,0,РазобраннаяТаблица.Количество());
СтрокаФЗ.ТипЗадания = ПараметрыЗапускаФоновогоЗаданияДляВыполнения.Операция;
СтрокаФЗ.НомерИндикатора = Поток;
КонецЕсли;
ПараметрыЗапускаФоновогоЗаданияДляВыполнения="";
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот