Получить результат выполнения фонового задания

1. Zixxx 27.09.18 17:42 Сейчас в теме
Как получить результат выполнения фонового задания, не записывая при этом результат в базу?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Dream_kz 129 27.09.18 17:52 Сейчас в теме
(1) Передать в фоновое адрес временного хранилища, куда в последствии и поместить результат работы
3. Zixxx 27.09.18 18:27 Сейчас в теме
(2) Вернет неопределенно, про это уже где-то писали, что из-за бага этим можно было пользоваться, а так в рамках сеанса данные пропадают и через фоновые задания это не пройдет, так как баг пофиксили в более поздних релизах
5. bmk74 234 27.09.18 18:36 Сейчас в теме
(3)Странно в стандартных конфигурациях этим активно пользуются сами разработчики
АдресРезультата = ?(ПараметрыВыполнения.АдресРезультата <> Неопределено, 
	    ПараметрыВыполнения.АдресРезультата,
		ПоместитьВоВременноеХранилище(Неопределено, ПараметрыВыполнения.ИдентификаторФормы));
	
	Результат = Новый Структура;
	Результат.Вставить("Статус",    "Выполняется");
	Результат.Вставить("ИдентификаторЗадания", Неопределено);
	Результат.Вставить("АдресРезультата", АдресРезультата);
	Результат.Вставить("АдресДополнительногоРезультата", "");
	Результат.Вставить("КраткоеПредставлениеОшибки", "");
	Результат.Вставить("ПодробноеПредставлениеОшибки", "");
	Результат.Вставить("Сообщения", Новый ФиксированныйМассив(Новый Массив));
	
	
	ПараметрыЭкспортнойПроцедуры = Новый Массив;
	ПараметрыЭкспортнойПроцедуры.Добавить(ПараметрыПроцедуры);
	ПараметрыЭкспортнойПроцедуры.Добавить(АдресРезультата);
	
	Если ПараметрыВыполнения.ДополнительныйРезультат Тогда
		Результат.АдресДополнительногоРезультата = ПоместитьВоВременноеХранилище(Неопределено, ПараметрыВыполнения.ИдентификаторФормы);
		ПараметрыЭкспортнойПроцедуры.Добавить(Результат.АдресДополнительногоРезультата);
	КонецЕсли;
	........................................................
	
	Попытка
		Задание = ЗапуститьФоновоеЗаданиеСКонтекстомКлиента(ИмяПроцедуры, ПараметрыЭкспортнойПроцедуры, 
			ПараметрыВыполнения.КлючФоновогоЗадания, ПараметрыВыполнения.НаименованиеФоновогоЗадания);
	Исключение
Показать

Получается они про баг не знают ?
10. Zixxx 27.09.18 19:23 Сейчас в теме
(5) Пока однозначно не понятно можно или нет. То что в типовых то там идентификатор является идентификатором формы. У меня на сервере нет идентификатора формы. При передачи уникального идентификатора который не является идентификатором формы данные из адреса пропадают.

У меня выполнение инициализируется на самом сервере.
12. insurgut 207 27.09.18 19:29 Сейчас в теме
(10) а зачем на сервере запускать фоновое задание? Что-то мудренности какие-то.
13. Zixxx 27.09.18 19:33 Сейчас в теме
(12) Чтобы в потоке отправить запросы на разные сервера. А так как данных много и ответы по времени ощутимы то последовательно не вариант
14. Fox-trot 158 27.09.18 19:33 Сейчас в теме
26. herfis 500 28.09.18 11:14 Сейчас в теме
(10)
У меня выполнение инициализируется на самом сервере.

Тогда, вероятно, ответ - никак. Если СУБД узкое место у тебя, тогда можешь попробовать организовать межпроцессный обмен через какую-нить внешнюю приблуду. Вон, систему взаимодействий поднять, например :)
28. Ditron 185 28.09.18 12:09 Сейчас в теме
(10)Чем инициируется, вы про регламентные задания? По расписанию? Тогда запись в Хранилище общих настроек с каким нибудь постоянным идентификатором
29. herfis 500 28.09.18 12:26 Сейчас в теме
(28) Хранилище настроек - это БД. ТС хочет обойти запись в БД.
30. Ditron 185 28.09.18 12:31 Сейчас в теме
(29)А зачем тогда вообще получать результат, делайте все что вам надо в процедуре ФЗ! Непонятен механизм, если это какие-то транзитные действия, ну и выполняйте их целиком в одном месте... Если это большой объем, что мешает их удалить (очистить) из хранилища после выполнения действий
32. herfis 500 28.09.18 12:35 Сейчас в теме
(30) А в чем проблема? Допустим, он хочет распараллелить обработку тяжелого запроса через web-сервис. Собирает какой-то большой JSON-документ из кусков. Не хочет куски писать в базу, чтобы ускорить время обработки и увеличить пропускную способность сервиса. Вполне естественное желание.
40. _Alexei_ 31.12.20 16:55 Сейчас в теме
(30) человеку надо решить проблему, а Вы говорите "не стоит"
у меня сейчас такая же
на УФ в перспективе переходить не будем
41. Ditron 185 31.12.20 17:10 Сейчас в теме
(40)я разве писал "не стоит"? )
31. Ditron 185 28.09.18 12:34 Сейчас в теме
(29)для того чтобы что-то получит, надо это что-то где-то взять, а как можно взять что-то, если его нигде нет!
6. Dream_kz 129 27.09.18 18:40 Сейчас в теме
(3)
что из-за бага этим можно было пользоваться

