Запустить фоновое задание из обработки

1. dusha0020 1107 10.04.15 12:35 Сейчас в теме
Задача в общем-то такая:
Есть обработка, процедуру которой лучше бы запускать в фоне. Обработка может быть внешней или частью конфигурации (по условию работать должно так и так). Относительно внешнего варианта - вопросов нет, а вот если, допустим, ее встроили в конфигурацию возникает проблема. Запустить ее из самой обработки я не могу, потому что
ФоновыеЗадания("Обработки.МояОбработка.Создать().МойМетод", Параметры, Идентификатор, "Мое фоновое задание")
дает ошибку "Метод задания не найден" (ну чего уж там, общего модуля действительно нет). Через БСП в любых видах, что я пытался передавать сие замысловатое название процедуры она неизбежно проходит через "ОбщегоНазначения.ВыполнитьБезопасно", где благополучно отсекается при проверке корректности имени процедуры и именно из-за куска "Создать()", который порождает 4 фрагмента имени, а не 2 или 3 считающихся допустимыми.
Понятно, что можно взять любой подходящий модуль и написать в нем свою запускающую процедуру (коль уж мы меняем конфигурацию), можно создать модуль специально, но все-таки неужели такая мелочь стоит таких усилий. Хочется так чтобы вставил - и работает, удалил из конфигурации - и забыл, без дополнительных движений.
Вот за этим и пишу. Может есть все-таки что-то в БСП о чем я не знаю или еще какой изврат, чтобы запустить в фоне экспортную процедуру обработки из нее самой, не дописывая больше ничего хотя бы в стандартных конфигурациях?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Boneman 298 10.04.15 12:45 Сейчас в теме
(1) dusha0020, есть способы.
Я знаю как минимум 2, и оба применял.

1-ый ДополнительныеОтчетыИОбработки.ВыполнитьКоманду
2-ой ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки

все что нужно, передаешь параметрами. Покопайся в процедурах, разберись как они работают, и приведи свою обработку в соответствие, чтобы все это запускалось
vbelyaev; +1 Ответить
7. dusha0020 1107 10.04.15 12:55 Сейчас в теме
(2) Boneman,
1-й способ не могу ничего сказать. У меня в "ДополнительныхОперациях" такой процедуры нет. Подозреваю, что она не слишком универсальна и не во всех стандартных конфигурациях есть.
2-й способ - не прокатит. Требует в параметрах команды "ДополнительнаяОбработкаСсылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Элемент справочника." Что для встроенной в конфигурацию обработки не есть возможно. Но для варианта внешней действительно применимо и работает. Уже сейчас:)
8. Boneman 298 10.04.15 13:09 Сейчас в теме
(7) dusha0020,
не прокатит. Требует в параметрах команды "ДополнительнаяОбработкаСсылка

а ничего что там много параметров,
в т.ч. есть параметр .ЭтоВнешняяОбработка
и если он в истине, тогда получает обработку по ссылке, в противном случае создает объект по имени.

Все там нормально и грамотно сделано
9. dusha0020 1107 10.04.15 13:17 Сейчас в теме
(8) Boneman, Вот прямо цитата из модуля:
// Выполняет команду обработки и возвращает результат ее выполнения.
//
// Параметры:
//   ПараметрыКоманды (Структура) Параметры, с которыми выполняется команда.
//       |- ДополнительнаяОбработкаСсылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Элемент справочника.
//       |- ИдентификаторКоманды (Строка) Имя выполняемой команды.
//       |- ОбъектыНазначения (Массив) из (*) Ссылки объектов, для которых выполняется обработка. Обязательный для назначаемых обработок.
//       |- РезультатВыполнения (*) Необязательный. Используется для передачи результата работы на клиент.
//   АдресРезультата (Строка) Необязательный. Адрес временного хранилища по которому будет размещен результат выполнения.
//
// Возвращаемое значение:
//   ПараметрыКоманды.РезультатВыполнения (*) см. ПараметрыКоманды. Если был передан АдресРезультата, то возвращается Неопределено.
//
// Важно:
//   Проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки"
//     должна выполняться вызывающим кодом.
//
Функция ВыполнитьКоманду(ПараметрыКоманды, АдресРезультата = Неопределено) Экспорт
	
	ВнешнийОбъект = ПолучитьОбъектВнешнейОбработки(ПараметрыКоманды.ДополнительнаяОбработкаСсылка);
	ИдентификаторКоманды = ПараметрыКоманды.ИдентификаторКоманды;
	
	РезультатВыполнения = ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ИдентификаторКоманды, ПараметрыКоманды, АдресРезультата);
	
	Возврат РезультатВыполнения;
	
КонецФункции
Показать

Ну и это до кучи:
// Создает и возвращает объект внешней обработки (отчета).
//
// Параметры:
//   Ссылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Подключаемая обработка.
//
// Возвращаемое значение: 
//   (ВнешняяОбработкаОбъект.*) Объект подключенной обработки.
//   (ВнешнийОтчетОбъект.*)     Объект подключенного отчета.
//   (Неопределено)             Если передана некорректная ссылка.
//
// Важно:
//   Проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки"
//     должна выполняться вызывающим кодом.
//
Функция ПолучитьОбъектВнешнейОбработки(Ссылка) Экспорт
	
	// Подключение
	ИмяОбработки = ПодключитьВнешнююОбработку(Ссылка);
	
	// Проверка корректности переданных параметров
	Если ИмяОбработки = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	// Получение экземпляра объекта
	Если Ссылка.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет
		ИЛИ Ссылка.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
		Менеджер = ВнешниеОтчеты;
	Иначе
		Менеджер = ВнешниеОбработки;
	КонецЕсли;
	
	Возврат Менеджер.Создать(ИмяОбработки);
	
