ДлительныеОперации.СообщитьПрогресс работает выборочно!

1. Mastershi 31.05.24 16:31 Сейчас в теме
Дано: 1С:Предприятие 8.3 (8.3.24.1342), Бухгалтерия предприятия, редакция 3.0 (3.0.142.67)
База клиент-серверная.
Расширение, в котором есть обработка, которая, в свою очередь запускает фоновые задания - запросы к ФГИС Зерно.
Почему не использую стандартную разработку 1С - это вопрос философский и к делу не относится.

Это первое фоновое задание
Процедура ПолучитьРезультатЗапросаЗЕРНО(ПараметрыЗадания, АдресРезультата) Экспорт
	РезультатРаботы = Новый Структура("Ошибка,ТекстОшибки,Результат,Операция,Запросы,Ответы",
		Ложь, "", Новый Массив, Неопределено, Новый Массив, Новый Массив);
	
	ПараметрыЗапроса = ПараметрыЗадания.ПараметрыЗапроса;

	// специально для разграничения запуска в фоне или не в фоне
	ЗапущенВФоне = ПараметрыЗапроса.Свойство("ЗапущенВФоне");	

	Версия = ПараметрыЗапроса.Версия;
	Операция = ПараметрыЗадания.Операция;
	РезультатРаботы.Операция = Операция;

	ПараметрыЗапроса.Страницы.НомерСтраницы = 0;	

	Если ПараметрыЗадания.Свойство("КоличествоЗапросов") Тогда
		КоличествоЗапросов = ?(ПараметрыЗадания.КоличествоЗапросов = 0, 50, 
			ПараметрыЗадания.КоличествоЗапросов);
	Иначе
		КоличествоЗапросов = 50;
	КонецЕсли;
	
	//ПараметрыЗапроса.Страницы.ДлинаСтраницы = 100;
	Если ЗапущенВФоне Тогда				  
		ДлительныеОперации.СообщитьПрогресс(0, 
			СтрШаблон("[%1] Начинаем...", Операция)
		);
	КонецЕсли;
	 // ....................... далее всякое-разное. .................................................

		Для к = 1 По КоличествоЗапросов Цикл
			ОтветНаГотовность = СГМ_ОбменЗерноСервер.ОтправитьЗапросНаСервер(
				ЗапросОГотовности.КонвертSOAP, ПараметрыЗапроса);
			Если Не ОтветНаГотовность.Успех Тогда
				Если Не ОтветОтправкиЗапроса.Успех Тогда
					sReturn = WshShell.run(
						СтрШаблон("ping 127.0.0.1 -n %1", Формат(Замедлитель, "ЧГ=0")),
						1,True);
					Замедлитель = 6 + Окр(?(к <= 10, 0, 
											?(к <= 50, Окр(((к - 10) / 40) * 93 + 1, 0), 100
									  )		));   	
					Если ЗапущенВФоне Тогда				  
						ДлительныеОперации.СообщитьПрогресс(Окр(к / КоличествоЗапросов * 100,0), 
							СтрШаблон("[%1] Запрос №%2: интервал %3", Операция, к, Замедлитель));
					КонецЕсли;
					Продолжить;
				КонецЕсли;
			Иначе
				// проверить, что ответ на исходный запрос сформирован
				КонвертТип = ФабрикаXDTO.Пакеты.Получить(
						Метаданные.ПакетыXDTO.Envelope.ПространствоИмен).КорневыеСвойства.Получить("Envelope").Тип;
				Ответ = Новый ЧтениеXML;
				Ответ.УстановитьСтроку(ОтветНаГотовность.Текст);
				ПринятоЛи = ФабрикаXDTO.ПрочитатьXML(Ответ, КонвертТип).Body;
				СостояниеОтвета = Неопределено;
				Если ПринятоЛи.Свойства().Получить("SendResponseResponse") <> Неопределено Тогда
					Если ПринятоЛи.SendResponseResponse.Свойства().Получить("ResponseCode") <> Неопределено Тогда
						СостояниеОтвета = НРег(Строка(ПринятоЛи.SendResponseResponse.ResponseCode));
						Если СостояниеОтвета = "success" Тогда
							// принято и сделано
							ФлагПолучено = Истина;
							РезультатРаботы.Ответы.Добавить(ОтветНаГотовность.Текст);
							Прервать;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;

			// пауза	
			sReturn = WshShell.run(
				СтрШаблон("ping 127.0.0.1 -n %1", Формат(Замедлитель, "ЧГ=0")),
				1,True);
			Замедлитель = 6 + Окр(?(к <= 10, 0, 
									?(к <= 50, Окр(((к - 10) / 40) * 93 + 1, 0), 100
							  )		));   	
			Если ЗапущенВФоне Тогда				  
				ДлительныеОперации.СообщитьПрогресс(Окр(к / КоличествоЗапросов * 100, 0), 
					СтрШаблон("[%1] Запрос №%2: интервал %3", Операция, к, Замедлитель));
			КонецЕсли;
		КонецЦикла;

