ПолучитьИзВременногоХранилища(ПоместитьВоВременноеХранилище) - возврашает неопределено. Что не так?

1. andadra 10.09.20 14:54 Сейчас в теме
Здравствуйте! Выполняю фоновое задание, хочу поместить процент выполнения во временное хранилище и получить на своей форме процент, который до этого положил в структуру. А мне возвращается неопределенно.

Даже в таком случае вернется НЕОПРЕДЕЛЕННО.
ПоместитьВоВременноеХранилище(РезультатВыполнения, АдресХранилища);
ПолучитьИзВременногоХранилища(АдресХранилища) - ВОТ ТУТ У МЕНЯ ПУСТО


Значения параметров - РезультатВыполнения - Структура, АдресХранилища - строка со значением "e1cib/tempstorage/eba197f0-47bc-4a8b-a522-e9ea5aa775a6?seanceId=90082eec-908a-4cc7-8d95-26e8137ef73a"

Посдкажите, где косяк7 Что не так?

Что самое интересное, в результате окончания задания я получаю из хранилища свои значения, но уже с процентами 100))
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FatPanzer 10.09.20 14:59 Сейчас в теме
А каким образом формируется первоначальный адрес хранилища для "Поместить..."?
4. andadra 10.09.20 15:08 Сейчас в теме
Вызываю фоновое задание таким образом.

РезультатВыполнения  = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор, 
	"УправлениеНебольшойФирмойСервер.ОбновитьОстатокВНоменклатуре", 
	СтруктураПараметров, 
	"Наименование фонового задания", Истина);    
	
	ИдентификаторЗадания = РезультатВыполнения.ИдентификаторЗадания;
	АдресХранилища       = РезультатВыполнения.АдресХранилища;


И уже в мою процедуру приходит

ОбновитьОстатокВНоменклатуре(СтруктураПараметров, АдресХранилища)
3. Поручик 4674 10.09.20 15:05 Сейчас в теме
Неправильно.

АдресХранилища = ПоместитьВоВременноеХранилище(КакиеТоДанные);
Если ЭтоАдресВременногоХранилища(АдресХранилища) Тогда
        РезультатРаботыФоновогоЗадания = ПолучитьИзВременногоХранилища(АдресХранилища);
КонецЕсли;
5. andadra 10.09.20 15:09 Сейчас в теме
(3) У меня адрес автоматически формуруется. А его я получаю на форме уже
6. andadra 10.09.20 15:10 Сейчас в теме
(5) Нашел в интернете такую цитату:

"У них просто временное хранилище разделено на сеансы, данные временного хранилища каждого сеанса изолированы, на сколько я понимаю это для того чтобы доступ к ним не синхронизировать. Единственный случай когда данные врем хранилища переходят из одного сеанса в другой, это при завершение фонового данные переходят в вызвавший его сеанс. "
7. andadra 10.09.20 15:11 Сейчас в теме
(3)Думаю, что таким методом не получится у меня, надо по другому думать
8. Pryanishnikov_Vladimir 10.09.20 15:12 Сейчас в теме
Через ХранилищеОбщихНастроек сделайте
9. login1020 133 10.09.20 15:35 Сейчас в теме
а как отображаете процент выполнения?

для варианта с внешней подключаемой обработкой у меня в модуле объекта прописано

	Пока Выборка.Следующий() Цикл	
		
		Процент = 100 - ЦЕЛ((ВсегоДокументов - НомерДокумента)/ВсегоДокументов*100); 
		
		Если Процент % 10 = 0 Тогда
			ДлительныеОперации.СообщитьПрогресс(Процент,Нстр("ru='Создание документов'"));
		КонецЕсли;


а возвращаю на форму уже массив ссылок сформированных документов
10. andadra 10.09.20 15:42 Сейчас в теме
11. andadra 10.09.20 15:43 Сейчас в теме
(9)
ДлительныеОперации.СообщитьПрогресс(Процент,Нстр("ru='Создание документов'"));


Как я понял, мы из фонового задания вообще не можем передать что-то на форму, пока задание не завершилось
12. login1020 133 10.09.20 15:45 Сейчас в теме
(11) Перед запуском имеем
СформироватьДокументыПрихода(ПараметрыКоманды.ПараметрыФормы,ПараметрыКоманды.РезультатВыполнения);


и как раз в РезультатВыполнения записываем всё что нужно вернуть после завершения длительной операции.
14. Sashares 34 10.09.20 15:47 Сейчас в теме
(11)Можем. И процент выполнения можно передать, и сообщения.
15. andadra 10.09.20 15:48 Сейчас в теме
(14) В (13) сообщении ответил вам(
13. andadra 10.09.20 15:46 Сейчас в теме
(9)У меня ничего не происходит с выводом этой процедуры
Если Цел(ТекущийПроцентВыполнения) <>  ПроцентВыполнения Тогда
			ПроцентВыполнения = Цел(ТекущийПроцентВыполнения);
			РезультатВыполнения.ПроцентВыполнения = ПроцентВыполнения;
			//ПоместитьВоВременноеХранилище(РезультатВыполнения, СтруктураПараметров.УникальныйИдентификаторОстатков);
			ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения,Нстр("ru='Обновление остатков'"));
		КонецЕсли;
16. login1020 133 10.09.20 15:48 Сейчас в теме
(13) а запускаете задание то откуда, внешняя обработка, или из типового объекта какого?
18. andadra 10.09.20 15:49 Сейчас в теме
19. andadra 10.09.20 15:50 Сейчас в теме
(16)
&НаКлиенте
Процедура ОбновитьОстаток(Команда)
	
	//По-новому через фоновые задания
	ОтключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания");
	Сообщить(СтрШаблон("НАЧАЛО: %1", ПолучитьВремяСервера()));
	РезультатВыполнения = ВыполнитьОбновлениеОстатковФоновое();
	
	Если РезультатВыполнения.ЗаданиеВыполнено Тогда    
		Сообщить(СтрШаблон("КОНЕЦ: %1", ПолучитьВремяСервера()));
	Иначе
		ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
		ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", 1, Истина);    
	КонецЕсли;
	//КОНЕЦ:По-новому через фоновые задания
	
	//ОбновитьОстатокНаСервере();
