Перем НачалоОперацииОС;

Процедура ВладелецНажатие(Элемент)
	
	ВладелецФормы.Открыть();
	
КонецПроцедуры

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

Функция ЛиФоновоеЗадание()
	
	Возврат ТипЗнч(ИдентификаторЗадания) = Тип("УникальныйИдентификатор");

КонецФункции

Процедура ОбновитьСостояниеЗадания(Знач ФоновоеЗадание) Экспорт 
	
	Конец = ФоновоеЗадание.Конец;
	Если Не ЗначениеЗаполнено(Конец) Тогда
		Конец = ирОбщий.ТекущаяДатаЛкс(Истина, Истина);
	КонецЕсли; 
	ЭтаФорма.Состояние = ирОбщий.ПредставлениеДлительностиЛкс(Конец - ФоновоеЗадание.Начало) + "с " + ФоновоеЗадание.Состояние;
	ИзменитьВидимостьПотоков();
	Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
		ЭлементыФормы.Состояние.ЦветТекста = ирОбщий.ЦветТекстаАктивностиЛкс();
		#Если Сервер И Не Сервер Тогда
			ОбновитьСостояниеЗаданияБезПараметров();
		#КонецЕсли
		ПодключитьОбработчикОжидания("ОбновитьСостояниеЗаданияБезПараметров", 2, Истина);
	Иначе
		УстановитьБазовыйЗаголовок();
		ЭлементыФормы.Состояние.ЦветТекста = WebЦвета.ТемноЗеленый;
		ЭлементыФормы.Отменить.Доступность = Ложь;
		ЭлементыФормы.Прервать.Доступность = Ложь;
	КонецЕсли;

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

Процедура УстановитьБазовыйЗаголовок()
	
	ЭтаФорма.Заголовок = "Фоновое задание формы - " + КраткоеПредставление;

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

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

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

Процедура ПоказатьПоследнююСтроку()
	ИзменитьВидимостьПотоков(Ложь);
	ПолеТекста = ирКлиент.ОболочкаПоляТекстаЛкс(ЭлементыФормы.ПолеТекста);
	#Если Сервер И Не Сервер Тогда
		ПолеТекста = Обработки.ирОболочкаПолеТекста.Создать();
	#КонецЕсли
	Если ВводДоступен() Тогда
		ПолеТекста.ПоказатьПоследнююСтроку(ЭтаФорма);
	Иначе
		ПолеТекста.ПоказатьПоследнююСтроку();
	КонецЕсли;
КонецПроцедуры

Процедура ИзменитьВидимостьПотоков(Знач НоваяВидимостьПотоков = Неопределено)
	
	Если Не Открыта() Тогда
		Возврат;
	КонецЕсли; 
	Если НоваяВидимостьПотоков = Неопределено Тогда
		Если Истина
			И ЭлементыФормы.Потоки.Свертка <> РежимСверткиЭлементаУправления.Нет 
			И Потоки.Количество() > 0
		Тогда 
			НоваяВидимостьПотоков = Истина;
		Иначе
			Возврат;
		КонецЕсли; 
	КонецЕсли; 
	ирКлиент.ИзменитьСвернутостьЛкс(ЭтаФорма, НоваяВидимостьПотоков, ЭлементыФормы.Потоки, ЭлементыФормы.гРазделитель2, ЭтаФорма.Панель, "верх");

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

Процедура ПриЗакрытии()
	ирКлиент.Форма_ПриЗакрытииЛкс(ЭтаФорма);
КонецПроцедуры

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт 
	ирКлиент.Форма_ОбработкаОповещенияЛкс(ЭтаФорма, ИмяСобытия, Параметр, Источник);
КонецПроцедуры

Процедура ВнешнееСобытие(Источник, Событие, Данные) Экспорт 
	ирКлиент.Форма_ВнешнееСобытиеЛкс(ЭтаФорма, Источник, Событие, Данные);
КонецПроцедуры

Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
	
	Если Не Отказ Тогда
		ИзменитьВидимостьПотоков(Истина);
	КонецЕсли;
	
КонецПроцедуры

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

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