Если в 8.3.12 что-то и не работает, это проблемы 8.3.12 (Имхо, выше 8.3.10 вообще платформа не юзабельна сейчас)
В 8.3.10 точно работает
16. Zixxx 27.09.18 19:39 Сейчас в теме
(6) В 8.3.11 тоже не работает и в 8.3.10 тоже не будет работать
18. Dream_kz 129 27.09.18 20:14 Сейчас в теме
(16)
В 8.3.11 тоже не работает и в 8.3.10 тоже не будет работать

Ну конечно не будет работать, если не передавать явно идентификатор формы, о чем указано в СП
19. Zixxx 27.09.18 20:25 Сейчас в теме
(18) Печально конечно, так как идентификатора формы там быть не может
20. Dream_kz 129 27.09.18 21:09 Сейчас в теме
(19) В общем лучше сначала проверить, у меня на 8.3.11 в файловом варианте и с простым идентификатором работает. Надо поднять сервер 8.3.11 и проверить на нем
22. Bene_Valete 188 28.09.18 03:32 Сейчас в теме
(1) Может делать запись в журнал регистрации? В последних версиях он в не включен в базу данных, а хранится в отдельном файле
24. Zixxx 28.09.18 07:57 Сейчас в теме
(22) Записывать данные нельзя
7. soft_wind 27.09.18 18:41 Сейчас в теме
в фоновом задании используйте процедуру
Сообщить();
она накапливает сообщения, затем получаете информацию о ФЗ

в процедуре опроса состояния ФЗ (обработчик ожидания с какой-то переодичностью 1,10,60 сек )

лкЗадание 	= ФоновыеЗадания.НайтиПоУникальномуИдентификатору(фзКод);
Если лкЗадание <> Неопределено Тогда
лкСостояние 		= лкЗадание.Состояние;
			
//для оперативной передачи данных используем Сообщещиня пользователю
лкМассивСообщений = лкЗадание.ПолучитьСообщенияПользователю(Истина);
...
//затем обходите массив
		Для каждого лкЭлемент Из лкМассивСообщений Цикл
			
			лкСообщение = лкЭлемент.Текст;
			Сообщить(лкСообщение);
			
		КонецЦикла; 
...
Показать

примерно так,
у меня функционал был более расширенный, выводились сообщения пользователю, и бегущая строка, в процентах (прогресс бар) и все это на сообщениях
1CUnlimited; Devi; Rans; +3 Ответить
8. Zixxx 27.09.18 19:15 Сейчас в теме
(7) Это не подходит. Сообщение пользователю пишется в базу. У меня сообщения JSON очень большие
36. Rans 6 14.11.19 16:33 Сейчас в теме
(7) Спасибо! Помогло. Запускаю фоновое задание из обычной формы, результат помещал в хранилище общих настроек. При этом перестали сохраняться настройки табличной части в этом документе.
9. insurgut 207 27.09.18 19:21 Сейчас в теме
А запишите его куда-нибудь в файл временный, а обработчик на клиенте повесьте на появление этого файла временного :) Если результат очень большой, то чтобы не начать читать то, что ещё записывается, то обработчик можно повесить на ожидание появление какого-нибудь нулевого файла-сигнализатора, который создается после записи большого.
11. Zixxx 27.09.18 19:26 Сейчас в теме
15. insurgut 207 27.09.18 19:38 Сейчас в теме
(11) судя по всему, с неработающим временным хранилищем других вариантов у вас не остается :) Можно ещё внешние источники данных подключить. Но все эти предложения - вилами по воде, т.к. что у вас там, и откуда достается только вам известно.
17. Zixxx 27.09.18 19:45 Сейчас в теме
(15) Внешние тоже не подойдут. Данные прилетают через http запросы. Поэтому их не нужно записывать нужно обработать и перекинуть в другое место. Потоки можно сделать и на IIS, но хочется понять может ли 1с без записи сделать похожее. И почему временное хранилище работает в сеансе только с идентификатором формы а с уникальным идентификатором который не является идентификатором формы не работает. И как она определяет что передается идентификатор формы и зачем. Ведь это написано в справке.
21. ArchLord42 83 27.09.18 21:48 Сейчас в теме
(17) Можно заюзать ХранилищеОбщихНастроек или любое другие хранилище настроек вроде как работало
23. Zixxx 28.09.18 07:57 Сейчас в теме
(21) Записывать данные нельзя
25. VmvLer 28.09.18 08:35 Сейчас в теме
прочитал первые сообщения и понял, что авторы сообщений не читают СП