// ................................... дальше обработка полученного и пр........................

Показать

Это второе:
Процедура МассовоеГашениеСДИЗППЗ(ПараметрыЗадания, АдресРезультата) Экспорт
	
 // ......................................... здесь разбор входных данных ......................................
		Всего = СписокДляГашения.Количество();
		Счетчик = 0;

		Для каждого Элем Из СписокДляГашения Цикл
		
			//ПараметрыЗапроса.ЭтоВопрос = Истина;
			
			Если ЗапущенВФоне Тогда
				ДлительныеОперации.СообщитьПрогресс(Окр(Счетчик / Всего * 100, 0),
					СтрШаблон("Обрабатываем %1, количество %2",
						Элем.Номер, Элем.Количество)
				);
			КонецЕсли;
	        Счетчик = Счетчик + 1;


// .................................. дальше цикл, всё работает .....................			

Показать


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


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


Так вот: у первого никакой прогресс не выдаётся. Сидит кот, поёт песни, выводится стандартное окно запущенного фонового задания ("Пожалуйста, подождите...")
Во втором случае на фоне того же кота показывает проценты и информацию об обрабатываемой строке.

Вопрос. Почему в первом случае прогресс не показывает?
Найденные решения
5. Mastershi 05.06.24 12:32 Сейчас в теме
Вопрос снят. Нашёл опечатку, которую трудно заметить.
В строке первого фрагмента
// специально для разграничения запуска в фоне или не в фоне
    ЗапущенВФоне = ПараметрыЗапроса.Свойство("ЗапущенВФоне"); 
вместо ПараметрыЗапроса, должно стоять ПараметрыЗадания. .
Прошу прощения за отнятое время.
user2033849; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 76 31.05.24 18:18 Сейчас в теме
(1)
Новый ОписаниеОповещения("ОбработатьСписокППЗ", ЭтотОбъект),
ПараметрыОжидания);


и

Новый ОписаниеОповещения("ОбработатьГашениеСДИЗППЗ", ЭтотОбъект, СписокДляГашения),
ПараметрыОжидания);


вы реально не видите и не понимаете разницу? Как по-вашему, в первом случае, система должна строить "шкалу", по каким данным?
3. Mastershi 03.06.24 11:50 Сейчас в теме
(2)
вы реально не видите и не понимаете разницу? Как по-вашему, в первом случае, система должна строить "шкалу", по каким данным?

Видите ли, если бы я не имел вариант работающего прогресса
	Если КонтрольСоответствия Тогда
		Объект.Товары.Очистить();
	
		СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(УникальныйИдентификатор);
		ИДЗадания 	= СтруктураФоновогоЗадания.ИдентификаторЗадания;
	
		ПараметрыОжидания  = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
		ПараметрыОжидания.Интервал  = 2;
	
		ДлительныеОперацииКлиент.ОжидатьЗавершение(
			СтруктураФоновогоЗадания, 
			Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект), 
			ПараметрыОжидания);
		Сообщить("Заполнено " + Объект.Товары.Количество());
	
	Иначе
		// если контроля нет, то сразу переходим к заполнению и созданию и обработке документа ИнвентаризацияВЕТИС
		ЗаполнитьНаСервере();
		Сообщить("Заполнено " + Объект.Товары.Количество());
	КонецЕсли;
Показать
, я бы свой вопрос не задавал.
А шкалу я ему даю: и проценты и надпись, их сопровождающую.
А то, что СписокГашения, так это ДополнительныеПараметры, тип которых произвольный, которых может и не быть вовсе, а прогресс, тем не менее работать будет. Ибо, повторюсь, имею работающий вариант кода.
Процедура СообщитьПрогресс(Знач Процент = Неопределено, Знач Текст = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт
Обратите внимание, этой процедуре ничего внешнего не надо. Да и в коде этой процедуры ничего экстроординарного нет.
4. Mastershi 04.06.24 09:12 Сейчас в теме
... экстраординарного...
5. Mastershi 05.06.24 12:32 Сейчас в теме
Вопрос снят. Нашёл опечатку, которую трудно заметить.
В строке первого фрагмента
// специально для разграничения запуска в фоне или не в фоне
    ЗапущенВФоне = ПараметрыЗапроса.Свойство("ЗапущенВФоне"); 
вместо ПараметрыЗапроса, должно стоять ПараметрыЗадания. .
Прошу прощения за отнятое время.
user2033849; +1 Ответить
Оставьте свое сообщение

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