КонецПроцедуры
Показать


Функция ВыполнитьОбновлениеОстатковФоновое()
	
	ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);    
	ИдентификаторЗадания = Неопределено;
	
	УникальныйИдентификаторОстатков = Новый УникальныйИдентификатор();
	
	СтруктураПараметров = Новый Структура;    
	СтруктураПараметров.Вставить("Запасы", Объект.Запасы.Выгрузить());
	СтруктураПараметров.Вставить("ИдентификаторЗадания", ИдентификаторЗадания);
	СтруктураПараметров.Вставить("УникальныйИдентификаторОстатков", УникальныйИдентификаторОстатков);
	
	РезультатВыполнения  = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор, 
	"УправлениеНебольшойФирмойСервер.ОбновитьОстатокВНоменклатуре", 
	СтруктураПараметров, 
	"Наименование фонового задания", Истина);    
	
	ИдентификаторЗадания = РезультатВыполнения.ИдентификаторЗадания;
	АдресХранилища       = РезультатВыполнения.АдресХранилища;    
	
	Возврат РезультатВыполнения;
	
КонецФункции
Показать
21. andadra 10.09.20 15:52 Сейчас в теме
(16) и уже основная процедура в фоновом задании

Функция ОбновитьОстатокВНоменклатуре(СтруктураПараметров, АдресХранилища, ЧтоТутЗНАКВОПРОСА) Экспорт
	
	РезультатВыполнения = Новый Структура("Задание, ПроцентВыполнения", "ОбновлениеОстатков", 0);
	
	Запасы = СтруктураПараметров.Запасы;
	
	ПроцентВыполнения = 0;
	
	ТекущийПроцентВыполнения = 0;
	
	НомерПоПорядку = 0;
	
	ОбщееКоличествоВТаблице = Запасы.Количество();
	
	Для Каждого Сч Из Запасы Цикл
		
		НомерПоПорядку = НомерПоПорядку + 1;
		
		ТекущийПроцентВыполнения = НомерПоПорядку / ОбщееКоличествоВТаблице * 100;
		
		Если Цел(ТекущийПроцентВыполнения) <>  ПроцентВыполнения Тогда
			ПроцентВыполнения = Цел(ТекущийПроцентВыполнения);
			РезультатВыполнения.ПроцентВыполнения = ПроцентВыполнения;
			//ПоместитьВоВременноеХранилище(РезультатВыполнения, СтруктураПараметров.УникальныйИдентификаторОстатков);
			ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения,Нстр("ru='Обновление остатков'"));
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Сч.Номенклатура) Тогда
			
			ЗначениеСвойства = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "ОстатокПоставщика");
			
			ОбъектНоменклатура = Сч.Номенклатура.ПолучитьОбъект();
			
			ДопРеквизиты = ОбъектНоменклатура.ДополнительныеРеквизиты;
			
			НайденныеСтроки = ДопРеквизиты.НайтиСтроки(Новый Структура("Свойство", ЗначениеСвойства));
			
			Если НайденныеСтроки.Количество() = 0 Тогда
				
				СтрокаТаблицы = ДопРеквизиты.Добавить();
				
			Иначе
				
				СтрокаТаблицы = НайденныеСтроки[0];
				
			КонецЕсли;
			
			Если СтрокаТаблицы.Значение <> Сч.ОстатокПоставщика Тогда
				
				СтрокаТаблицы.Свойство = ЗначениеСвойства;
				
				СтрокаТаблицы.Значение = Сч.ОстатокПоставщика;
				
				ОбъектНоменклатура.ОбменДанными.Загрузка = Истина;
				
				ОбъектНоменклатура.Записать();
				
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
	РезультатВыполнения.ПроцентВыполнения = 100;
	
	ПоместитьВоВременноеХранилище(РезультатВыполнения, АдресХранилища);
	
КонецФункции
Показать
17. andadra 10.09.20 15:49 Сейчас в теме
(9)Я же СообщитьПрогресс использую в самом фоновом задании
20. login1020 133 10.09.20 15:52 Сейчас в теме
22. login1020 133 10.09.20 15:55 Сейчас в теме
Чтобы шло отображение процентов и вызывать нужно по особенному
&НаСервереБезКонтекста
Функция НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор)
	ИмяПроцедуры = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду";
	
	ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, ОбъектыНазначения,ПараметрыФормы");
	ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
	ПараметрыПроцедуры.ИдентификаторКоманды          = ВыполняемаяКоманда.Идентификатор;
	ПараметрыПроцедуры.ОбъектыНазначения             = ВыполняемаяКоманда.ОбъектыНазначения;
	ПараметрыПроцедуры.ПараметрыФормы			     = ВыполняемаяКоманда.ПараметрыФормы;
	НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Дополнительные отчеты и обработки: Выполнение серверного метода обработки'");
	
	Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, НастройкиЗапуска);
	
КонецФункции

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

Посмотрите ссылки, что я приложил выше, там это все есть.
23. andadra 10.09.20 15:58 Сейчас в теме
(22)Ок, спасибо, пока только мельком глянул, но там все есть. Решение потом здесь напишу)
24. slasher777 29.09.20 19:42 Сейчас в теме
из фонового задания вообще не можем передать что-то на форму, пока задание не завершилось
Оставьте свое сообщение

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