КонецФункции
Показать

В общем-то и судя по первому способу видно, что БСП у нас разные... А жаль.
11. Boneman 298 10.04.15 13:23 Сейчас в теме
(9) dusha0020, ты что смотришь то ?
смотри процедуру, 2-ой ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки,

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

Процедура ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища) Экспорт 
	
	ИмяМетода = Параметры.ИмяМетода;
	ВременнаяСтруктура = Новый Структура;
	Попытка
		ВременнаяСтруктура.Вставить(ИмяМетода);
	Исключение
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода обработки'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
			УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru='Имя метода ""%1"" не соответствует требованиям образования имен переменных.'"),
			ИмяМетода);
	КонецПопытки;
	
	ПараметрыВыполнения = Параметры.ПараметрыВыполнения;
	Если Параметры.ЭтоВнешняяОбработка Тогда
		Если ЗначениеЗаполнено(Параметры.ДополнительнаяОбработкаСсылка) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда
			МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки");
			Обработка = МодульДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(Параметры.ДополнительнаяОбработкаСсылка);
		Иначе
			Обработка = ВнешниеОбработки.Создать(Параметры.ИмяОбработки);
		КонецЕсли;
	Иначе
		Обработка = Обработки[Параметры.ИмяОбработки].Создать();
	КонецЕсли;
	
	Выполнить("Обработка." + ИмяМетода + "(ПараметрыВыполнения, АдресХранилища)");
	
КонецПроцедуры
Показать
15. dusha0020 1107 10.04.15 13:54 Сейчас в теме
(11) Boneman, У меня в УЮП и MES "ВыполнитьПроцедуруМодуляОбъектаОбработки" нет. А в БП - есть. Точно есть:)
Спасибо за совет. Подтяну процедуру из новой версии. Еще раз спасибо.
18. Tavalik 3365 08.02.16 12:08 Сейчас в теме
(1) dusha0020,

Относительно внешнего варианта - вопросов нет


А не подскажите, как запустить процедуру внешней обработки в фоне?
19. vovan_victory 63 08.02.16 13:00 Сейчас в теме
(18) Tavalik,а если так:
...........
	ФоновыеЗадания.Выполнить("ВыполнитьПроцедуруФоновомРежиме");
 ..........

Процедура ВыполнитьПроцедуруФоновомРежиме() Экспорт

КонецПроцедуры;
20. Дмитрий74Чел 235 02.03.17 16:43 Сейчас в теме
(19) СП не читал? Там ОбщийМодуль.Процедура нужна, а не локальная (например ВыполнитьПроцедуруФоновомРежиме).
3. vovan_victory 63 10.04.15 12:48 Сейчас в теме
dusha0020 , в какой конфигурации хотите запускать обработку?
4. dusha0020 1107 10.04.15 12:49 Сейчас в теме
(3) vovan_victory, В любой. Универсальная она... Блин.
6. Boneman 298 10.04.15 12:55 Сейчас в теме
(4) dusha0020, универсальные вообще не нужно в конфигурации встраивать. Делаешь внешней обработкой, все правильно регистрируешь, и все работает.
5. vovan_victory 63 10.04.15 12:53 Сейчас в теме
Рабочий пример.Отсылает почтовое сообщение по расписанию. Расписание задается при добавлении во внешние отчеты. Только адрес получателя
подправь
Прикрепленные файлы:
ПолучениеОстатков.epf
21. necropunk 9 29.01.18 14:50 Сейчас в теме
(5) А если бы вам нужно было то же самое, но передавать на вход фонового задания какой-то произвольный список адресов, а не жестко зашивать его в коде? Как с точки зрения БСП типовым методом правильно передать параметры?
10. vovan_victory 63 10.04.15 13:18 Сейчас в теме
Но обработка то работает или нет?
13. dusha0020 1107 10.04.15 13:31 Сейчас в теме
(10) vovan_victory, Работает, конечно:) Внешней обработкой, если зарегистрировать в справочнике, то замечательно все. Не найдем решения - забью на это и успокоюсь.
12. vovan_victory 63 10.04.15 13:24 Сейчас в теме
Там действительно есть маленькая тонкость. Когда я разбирался почему обработка не отрабатывает по расписанию, то вычитал в коде, что создается фоновое задание, но как только доходит до проверки безопасного режима, то вываливается ошибка. Код из внешней обработки в фоновом задание выполняется только в не безопасном режиме. В обще решение в
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.0");
Анализируется версия БСП. Обработку тестировал в нескольких конфигурация. Работает.
14. vovan_victory 63 10.04.15 13:34 Сейчас в теме
dusha0020, для типовых решений внешняя обработка - это самое универсальное решение ИМХО.Задача выполнена и конфа на месте.
16. dusha0020 1107 10.04.15 14:03 Сейчас в теме
(14) vovan_victory, С одной стороны, конечно. Но с другой предполагается частое ее (обработки) использование в фоновых задачах с вызовом из других процедур. В это случае намного удобнее и правильнее писать вызывающий код с привязкой к объекту метаданных, а не к НайтиПоКоду(Наименованию) в справочнике дополнительных обработок. Это мое ИМХО:)
17. vovan_victory 63 10.04.15 14:10 Сейчас в теме
а не к НайтиПоКоду(Наименованию)
. Согласен. Сам это просто ненавижу.
Оставьте свое сообщение

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