Состояние фонового задания

1. sergey_at 22 17.04.23 10:26 Сейчас в теме
В УТ 10.3 есть управляемая форма. Её расчет выполняется в фоновой процедуре. Только на время выполнения фонового задания управляемая форма блокируется и обработчик ожидания (хотя бы время выводить) не отрабатывает. Сама профедура в фоне. Но пока не выполнится - песочные часы
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
6. user5300 1063 17.04.23 11:19 Сейчас в теме +2 $m
&НаКлиенте
Процедура Построить6(Команда)
	// Вставить содержимое обработчика.
	объект.СчетчикЧ=0;
	объект.ДГанта.Очистить();
	ПодключитьОбработчикОжидания("Ожидалка",2);
	УИД = Построить6НаСервере();   ///УИД - реквизит формы например, (произвольный\уникальный идентификатор)

КонецПроцедуры


&НаКлиенте
Процедура Ожидалка() Экспорт
	//Элементы.Декорация1.Заголовок=Строка(ТекущаяДата());
	//состояние(ТекущаяДата());
	// некие действия

	РезультатФЗ = ПроверитьФоновыеЗаданияНаСервере(УИД);
	Если РезультатФЗ.Выполнено Тогда  
		Сообщить("Выполнено успешно");

		ЗначениеВреквизитФормы(массивПараметров[2],"Объект");
		объект.ДГанта=ЗначениеИзФайла("\\srv-250.grp.local\1csrv250obmen\dgant.dg");
		//дг=массивПараметров[1];
		ОтключитьОбработчикОжидания("Ожидалка");
	ИначеЕсли РезультатФЗ.Выполняется Тогда
		// вывести состояние	
	ИначеЕсли ЗначениеЗаполнено(РезультатФЗ.ТекстОшибки) Тогда
		Сообщить("Возникла ошибка: " + РезультатФЗ.ТекстОшибки);
	КонецЕсли;

КонецПроцедуры

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


&НаСервере
Функция Построить6НаСервере()
	об= РеквизитФормыВЗначение("Объект");

	//об.ПостроениеДГ();
	//дг2=реквизитФормыВзначение("Объект.Дганта");


	АдресХранилища = ПоместитьВоВременноеХранилище(
	Новый Структура("Инд,КоличествоОбходов",0,1),ЭтаФорма.УникальныйИдентификатор);


	ДГ1=новый ДиаграммаГанта;
	МассивПараметров = Новый Массив;
	МассивПараметров.Добавить(об.Проект);
	МассивПараметров.Добавить(об.ДГанта);
	МассивПараметров.Добавить(об);
	ключ="ПостроениеДиаграммыГанта";

	
	ФЗ = ФоновыеЗадания.Выполнить("Диаграмма.ПостроениеДГ",МассивПараметров,ключ);
	Возврат ФЗ.УникальныйИдентификатор;
	
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1278383 5 17.04.23 10:45 Сейчас в теме
мб все-таки покажите как запускаете расчет в фоне?)
4. sergey_at 22 17.04.23 11:07 Сейчас в теме
(2)


&НаКлиенте
Процедура Построить6(Команда)
// Вставить содержимое обработчика.
объект.СчетчикЧ=0;
объект.ДГанта.Очистить();
ПодключитьОбработчикОжидания("Ожидалка",2);
Построить6НаСервере();

КонецПроцедуры


&НаКлиенте
Процедура Ожидалка() Экспорт
Элементы.Декорация1.Заголовок=Строка(ТекущаяДата());
состояние(ТекущаяДата());
// некие действия
КонецПроцедуры


&НаСервере
Процедура Построить6НаСервере()
об= РеквизитФормыВЗначение("Объект");

//об.ПостроениеДГ();
//дг2=реквизитФормыВзначение("Объект.Дганта");


АдресХранилища = ПоместитьВоВременноеХранилище(
Новый Структура("Инд,КоличествоОбходов",0,1),ЭтаФорма.УникальныйИдентификатор);


ДГ1=новый ДиаграммаГанта;
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(об.Проект);
МассивПараметров.Добавить(об.ДГанта);
МассивПараметров.Добавить(об);
ключ="ПостроениеДиаграммыГанта";


ФЗ = ФоновыеЗадания.Выполнить("Диаграмма.ПостроениеДГ",МассивПараметров,ключ);
//Диаграмма.ПостроениеДГ(об.Проект,об.ДГанта,об);
//

ФЗ = ФЗ.ОжидатьЗавершенияВыполнения();
//анализируем состояние фонового задания
Если ФЗ.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
Сообщить("Выполнено успешно");