ПоместитьВоВременноеХранилище(<Данные>, <Адрес>)
....
Примечание:

Временное хранилище, сформированное в одном сеансе, недоступно из другого сеанса.
Исключением является возможность передачи данных из фонового задания в сеанс, инициировавший фоновое задание, с помощью временного хранилища. Для такой передачи следует в родительском сеансе поместить во временное хранилище пустое значение, передав идентификатор формы. Затем полученный адрес передать в фоновое задание через параметры фонового задания. Далее, если этот адрес использовать в параметре <Адрес>, то результат будет скопирован в сеанс, из которого было запущено фоновое задание.
Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.
Данные, помещенные в фоновом сеансе в хранилище по сформированному в родительском
romulanin; _Ramzes; user1088651; cleaner_it; duhin; Ditron; tindir; +7 Ответить
34. Rans 6 14.11.19 16:19 Сейчас в теме
(25) Нет у него формы, запуск с сервера
27. Ditron 185 28.09.18 12:05 Сейчас в теме
Все там работает, никаких багов, если вы инициируете ФЗ - формируйте перед запуском адрес врем. хранилища и передавайте его параметром (через массив) в процедуру ФЗ (куда вы поместите результат), если ФЗ отрабатывает в другом сеансе, формируйте адрес указывая изначальный УИД (например УИД формы из которого происходит запуск ФЗ). По завершение читаем результат из адреса...
35. Rans 6 14.11.19 16:20 Сейчас в теме
(27) А если из обычной формы отправлять?
37. Ditron 185 14.11.19 18:23 Сейчас в теме
(35)а какая разница, у обычной формы есть свойство КлючУникальности, присвойте ему уник. идент. и в адрес его же
38. Rans 6 15.11.19 10:50 Сейчас в теме
(37)Нет, возвращает неопределено.
33. roman77 332 28.09.18 16:30 Сейчас в теме
Можно на email отправить ничего никуда не записывая.
Типа этого https://forum.infostart.ru/forum9/topic176488/
39. schanya 14 06.03.20 14:14 Сейчас в теме
На УФ работает корректно. На обычных в первый раз возможно получить результат через ПолучитьИзВременногоХранилища, при следующих запусках возвращает Неопределено.

Так, на обычной форме результат из временного хранилища возможно было получить и увидеть в отладчике только после перезапуска клиента в первую так-сказать итерацию. При последующих запусках того же самого механизма, фоновое задание помещало результат выполнения в хранилище, но на Клиенте ПолучитьИзВременногоХранилища всегда возвращал неопределено.

Тестировалось на 8.3.13.1644.
_Alexei_; +1 Ответить
42. user1050439 7 22.02.24 09:54 Сейчас в теме
В моем случае вопрос решился так. Я не знаю каким был БСП в 20м году, но как гипотеза, возврат "неопределено" в результате, у меня - и возможно хотя бы у некоторых в этой ветке, - был из-за того, что результат пытались использовать на форме до того, как он был получен в обработчике "ОбработатьВыполнениеФоновыхЗаданий"

ДлительныеОперацииКлиент.ОжидатьЗавершение(
	СтруктураФоновогоЗадания,
	Новый ОписаниеОповещения("ОбработатьВыполнениеФоновыхЗаданий", 
	ЭтотОбъект, 
	Новый Структура("ИдентификаторЗадания", СтруктураФоновогоЗадания.ИдентификаторЗадания)), 
	ПараметрыОжидания); 


Возможно был подключен обработчик ожидания, например

ПодключитьОбработчикОжидания("ОбработчикОжидания", 5, Ложь)


, который смотрел по оповещаемому прогрессу, если задание закончено и сразу вызывал обработку результата -- а результат еще не успел устаканиться во временном хранилище, например. В результате такой скороспешный вызов увидит в адресе неопределено.

Если вызывать обработку результата из обработчика "ОбработатьВыполнениеФоновыхЗаданий", то проблема уходит.
Оставьте свое сообщение

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