ЗначениеВреквизитФормы(массивПараметров[2],"Объект");
объект.ДГанта=ЗначениеИзФайла("\\srv-250.grp.local\1csrv250obmen\dgant.dg");
//дг=массивПараметров[1];
иначеесли
ФЗ.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
Сообщить("Ошибка при выполнении " + ФЗ.ИнформацияОбОшибке.Описание);
ИначеЕсли ФЗ.Состояние = СостояниеФоновогоЗадания.Отменено Тогда
Сообщить("Задание отменено");
КонецЕсли;

//
конецПроцедуры

Собственно, всё работает, кроме того, что песочные часы висят, пока не завершится фоновая процедура. А обработчик ожидания, который в данном случае дату-время, хотя бы, должен выводить во время работы фоновой процедуры. Но обработчик на форме работает ТОЛЬКО после завершения фоновой процедуры
7. user1278383 5 17.04.23 11:23 Сейчас в теме
(4)
ФЗ = ФЗ.ОжидатьЗавершенияВыполнения();

Проверять надо на клиенте через обработчик ожидания. Запускаем ФЗ, запоминаем ИД. Затем в обработчике ожидания получаем статус ФЗ и обрабатываем. Примеров в интернете полно
8. user1278383 5 17.04.23 11:24 Сейчас в теме
(7) а, в ветке уже и код написали :)
9. spacecraft 17.04.23 11:24 Сейчас в теме
(4)
ФЗ = ФЗ.ОжидатьЗавершенияВыполнения();

Так он послушно ожидает завершения фонового задания и не передает управление обратно на клиент. Вот клиент и "зависает".
3. Denic_01 48 17.04.23 11:02 Сейчас в теме
не понятно, что конкретно требуется - пользователю информацию выводить или для себя понимать что там происходит ?
5. sergey_at 22 17.04.23 11:13 Сейчас в теме
состояние выполнения: чтобы пользователь знал, что прога не зависла, а думает
6. user5300 1063 17.04.23 11:19 Сейчас в теме +2 $m
&НаКлиенте
Процедура Построить6(Команда)
	// Вставить содержимое обработчика.
	объект.СчетчикЧ=0;
	объект.ДГанта.Очистить();
	ПодключитьОбработчикОжидания("Ожидалка",2);
	УИД = Построить6НаСервере();   ///УИД - реквизит формы например, (произвольный\уникальный идентификатор)

КонецПроцедуры


&НаКлиенте
Процедура Ожидалка() Экспорт
	//Элементы.Декорация1.Заголовок=Строка(ТекущаяДата());
	//состояние(ТекущаяДата());
	// некие действия

	РезультатФЗ = ПроверитьФоновыеЗаданияНаСервере(УИД);
	Если РезультатФЗ.Выполнено Тогда  
		Сообщить("Выполнено успешно");

		ЗначениеВреквизитФормы(массивПараметров[2],"Объект");
		объект.ДГанта=ЗначениеИзФайла("\\srv-250.grp.local\1csrv250obmen\dgant.dg");
		//дг=массивПараметров[1];
		ОтключитьОбработчикОжидания("Ожидалка");
	ИначеЕсли РезультатФЗ.Выполняется Тогда
		// вывести состояние	
	ИначеЕсли ЗначениеЗаполнено(РезультатФЗ.ТекстОшибки) Тогда
		Сообщить("Возникла ошибка: " + РезультатФЗ.ТекстОшибки);
	КонецЕсли;

КонецПроцедуры

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


&НаСервере
Функция Построить6НаСервере()
	об= РеквизитФормыВЗначение("Объект");

	//об.ПостроениеДГ();
	//дг2=реквизитФормыВзначение("Объект.Дганта");


	АдресХранилища = ПоместитьВоВременноеХранилище(
	Новый Структура("Инд,КоличествоОбходов",0,1),ЭтаФорма.УникальныйИдентификатор);


	ДГ1=новый ДиаграммаГанта;
	МассивПараметров = Новый Массив;
	МассивПараметров.Добавить(об.Проект);
	МассивПараметров.Добавить(об.ДГанта);
	МассивПараметров.Добавить(об);
	ключ="ПостроениеДиаграммыГанта";

	
	ФЗ = ФоновыеЗадания.Выполнить("Диаграмма.ПостроениеДГ",МассивПараметров,ключ);
	Возврат ФЗ.УникальныйИдентификатор;
	
КонецФункции
Показать
Оставьте свое сообщение

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