// Признак блокировки обновления фоновых и регламентных заданий при открытии модальных диалогов
Перем БлокироватьОбновление;
Перем ОтборПоЗаданиюИлиМетоду Экспорт;
Перем ОтборПоМетоду Экспорт;

Функция СохраняемаяНастройкаФормы(выхНаименование, выхИменаСвойств) Экспорт 
	выхИменаСвойств = "
	|АвтообновлениеСпискаРегламентныхЗаданий,
	|АвтообновлениеСпискаМетодов,
	|АвтообновлениеСпискаФоновыхЗаданий,
	|МетодыПодстрока,
	|ОтборФоновыхЗаданий,
	|ОтборРегламентныхЗаданий,
	|ОтборРегламентныхЗаданийВключен,
	|ОтборФоновыхЗаданийВключен,
	|ОтборПоЗаданиюИлиМетоду,
	|ОтборПоМетоду,
	|ПериодАвтообновленияСпискаРегламентныхЗаданий,
	|ПериодАвтообновленияСпискаМетодов,
	|ПериодАвтообновленияСпискаФоновыхЗаданий,
	|ПолучатьСообщенияПользователю,
	|ПолучатьОшибкиИзЖурнала,
	|СписокРегламентныхЗаданийСтрокаПоиска,
	|СортировкаРегламентныхЗаданий,
	|СортировкаМетодов
	|";
	Результат = Новый Структура;
	Результат.Вставить("ОтборРегламентныхЗаданий", ПреобразоватьОтборДляСохраненияЗначения(ОтборРегламентныхЗаданий));
	Возврат Результат;
КонецФункции

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

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

Процедура ОсновныеДействияФормыСохранитьНастройки(Кнопка)
	
	ирКлиент.ВыбратьИСохранитьНастройкуФормыЛкс(ЭтаФорма);
	
КонецПроцедуры

Процедура ОсновныеДействияФормыЗагрузитьНастройки(Кнопка)
	
	ирКлиент.ВыбратьИЗагрузитьНастройкуФормыЛкс(ЭтаФорма);

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

Процедура ОбновитьАктивныеФоновыеЗадания() Экспорт 
	
	//Если ирКэш.ЛиФайловаяБазаЛкс() Тогда
	//	Возврат;
	//КонецЕсли;
	ДоступнаСтрогаяСвязь = ирКэш.ДоступноСтрогаяСвязьСеансаСФоновымЗаданиемЛкс();
	ТаблицаСеансовФоновыхЗаданий = Новый ТаблицаЗначений;
	ТаблицаСеансовФоновыхЗаданий.Колонки.Добавить("НомерСеанса");
	ТаблицаСеансовФоновыхЗаданий.Колонки.Добавить("НомерСоединения");
	ТаблицаСеансовФоновыхЗаданий.Колонки.Добавить("ИмяПользователя");
	ТаблицаСеансовФоновыхЗаданий.Колонки.Добавить("НачалоСеанса", Новый ОписаниеТипов("Дата"));
	ТаблицаСеансовФоновыхЗаданий.Колонки.Добавить("ФоновоеЗадание", Новый ОписаниеТипов("Строка"));
	Если ПравоДоступа("Администрирование", Метаданные) Тогда
		Сеансы = ПолучитьСеансыИнформационнойБазы(); // Иногда выполняется долго
		Для Каждого Сеанс Из Сеансы Цикл
			#Если Сервер И Не Сервер Тогда
				Сеанс = ПолучитьТекущийСеансИнформационнойБазы();
			#КонецЕсли
			Если ирОбщий.СтрокиРавныЛкс(Сеанс.ИмяПриложения, "BackgroundJob") Тогда
				СтрокаСеанса = ТаблицаСеансовФоновыхЗаданий.Добавить();
				ЗаполнитьЗначенияСвойств(СтрокаСеанса, Сеанс);
				Если ДоступнаСтрогаяСвязь Тогда
					ФоновоеЗаданиеСеанса = Сеанс.ПолучитьФоновоеЗадание();
					Если ФоновоеЗаданиеСеанса <> Неопределено Тогда
						СтрокаСеанса.ФоновоеЗадание = ФоновоеЗаданиеСеанса.УникальныйИдентификатор;
					Иначе
						// Аварийное состояние фонового задания https://www.hostedredmine.com/issues/936854
					КонецЕсли; 
				КонецЕсли; 
			КонецЕсли; 
		КонецЦикла;
	КонецЕсли; 
	АктивныеФоновыеЗадания = ПолучитьФоновыеЗадания(Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно));
	ТаблицаАктивныхФоновыхЗаданий = Новый ТаблицаЗначений;
	ТаблицаАктивныхФоновыхЗаданий.Колонки.Добавить("Идентификатор");
	ТаблицаАктивныхФоновыхЗаданий.Колонки.Добавить("Начало", Новый ОписаниеТипов("Дата"));
	ТаблицаАктивныхФоновыхЗаданий.Колонки.Добавить("НомерСеанса");
	ТаблицаАктивныхФоновыхЗаданий.Колонки.Добавить("НомерСоединения");
	ТаблицаАктивныхФоновыхЗаданий.Колонки.Добавить("ИмяПользователя");
	Для Каждого АктивноеФоновоеЗадание Из АктивныеФоновыеЗадания Цикл
		СтрокаАктивногоЗадания = ТаблицаАктивныхФоновыхЗаданий.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаАктивногоЗадания, АктивноеФоновоеЗадание); 
		СтрокаАктивногоЗадания.Идентификатор = АктивноеФоновоеЗадание.УникальныйИдентификатор;
	КонецЦикла;
	ТаблицаАктивныхФоновыхЗаданий.Сортировать("Начало");
	ПостроительСеансов = Новый ПостроительЗапроса;
	ПостроительСеансов.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаСеансовФоновыхЗаданий);
	Если ДоступнаСтрогаяСвязь Тогда
		ТаблицаСеансовФоновыхЗаданий.Индексы.Добавить("ФоновоеЗадание");
		ЭлементОтбораНачалаСеанса = ПостроительСеансов.Отбор.Добавить("ФоновоеЗадание");
	Иначе
		ТаблицаСеансовФоновыхЗаданий.Индексы.Добавить("НачалоСеанса");
		ПостроительСеансов.Порядок.Установить("НачалоСеанса");
		ЭлементОтбораНачалаСеанса = ПостроительСеансов.Отбор.Добавить("НачалоСеанса");
		ЭлементОтбораНачалаСеанса.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;
	КонецЕсли; 
	ЭлементОтбораНачалаСеанса.Использование = Истина;
	Для Каждого СтрокаАктивногоЗадания Из ТаблицаАктивныхФоновыхЗаданий Цикл
		Если ЭлементОтбораНачалаСеанса.Имя = "НачалоСеанса" Тогда
			ЭлементОтбораНачалаСеанса.ЗначениеС = СтрокаАктивногоЗадания.Начало;
			ЭлементОтбораНачалаСеанса.ЗначениеПо = СтрокаАктивногоЗадания.Начало + 3; // Размер допустимой задержки между началом сеанса и началом задания
		Иначе
			ЭлементОтбораНачалаСеанса.Значение = "" + СтрокаАктивногоЗадания.Идентификатор;
		КонецЕсли; 
		СеансыКандидаты = ПостроительСеансов.Результат.Выгрузить();
		Для Каждого СеансКандидат Из СеансыКандидаты Цикл
			ЗанятаяСтрока = ТаблицаАктивныхФоновыхЗаданий.Найти(СеансКандидат.НомерСеанса, "НомерСеанса");
			Если ЗанятаяСтрока = Неопределено Тогда
				СтрокаАктивногоЗадания.НомерСеанса = СеансКандидат.НомерСеанса;
				СтрокаАктивногоЗадания.НомерСоединения = СеансКандидат.НомерСоединения;
				СтрокаАктивногоЗадания.ИмяПользователя = СеансКандидат.ИмяПользователя;
				Прервать;
			КонецЕсли; 
		КонецЦикла;
	КонецЦикла;

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

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

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

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

Процедура ОбновитьПоследнееЗаданиеВСтрокеРегЗадания(Знач НоваяРегЗадания, Знач Регламентное, Знач ПоследнееЗадание = Неопределено, Знач ДатаПроверкиСледующегоЗапуска = Неопределено)
	
	#Если Сервер И Не Сервер Тогда
		Регламентное = РегламентныеЗадания.НайтиПредопределенное();
	#КонецЕсли
	Если ДатаПроверкиСледующегоЗапуска = Неопределено Тогда
		ДатаПроверкиСледующегоЗапуска = ТекущаяДата();
	КонецЕсли;                                        
	Если ПоследнееЗадание = Неопределено Тогда
		ПоследнееЗадание = ПоследнееЗаданиеРегламентногоЗадания(Регламентное);
	КонецЕсли;
	НоваяРегЗадания.ПоследнееНачало = ПоследнееЗадание.Начало;
	НоваяРегЗадания.ПоследнийКонец = ПоследнееЗадание.Конец;
	НоваяРегЗадания.СостояниеПредставление = ПоследнееЗадание.Состояние;
	НоваяРегЗадания.СостояниеЗадания = ПоследнееЗадание.Состояние;
	НоваяРегЗадания.Длительность = ДлительностьФоновогоЗадания(ПоследнееЗадание);
	НоваяРегЗадания.СледующееНачало = СледующаяДатаВыполненияРасписания(Регламентное.Расписание, ДатаПроверкиСледующегоЗапуска, ПоследнееЗадание.Начало, ПоследнееЗадание.Конец);
	Если ПоследнееЗадание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
		СтрокаАктивногоФоновогоЗадания = ТаблицаАктивныхФоновыхЗаданий.Найти(ПоследнееЗадание.УникальныйИдентификатор, "Идентификатор");
		Если СтрокаАктивногоФоновогоЗадания <> Неопределено Тогда
			НоваяРегЗадания.НомерСеанса = СтрокаАктивногоФоновогоЗадания.НомерСеанса;
			НоваяРегЗадания.НомерСоединения = СтрокаАктивногоФоновогоЗадания.НомерСоединения;
		КонецЕсли; 
	КонецЕсли;

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

// Обновить список фоновых заданий
//
Функция ОбновитьСписокФоновыхЗаданий(ВызовВнутриОбновленияРегламентныхЗаданий = Ложь, ДляСбораСтатистики = Ложь, Перезапустить = Ложь)
	Перем ТекущийИдентификатор;
	
	Если БлокироватьОбновление Тогда
		Возврат Неопределено;
	КонецЕсли;
	ОтображатьИндикатор = Истина;
	Если ирКэш.ЛиСеансТолстогоКлиентаУПЛкс() Тогда 
		// Антибаг платформы 8.3.17 http://www.hostedredmine.com/issues/876258
		ОтображатьИндикатор = ВводДоступен();
	КонецЕсли;
	Если ОтборФоновыхЗаданий = Неопределено Тогда
		ОтборФоновыхЗаданий = Новый Структура;
	КонецЕсли; 
	ОтборФоновыхЗаданий.Удалить("Конец");
	Если ЗначениеЗаполнено(ПериодПоследниеМинуты) Тогда
		ОтборФоновыхЗаданий.Вставить("Начало", ТекущаяДата() - ПериодПоследниеМинуты * 60);
	Иначе
		ОтборФоновыхЗаданий.Удалить("Начало");
	КонецЕсли; 
	Отбор = Новый Структура;
	Если ДляСбораСтатистики Тогда
		ИмяЗаданияФормы = "ЧтениеВсехФоновыхЗаданийСтатистика";
		Кнопка = ЭлементыФормы.КоманднаяПанельМетоды.Кнопки.Обновить;
	Иначе
		ИмяЗаданияФормы = "ЧтениеВсехФоновыхЗаданий";
		Отбор = ОтборФоновыхЗаданий;
		ЭлементыФормы.КПФоновыеЗадания.Кнопки.ОтключитьОтбор.Доступность = Отбор.Количество() > 0;
		ОтборПоПустомуРегламентномуЗаданию = Ложь;
	КонецЕсли; 
	КонечныйОтбор = ирОбщий.КопияОбъектаЛкс(Отбор);
	#Если Сервер И Не Сервер Тогда
		КонечныйОтбор = Новый Структура;
	#КонецЕсли
	РегламентноеЗадание = Неопределено;
	Если Истина
		И Отбор.Свойство("РегламентноеЗадание", РегламентноеЗадание) 
		И (Ложь
			Или РегламентноеЗадание = Неопределено 
			Или ДляСбораСтатистики)
	Тогда
		ОтборПоПустомуРегламентномуЗаданию = Не ОтборПоМетоду;
		КонечныйОтбор.Удалить("РегламентноеЗадание");
		Если ОтборПоПустомуРегламентномуЗаданию Тогда
			КонечныйОтбор.Вставить("РегламентноеЗадание", Неопределено);
		КонецЕсли; 
	КонецЕсли; 
	ИмяМетода = Неопределено;
	Если Истина
		И Отбор.Свойство("ИмяМетода", ИмяМетода) 
		И (Ложь
			Или Не ЗначениеЗаполнено(ИмяМетода) 
			Или ДляСбораСтатистики)
	Тогда
		КонечныйОтбор.Удалить("ИмяМетода");
	КонецЕсли;
	Если КонечныйОтбор.Количество() <= 1 И Не ПолучатьОшибкиИзЖурнала Тогда
		Если Кнопка = Неопределено Тогда
			Кнопка = ЭлементыФормы.КПФоновыеЗадания.Кнопки.Обновить;
		КонецЕсли; 
	КонецЕсли; 
	ТаблицаЗаданий = СписокФоновыхЗаданий.СкопироватьКолонки();
	ПараметрыЗадания = Новый Структура;
	ПараметрыЗадания.Вставить("ВыполнятьНаСервере", Кнопка <> Неопределено);
	ПараметрыЗадания.Вставить("ТаблицаЗаданий", ТаблицаЗаданий);
	ПараметрыЗадания.Вставить("ДляСбораСтатистики", ДляСбораСтатистики);
	ПараметрыЗадания.Вставить("КонечныйОтбор", КонечныйОтбор);
	ПараметрыЗадания.Вставить("ОтображатьИндикатор", ОтображатьИндикатор);
	ПараметрыЗадания.Вставить("ВызовВнутриОбновленияРегламентныхЗаданий", ВызовВнутриОбновленияРегламентныхЗаданий);
	#Если Сервер И Не Сервер Тогда
		ФоновыеЗаданияПодробно(ПараметрыЗадания); 
		ПолучитьФоновыеЗаданияПодробноЗавершение();
	#КонецЕсли
	РезультатЗапуска = ирОбщий.ВыполнитьЗаданиеФормыЛкс("ФоновыеЗаданияПодробно", ПараметрыЗадания, ЭтаФорма, ИмяЗаданияФормы,, Кнопка,
		"ПолучитьФоновыеЗаданияПодробноЗавершение",,,, Перезапустить);
	Если Ложь
		Или РезультатЗапуска = Тип("ФоновоеЗадание") 
		Или РезультатЗапуска = Неопределено 
	Тогда
		ТаблицаЗаданий = Неопределено;
	Иначе
		ТаблицаЗаданий = РезультатЗапуска.ТаблицаЗаданий;
	КонецЕсли;
	Возврат ТаблицаЗаданий; 
	
КонецФункции

// Предопределеный метод
Процедура ПроверкаЗавершенияФоновыхЗаданий() Экспорт 
	
	ирКлиент.ПроверитьЗавершениеФоновыхЗаданийФормыЛкс(ЭтаФорма);
	
КонецПроцедуры

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

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

// Автообновление списка методов
//
Процедура ОбновитьСписокМетодов()
	
	Если Ложь
		Или Не ирКлиент.Форма_ВводДоступенЛкс(ЭтаФорма)
		Или ЭлементыФормы.ПанельОсновная.ТекущаяСтраница <> ЭлементыФормы.ПанельОсновная.Страницы.Методы 
	Тогда
		Возврат;
	КонецЕсли; 
	ОбновитьСписокМетодовСПараметрами(Истина);

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

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

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

Процедура ЗагрузитьСписокМетодов(Знач ТаблицаЗаданий)
	
	#Если Сервер И Не Сервер Тогда
		ТаблицаЗаданий = Новый ТаблицаЗначений;
	#КонецЕсли
	КлючТекущейСтроки = ирКлиент.ТабличноеПолеКлючСтрокиЛкс(ЭлементыФормы.Методы, "ИмяМетода");
	КлючиВыделенныхСтрок = ирКлиент.ТабличноеПолеКлючиСтрокЛкс(ЭлементыФормы.Методы, "ИмяМетода");
	Методы.Очистить();
	лМетоды = ТаблицаЗаданий.Скопировать();
	лМетоды.Свернуть("ИмяМетода");
	СоответствиеМетодовМетаданным = Новый Соответствие;
	Для Каждого МетаРегламентноеЗадание Из Метаданные.РегламентныеЗадания Цикл
		СоответствиеМетодовМетаданным.Вставить(МетаРегламентноеЗадание.ИмяМетода, МетаРегламентноеЗадание.Имя);
	КонецЦикла; 
	Для Каждого ИмяМетода Из лМетоды.ВыгрузитьКолонку("ИмяМетода") Цикл
		Если ЗначениеЗаполнено(МетодыПодстрока) Тогда
			Если Найти(НРег(ИмяМетода), Нрег(МетодыПодстрока)) = 0 Тогда
				Продолжить;
			КонецЕсли; 
		КонецЕсли;
		СтрокаМетода = Методы.Добавить();
		СтрокаМетода.ИмяМетода = ИмяМетода;
		СтрокаМетода.Метаданные = СоответствиеМетодовМетаданным[СтрокаМетода.ИмяМетода];
		ФоновыеЗаданияМетода = ТаблицаЗаданий.Скопировать(Новый Структура("ИмяМетода", ИмяМетода));
		ФоновыеЗаданияМетода.Сортировать("Начало Убыв");
		СтрокаМетода.СостояниеПредставление = ФоновыеЗаданияМетода[0].СостояниеПредставление;
		СтрокаМетода.СостояниеЗадания = ФоновыеЗаданияМетода[0].СостояниеЗадания;
		АктивныеЗадания = ФоновыеЗаданияМетода.Скопировать(Новый Структура("СостояниеЗадания", СостояниеФоновогоЗадания.Активно));
		СтрокаМетода.КоличествоАктивных = АктивныеЗадания.Количество();
		Если СтрокаМетода.КоличествоАктивных > 0 Тогда
			АктивныеЗадания.Сортировать("Начало");
			СтрокаМетода.ПоследнееНачало = АктивныеЗадания[0].Начало;
			СтрокаМетода.ПоследнийКонец = АктивныеЗадания[0].Конец;
			СтрокаМетода.Длительность = ДлительностьФоновогоЗадания(АктивныеЗадания[0]);
			СтрокаМетода.Возраст = 0;
		Иначе
			СтрокаМетода.ПоследнееНачало = ФоновыеЗаданияМетода[0].Начало;
			СтрокаМетода.ПоследнийКонец = ФоновыеЗаданияМетода[0].Конец;
			СтрокаМетода.Длительность = СтрокаМетода.ПоследнийКонец - СтрокаМетода.ПоследнееНачало;
			СтрокаМетода.Возраст = (ТекущаяДата() - СтрокаМетода.ПоследнийКонец) / 60;
		КонецЕсли; 
		СтрокаМетода.КоличествоОшибочных = ФоновыеЗаданияМетода.НайтиСтроки(Новый Структура("СостояниеЗадания", СостояниеФоновогоЗадания.ЗавершеноАварийно)).Количество();
		СтрокаМетода.КоличествоВсего = ФоновыеЗаданияМетода.Количество();
		// Статистика
		Пока Истина
			И ФоновыеЗаданияМетода.Количество() > 0
			И (Ложь
				Или ФоновыеЗаданияМетода[0].СостояниеЗадания = СостояниеФоновогоЗадания.Активно 
				Или ФоновыеЗаданияМетода[0].СостояниеЗадания = СостояниеФоновогоЗадания.Отменено)
		Цикл 
			ФоновыеЗаданияМетода.Удалить(0);
		КонецЦикла; 
		Если ФоновыеЗаданияМетода.Количество() > 0 Тогда
			СтрокаМетода.ПоследняяДлительность = ФоновыеЗаданияМетода[0].Длительность;
			ФоновыеЗаданияМетода.Сортировать("Длительность Убыв");
			СтрокаМетода.МаксДлительность = ФоновыеЗаданияМетода[0].Длительность;
			СтрокаМетода.СредняяДлительность = ФоновыеЗаданияМетода.Итог("Длительность") / ФоновыеЗаданияМетода.Количество();
		КонецЕсли; 
	КонецЦикла;
	//Для Каждого СтрокаРегламентного Из СписокРегламентныхЗаданий Цикл
	//	Если Ложь
	//		Или СтрокаРегламентного.ИмяМетода = ""
	//		Или Методы.Найти(СтрокаРегламентного.ИмяМетода, "ИмяМетода") <> Неопределено 
	//	Тогда
	//		Продолжить;
	//	КонецЕсли; 
	//	СтрокаМетода = Методы.Добавить();
	//	СтрокаМетода.ИмяМетода = СтрокаРегламентного.ИмяМетода;
	//	СтрокаМетода.Метаданные = СоответствиеМетодовМетаданным[СтрокаМетода.ИмяМетода];
	//КонецЦикла;
	Методы.Сортировать(СортировкаМетодов);
	ЭтаФорма.РазмерСпискаМетодов = Методы.Количество();
	Если Не ирКлиент.ТабличноеПолеВосстановитьТекущуюСтрокуЛкс(ЭлементыФормы.Методы, КлючТекущейСтроки) Тогда 
		//Если ЛиОтборФоновыхЗаданийВключен() Тогда
		//	АвтоОбновитьФоновыеЗадания();
		//КонецЕсли;
	КонецЕсли; 
	ирКлиент.ТабличноеПолеВосстановитьВыделенныеСтрокиЛкс(ЭлементыФормы.Методы, КлючиВыделенныхСтрок);

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

Функция ЛиОтборФоновыхЗаданийВключен()
	
	Возврат ОтборФоновыхЗаданий <> Неопределено И ОтборФоновыхЗаданий.Количество() > 0;

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

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

Функция ПреобразоватьОтборПослеВосстановленияЗначений(СтарыйОтбор)
	
	Если СтарыйОтбор = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	НовыйОтбор = Новый Структура;
	Для Каждого Свойство Из СтарыйОтбор Цикл
		Если Свойство.Ключ = "Метаданные" Тогда 
			Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда
				НовыйОтбор.Вставить(Свойство.Ключ, Метаданные.РегламентныеЗадания[Свойство.Значение]);
			КонецЕсли; 
		Иначе
			НовыйОтбор.Вставить(Свойство.Ключ, Свойство.Значение);
		КонецЕсли;
	КонецЦикла;
	
	Возврат НовыйОтбор;
	
КонецФункции

// Возвращает следующую дата выполнения расписания.
// Первоисточник - ОчередьЗаданийСлужебный.СледующаяДатаВыполненияРасписания
//
// Параметры:
//  Расписание - РасписаниеРегламентногоЗадания - расписание по которому
//   будет рассчитываться дата
//  ДатаДляПроверки - Дата (ДатаВремя) - минимальная дата на которую может
//   быть запланировано выполнение
//  ДатаНачалаПоследнегоЗапуска - Дата (ДатаВремя) - Дата начала последнего 
//   запуска задания. Если дата задана, то используется для проверки таких 
//   условий как ПериодПовтораДней, ПериодНедель, ПериодПовтораВТечениеДня. 
//   Если дата не задана, то считается, что задание не выполнялось ни разу 
//   и проверка этих условий не производится. 
//  ДатаЗавершенияПоследнегоЗапуска - Дата (ДатаВремя) - Дата завершения 
//   последнего запуска задания. Если дата задана, то используется для 
//   проверки условия ПаузаПовтора. Если дата не задана, то считается, что 
//   задание ни разу не завершалось, и проверка этого условия не производится. 
//  МаксимальныйГоризонтПланирования - Число - Максимальное количество секунд
//   относительно ДатаДляПроверки на которое может быть выполнено планирование.
//   Увеличение значения может привести к замедлению расчета на сложных
//   расписаниях
//
Функция СледующаяДатаВыполненияРасписания(Знач Расписание, Знач ДатаДляПроверки = Неопределено, Знач ДатаНачалаПоследнегоЗапуска = Неопределено, Знач ДатаЗавершенияПоследнегоЗапуска = Неопределено, 
	Знач МаксимальныйГоризонтПланирования = Неопределено) Экспорт
	
	Если ДатаДляПроверки = Неопределено Тогда
		ДатаДляПроверки = ТекущаяДата();
	КонецЕсли; 
	Если МаксимальныйГоризонтПланирования = Неопределено Тогда
		МаксимальныйГоризонтПланирования = 31 * 24 * 60 * 60; // 1 месяц
	КонецЕсли;
	
	ИсходнаяДатаДляПроверки = ДатаДляПроверки;
	Если ДатаНачалаПоследнегоЗапуска = Неопределено Тогда
		ДатаНачалаПоследнегоЗапуска = Дата(1, 1, 1);
	КонецЕсли; 
	ВремяНачалаПоследнегоЗапуска = '00010101' + (ДатаНачалаПоследнегоЗапуска - НачалоДня(ДатаНачалаПоследнегоЗапуска));
	
	// Границы по датам
	Если ЗначениеЗаполнено(Расписание.ДатаКонца)
		И ДатаДляПроверки > Расписание.ДатаКонца Тогда
		
		// Интервал выполнения по дням закончился
		Возврат '00010101';
	КонецЕсли;
		
	Если ДатаДляПроверки < Расписание.ДатаНачала Тогда
		ДатаДляПроверки = Расписание.ДатаНачала;
	КонецЕсли;
	
	МожноМенятьДень = Истина;
	
	// Учет периодичности
	Если ЗначениеЗаполнено(ДатаНачалаПоследнегоЗапуска) Тогда
		
		// Период недель
		Если Расписание.ПериодНедель > 1
			И (НачалоНедели(ДатаДляПроверки) - НачалоНедели(ДатаНачалаПоследнегоЗапуска)) / (7 * 86400) < Расписание.ПериодНедель Тогда
		
			ДатаДляПроверки = НачалоНедели(ДатаНачалаПоследнегоЗапуска) + 7 * 86400 * Расписание.ПериодНедель;
		КонецЕсли;
		
		// Период дней
		Если Расписание.ПериодПовтораДней = 0 Тогда
			Если НачалоДня(ДатаДляПроверки) <> НачалоДня(ДатаНачалаПоследнегоЗапуска) Тогда
				// Повторения не установлено и задание уже выполнялось
				Возврат '00010101';
			КонецЕсли;
			
			МожноМенятьДень = Ложь;
		КонецЕсли;
		
		Если Расписание.ПериодПовтораДней > 1
			И НачалоДня(ДатаДляПроверки) - НачалоДня(ДатаНачалаПоследнегоЗапуска) < (Расписание.ПериодПовтораДней - 1)* 86400 Тогда
			
			ДатаДляПроверки = НачалоДня(ДатаНачалаПоследнегоЗапуска) + Расписание.ПериодПовтораДней * 86400;
		КонецЕсли;
		
		//Если задание повторяется раз в день (но не чаще) то сдвигаем на следующий день после последнего запуска
		Если Расписание.ПериодПовтораДней = 1 И Расписание.ПериодПовтораВТечениеДня = 0 Тогда
			ДатаДляПроверки = Макс(ДатаДляПроверки, НачалоДня(ДатаНачалаПоследнегоЗапуска+86400));
		КонецЕсли;

	КонецЕсли;
	
	// Учет допустимых интервалов запуска
	ПоменятьМесяц = Ложь;
	ПоменятьДень = Ложь;
	Пока Истина Цикл
		
		Если ДатаДляПроверки - ИсходнаяДатаДляПроверки > МаксимальныйГоризонтПланирования Тогда
			// Отложить планирование
			Возврат '00010101';
		КонецЕсли;
		
		Если НЕ МожноМенятьДень
			И (ПоменятьДень ИЛИ ПоменятьМесяц) Тогда
			
			// Повторения не установлено и задание уже выполнялось
			Возврат '00010101';
		КонецЕсли;
		
		// Месяцы
		Пока Ложь
			Или ПоменятьМесяц
			Или Расписание.Месяцы.Количество() > 0 И Расписание.Месяцы.Найти(Месяц(ДатаДляПроверки)) = Неопределено 
		Цикл
			ПоменятьМесяц = Ложь;
			// Переход на следующий месяц
			ДатаДляПроверки = НачалоМесяца(ДобавитьМесяц(ДатаДляПроверки, 1));
		КонецЦикла;
		
		// День месяца
		ДнейВМесяце = День(КонецМесяца(ДатаДляПроверки));
		Если Расписание.ДеньВМесяце <> 0 Тогда
			
			ТекущийДень = День(ДатаДляПроверки);
			
			Если Ложь
				Или (Истина
					И Расписание.ДеньВМесяце > 0 
					И (ДнейВМесяце < Расписание.ДеньВМесяце ИЛИ ТекущийДень > Расписание.ДеньВМесяце))
				Или (Истина
					И Расписание.ДеньВМесяце < 0 
					И (ДнейВМесяце < -Расписание.ДеньВМесяце ИЛИ ТекущийДень > ДнейВМесяце - -Расписание.ДеньВМесяце)) Тогда
				
				// В этом месяце нет такого числа или оно уже прошло
				ПоменятьМесяц = Истина;
				Продолжить;
			КонецЕсли;
			
			Если Расписание.ДеньВМесяце > 0 Тогда
				ДатаДляПроверки = НачалоМесяца(ДатаДляПроверки) + (Расписание.ДеньВМесяце - 1) * 86400;
			КонецЕсли;
			
			Если Расписание.ДеньВМесяце < 0 Тогда
				ДатаДляПроверки = НачалоДня(КонецМесяца(ДатаДляПроверки)) - (-Расписание.ДеньВМесяце -1) * 86400;
			КонецЕсли;
		КонецЕсли;
		
		// День недели в месяце
		Если Расписание.ДеньНеделиВМесяце <> 0 Тогда
			Если Расписание.ДеньНеделиВМесяце > 0 Тогда
				ДеньНачалаНедели = (Расписание.ДеньНеделиВМесяце - 1) * 7 + 1;
			КонецЕсли;
			Если Расписание.ДеньНеделиВМесяце < 0 Тогда
				ДеньНачалаНедели = ДнейВМесяце - (-Расписание.ДеньНеделиВМесяце) * 7 + 1;
			КонецЕсли;
			
			ДеньКонцаНедели = Мин(ДеньНачалаНедели + 6, ДнейВМесяце);
			
			Если День(ДатаДляПроверки) > ДеньКонцаНедели 
				ИЛИ ДеньНачалаНедели > ДнейВМесяце Тогда
				// В этом месяце нужная неделя уже прошла (или ее не было)
				ПоменятьМесяц = Истина;
				Продолжить;
			КонецЕсли;
			
			Если День(ДатаДляПроверки) < ДеньНачалаНедели Тогда
				Если Расписание.ДеньВМесяце <> 0 Тогда
					
					// День зафиксирован и он не подходит
					ПоменятьМесяц = Истина;
					Продолжить;
				КонецЕсли;
				ДатаДляПроверки = НачалоМесяца(ДатаДляПроверки) + (ДеньНачалаНедели - 1) * 86400;
			КонецЕсли;
		КонецЕсли;
		
		// День недели
		Пока Ложь
			Или ПоменятьДень
			Или Расписание.ДниНедели.Найти(ДеньНедели(ДатаДляПроверки)) = Неопределено И Расписание.ДниНедели.Количество() > 0 
		Цикл
			ПоменятьДень = Ложь;
			Если Расписание.ДеньВМесяце <> 0 Тогда
				// День зафиксирован и он не подходит
				ПоменятьМесяц = Истина;
				Прервать;
			КонецЕсли;
			Если День(ДатаДляПроверки) = ДнейВМесяце Тогда
				// Месяц кончился
				ПоменятьМесяц = Истина;
				Прервать;
			КонецЕсли;
			Если Истина
				И Расписание.ДеньНеделиВМесяце <> 0
				И День(ДатаДляПроверки) = ДеньКонцаНедели 
			Тогда
				// Нужная неделя кончилась
				ПоменятьМесяц = Истина;
				Прервать;
			КонецЕсли;
			
			ДатаДляПроверки = НачалоДня(ДатаДляПроверки) + 86400;
		КонецЦикла;
		Если ПоменятьМесяц Тогда
			Продолжить;
		КонецЕсли;
		
		// Учет времени
		ВремяДляПроверки = '00010101' + (ДатаДляПроверки - НачалоДня(ДатаДляПроверки));
		
		Если Расписание.ДетальныеРасписанияДня.Количество() = 0 Тогда
			ДетальныеРасписания = Новый Массив;
			ДетальныеРасписания.Добавить(Расписание);
		Иначе
			ДетальныеРасписания = Расписание.ДетальныеРасписанияДня;
		КонецЕсли;
		
		// Если у нас есть промежутки, с переходом через полночь, то разбиваем их на два промежутка
		Индекс = 0;
		Пока Индекс < ДетальныеРасписания.Количество() Цикл
			РасписаниеДня = ДетальныеРасписания[Индекс];
			Если НЕ ЗначениеЗаполнено(РасписаниеДня.ВремяНачала) ИЛИ НЕ ЗначениеЗаполнено(РасписаниеДня.ВремяКонца) Тогда
				Индекс = Индекс + 1;
				Продолжить;
			КонецЕсли;
			Если РасписаниеДня.ВремяНачала > РасписаниеДня.ВремяКонца Тогда
				РасписаниеДняПерваяПоловина = Новый РасписаниеРегламентногоЗадания();
				ЗаполнитьЗначенияСвойств(РасписаниеДняПерваяПоловина,РасписаниеДня);
				РасписаниеДняПерваяПоловина.ВремяНачала = НачалоДня(РасписаниеДняПерваяПоловина.ВремяНачала);
				ДетальныеРасписания.Добавить(РасписаниеДняПерваяПоловина);
				РасписаниеДняВтораяПоловина = Новый РасписаниеРегламентногоЗадания();
				ЗаполнитьЗначенияСвойств(РасписаниеДняВтораяПоловина,РасписаниеДня);
				РасписаниеДняВтораяПоловина.ВремяКонца = КонецДня(РасписаниеДняВтораяПоловина.ВремяНачала);
				ДетальныеРасписания.Добавить(РасписаниеДняВтораяПоловина);
				ДетальныеРасписания.Удалить(Индекс);
			Иначе
				Индекс = Индекс + 1;
			КонецЕсли;
		КонецЦикла;
		
		Для Индекс = 0 По ДетальныеРасписания.ВГраница() Цикл
			РасписаниеДня = ДетальныеРасписания[Индекс];
			
			// Границы по времени
			Если ЗначениеЗаполнено(РасписаниеДня.ВремяНачала)
				И ВремяДляПроверки < РасписаниеДня.ВремяНачала Тогда
				
				ВремяДляПроверки = РасписаниеДня.ВремяНачала;
			КонецЕсли;
			
			Если ЗначениеЗаполнено(РасписаниеДня.ВремяКонца)
				И ВремяДляПроверки > РасписаниеДня.ВремяКонца Тогда
				
				Если Индекс < ДетальныеРасписания.ВГраница() Тогда
					// Есть еще расписания дня
					Продолжить;
				КонецЕсли;
				
				// В этом дне подходящее время уже прошло
				ПоменятьДень = Истина;
				Прервать;
			КонецЕсли;
			
			// Период повтора в течении дня
			Если ЗначениеЗаполнено(ДатаНачалаПоследнегоЗапуска) Тогда
				
				Если Истина
					И РасписаниеДня.ПериодПовтораВТечениеДня = 0
					И НачалоДня(ДатаДляПроверки) = НачалоДня(ДатаНачалаПоследнегоЗапуска)
					И (Ложь 
						Или НЕ ЗначениеЗаполнено(РасписаниеДня.ВремяНачала) 
						Или ЗначениеЗаполнено(РасписаниеДня.ВремяНачала) И ВремяНачалаПоследнегоЗапуска >= РасписаниеДня.ВремяНачала)
					И (Ложь
						Или НЕ ЗначениеЗаполнено(РасписаниеДня.ВремяКонца) 
						Или ЗначениеЗаполнено(РасписаниеДня.ВремяКонца) И ВремяНачалаПоследнегоЗапуска <= РасписаниеДня.ВремяКонца) 
				Тогда
					
					// В этом интервале (расписании дня) задание уже выполнялось и повторы не установлены
					Если Индекс < ДетальныеРасписания.ВГраница() Тогда
						Продолжить;
					КонецЕсли;
					
					ПоменятьДень = Истина;
					Прервать;
				КонецЕсли;
				
				Если НачалоДня(ДатаДляПроверки) = НачалоДня(ДатаНачалаПоследнегоЗапуска)
					И ВремяДляПроверки - ВремяНачалаПоследнегоЗапуска < РасписаниеДня.ПериодПовтораВТечениеДня Тогда
					
					НовоеВремяДляПроверки = ВремяНачалаПоследнегоЗапуска + РасписаниеДня.ПериодПовтораВТечениеДня;
					Если Ложь
						Или (Истина
							И ЗначениеЗаполнено(РасписаниеДня.ВремяКонца) 
							И НовоеВремяДляПроверки > РасписаниеДня.ВремяКонца)
						Или НачалоДня(НовоеВремяДляПроверки) <> НачалоДня(ВремяДляПроверки)
					Тогда
						// Время ушло за интервал
						Если Индекс < ДетальныеРасписания.ВГраница() Тогда
							Продолжить;
						КонецЕсли;
						ПоменятьДень = Истина;
						Прервать;
					КонецЕсли;
					
					ВремяДляПроверки = НовоеВремяДляПроверки;
					
				КонецЕсли;
				
			КонецЕсли;
			
			// Пауза
			Если ЗначениеЗаполнено(ДатаЗавершенияПоследнегоЗапуска) 
				И ЗначениеЗаполнено(РасписаниеДня.ПаузаПовтора) Тогда
				
				ВремяЗавершенияПоследнегоЗапуска = '00010101' + (ДатаЗавершенияПоследнегоЗапуска - НачалоДня(ДатаЗавершенияПоследнегоЗапуска));
				
				Если НачалоДня(ДатаДляПроверки) = НачалоДня(ДатаНачалаПоследнегоЗапуска)
					И ВремяДляПроверки - ВремяЗавершенияПоследнегоЗапуска < РасписаниеДня.ПаузаПовтора Тогда
					
					НовоеВремяДляПроверки = ВремяЗавершенияПоследнегоЗапуска + РасписаниеДня.ПаузаПовтора;
					
					Если ЗначениеЗаполнено(РасписаниеДня.ВремяКонца) И НовоеВремяДляПроверки > РасписаниеДня.ВремяКонца
						ИЛИ НачалоДня(НовоеВремяДляПроверки) <> НачалоДня(ВремяДляПроверки) Тогда
						
						// Время ушло за интервал
						Если Индекс < ДетальныеРасписания.ВГраница() Тогда
							Продолжить;
						КонецЕсли;
						
						ПоменятьДень = Истина;
						Прервать;
					КонецЕсли;
					
					ВремяДляПроверки = НовоеВремяДляПроверки;
					
				КонецЕсли;
			КонецЕсли;
			
			// Нашли подходящее время
			Прервать;
			
		КонецЦикла;
		
		Если ПоменятьДень Тогда
			Продолжить;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(Расписание.ВремяЗавершения)
			И ВремяДляПроверки > Расписание.ВремяЗавершения Тогда
			// В этом дне выполнять поздно
			ПоменятьДень = Истина;
			Продолжить;
		КонецЕсли;
		
		ДатаДляПроверки = НачалоДня(ДатаДляПроверки) + (ВремяДляПроверки - НачалоДня(ВремяДляПроверки));
		
		Возврат ДатаДляПроверки;
		
	КонецЦикла;
	
КонецФункции

Процедура ОбновитьРегламентныеНажатие(Кнопка)
	
	ОбновитьСписокРегламентныхЗаданий();
	
КонецПроцедуры

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

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

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

Процедура МетодыОбновитьПодменюПоследниеВыбранные()
	
	ирКлиент.ПоследниеВыбранныеЗаполнитьПодменюЛкс(ЭтаФорма, ЭлементыФормы.КоманднаяПанельМетоды.Кнопки.ПоследниеВыбранные, ЭлементыФормы.Методы);

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

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

Функция МетодыПоследниеВыбранныеНажатие(Кнопка) Экспорт
	
	ирКлиент.ПоследниеВыбранныеНажатиеЛкс(ЭтаФорма, ЭлементыФормы.Методы, "ИмяМетода", Кнопка);
	
КонецФункции

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

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

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

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

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

Процедура СписокРегламентныхЗаданийПередНачаломДобавления(Элемент, Отказ, Копирование)
	Отказ = Истина;
	Форма = ОбработкаОбъект.ПолучитьФорму("ДиалогРегламентногоЗадания");
	ТекущаяСтрока = ЭлементыФормы.СписокРегламентныхЗаданий.ТекущаяСтрока;
	Если ТекущаяСтрока <> Неопределено Тогда
		Форма.МетаданныеВыбор = Метаданные.РегламентныеЗадания.Найти(ТекущаяСтрока.МетаданныеИмя);
	КонецЕсли; 
	РезультатФормы = Форма.ОткрытьМодально();
	Если РезультатФормы <> Неопределено Тогда
		ОбновитьСписокРегламентныхЗаданийСПараметрами("" + РезультатФормы);
	КонецЕсли;
КонецПроцедуры

Функция ПоследнееЗаданиеРегламентногоЗадания(РегламентноеЗадание)
	
	Если Ложь
		// Антибаг платформы 8.2.15 http://partners.v8.1c.ru/forum/thread.jsp?id=1005239#1005239
		Или ирКэш.НомерРежимаСовместимостиЛкс() > 803001
		Или Не ирКэш.ЛиФайловаяБазаЛкс()
	Тогда
		ПоследнееЗадание = РегламентноеЗадание.ПоследнееЗадание; // Если здесь выполняется очень долго, то надо перезапустить агент сервера 1С для очистки истории фоновых заданий
	КонецЕсли;
	Возврат ПоследнееЗадание;

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

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

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

Процедура КПФоновыеЗаданияОбновить(Кнопка)
	
	ОбновитьСписокФоновыхЗаданий(Ложь);
	
КонецПроцедуры

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

Функция ФоновоеЗаданиеПоИдентификатору(Знач Строка)
	
	ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Строка.Идентификатор));
	Возврат ФоновоеЗадание;

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

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

Процедура СписокФоновыхЗаданийПередНачаломИзменения(Элемент, Отказ)
	Отказ = Истина;
	ОткрытьТекущееФоновоеЗаданиеСписка();
КонецПроцедуры

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

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

Процедура СписокФоновыхЗаданийПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

Процедура ОтключитьОтборФоновыхЗаданий(Кнопка = Неопределено)
	
	ОтборФоновыхЗаданий = Неопределено;
	ФоновыеЗаданияУстановитьОтбор(Ложь);
	
КонецПроцедуры

Процедура ФоновыеЗаданияУстановитьОтбор(СохранитьОтбор = Истина) Экспорт
	
	ирКлиент.СохранитьНастройкуФормыЛкс(ЭтаФорма);
	Если СохранитьОтбор <> Истина Тогда
		ЭтаФорма.ПериодПоследниеМинуты = 0;
		ЭтаФорма.СостояниеВсе = Истина;
		ЭтаФорма.СостояниеАктивно = Ложь;
		ЭтаФорма.СостояниеЗавершено = Ложь;
		ЭтаФорма.СостояниеЗавершеноСОшибкой = Ложь;
		ЭтаФорма.СостояниеОтменено = Ложь;
		ОтборПоЗаданиюИлиМетоду = Ложь;
		ОтборПоМетоду = Ложь;
		ЭлементыФормы.КПФоновыеЗадания.Кнопки.ОтборПоЗаданиюИлиМетоду.Пометка = ОтборПоЗаданиюИлиМетоду;
		ЭлементыФормы.КПФоновыеЗадания.Кнопки.ОтборПоМетоду.Пометка = ОтборПоМетоду;
	Иначе
		ОбновитьБыстрыйОтборПоСостояниюФоновыхЗаданий();
	КонецЕсли; 
	ОбновитьСписокФоновыхЗаданий();
	
КонецПроцедуры

Процедура ОбновитьБыстрыйОтборПоСостояниюФоновыхЗаданий()
	
	ЭтаФорма.СостояниеАктивно = Ложь;
	ЭтаФорма.СостояниеЗавершено = Ложь;
	ЭтаФорма.СостояниеЗавершеноСОшибкой = Ложь;
	ЭтаФорма.СостояниеОтменено = Ложь;
	Если ОтборФоновыхЗаданий <> Неопределено И ОтборФоновыхЗаданий.Свойство("Состояние") Тогда
		ЭтаФорма.СостояниеАктивно = ОтборФоновыхЗаданий.Состояние.Найти(СостояниеФоновогоЗадания.Активно) <> Неопределено;
		ЭтаФорма.СостояниеЗавершено = ОтборФоновыхЗаданий.Состояние.Найти(СостояниеФоновогоЗадания.Завершено) <> Неопределено;
		ЭтаФорма.СостояниеЗавершеноСОшибкой = ОтборФоновыхЗаданий.Состояние.Найти(СостояниеФоновогоЗадания.ЗавершеноАварийно) <> Неопределено;
		ЭтаФорма.СостояниеОтменено = ОтборФоновыхЗаданий.Состояние.Найти(СостояниеФоновогоЗадания.Отменено) <> Неопределено;
	КонецЕсли;
	ЭтаФорма.СостояниеВсе = Не СостояниеАктивно И Не СостояниеЗавершено И Не СостояниеЗавершеноСОшибкой И Не СостояниеОтменено;

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

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

Процедура УстановитьОтборФоновыхЗаданий(Кнопка)
	
	Диалог = ОбработкаОбъект.ПолучитьФорму("ДиалогОтбораФоновогоЗадания");
	Диалог.Отбор = ОтборФоновыхЗаданий;
	Если Диалог.ОткрытьМодально() = Истина Тогда
		ОтборФоновыхЗаданий = Диалог.Отбор;
		ФоновыеЗаданияУстановитьОтбор();
	КонецЕсли;
	
КонецПроцедуры

Процедура ОформитьСтрокуЗадания(ОформлениеСтроки, ДанныеСтроки)

	Если ДанныеСтроки.СостояниеЗадания = СостояниеФоновогоЗадания.Активно Тогда
		ОформлениеСтроки.ЦветТекста = Новый Цвет(0, 0, 200);
	ИначеЕсли ДанныеСтроки.СостояниеЗадания = СостояниеФоновогоЗадания.Завершено Тогда
	ИначеЕсли ДанныеСтроки.СостояниеЗадания = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда	
		ОформлениеСтроки.ЦветТекста = Новый Цвет(128, 0, 0);
	ИначеЕсли ДанныеСтроки.СостояниеЗадания = СостояниеФоновогоЗадания.Отменено Тогда	
		ОформлениеСтроки.ЦветТекста = Новый Цвет(128, 128, 0);
	КонецЕсли;
	
КонецПроцедуры
 
Процедура СписокФоновыхЗаданийПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
	Если Не ДанныеСтроки.РегламентноеЗаданиеСчитано И ЗначениеЗаполнено(ДанныеСтроки.Идентификатор) Тогда
		Фоновое = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ДанныеСтроки.Идентификатор));
		Если Фоновое <> Неопределено Тогда
			РегламентноеЗадание = Фоновое.РегламентноеЗадание; // Тяжелая операция, если непустое. Поэтому делаем ее тут.
			Если РегламентноеЗадание <> Неопределено Тогда
				ПредставлениеРегламентногоЗадания = РегламентноеЗадание.Метаданные.Представление();
				Если РегламентноеЗадание.Наименование <> "" Тогда
					ПредставлениеРегламентногоЗадания = ПредставлениеРегламентногоЗадания + ":" + РегламентноеЗадание.Наименование;
				КонецЕсли;
				ДанныеСтроки.Регламентное = ПредставлениеРегламентногоЗадания;
			КонецЕсли;
		КонецЕсли; 
		ДанныеСтроки.РегламентноеЗаданиеСчитано = Истина;
	КонецЕсли; 
	ОформитьСтрокуЗадания(ОформлениеСтроки, ДанныеСтроки);
	Если ДанныеСтроки.Регламентное <> "" Тогда
		ОформлениеСтроки.Ячейки[0].Картинка = БиблиотекаКартинок.РегламентноеЗадание;
		ОформлениеСтроки.Ячейки[0].ОтображатьКартинку = Истина;
	КонецЕсли;
	//ирКлиент.ОформитьЯчейкуСРасширеннымЗначениемЛкс(ОформлениеСтроки.Ячейки.РазделениеДанныхПредставление, ДанныеСтроки.РазделениеДанных, Элемент.Колонки.РазделениеДанныхПредставление);
	
КонецПроцедуры

Процедура УстановитьОтборРегламентныхЗаданий(Кнопка)
	
	Диалог = ОбработкаОбъект.ПолучитьФорму("ДиалогОтбораРегламентногоЗадания");
	Диалог.Отбор = ОтборРегламентныхЗаданий;
	Если Диалог.ОткрытьМодально() = Истина Тогда
		ОтборРегламентныхЗаданий = Диалог.Отбор;
		РегламентныеЗаданияУстановитьОтбор(ОтборРегламентныхЗаданий.Количество() > 0);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

Процедура КПФоновыеЗаданияНастройкаОбновления(Кнопка)
	
	Диалог = ОбработкаОбъект.ПолучитьФорму("ДиалогНастройкиОбновленияСписка");
	Диалог.Автообновление = АвтообновлениеСпискаФоновыхЗаданий;
	Диалог.ПериодАвтообновления = ПериодАвтообновленияСпискаФоновыхЗаданий;
	Если Диалог.ОткрытьМодально() = Истина Тогда	
		ЭтаФорма.ПериодАвтообновленияСпискаФоновыхЗаданий = Диалог.ПериодАвтообновления;
		ирКлиент.СохранитьНастройкуФормыЛкс(ЭтаФорма);
		УстановитьАвтообновлениеСпискаФоновыхЗаданий(Диалог.Автообновление);
	КонецЕсли;
	БлокироватьОбновление = Ложь;
	
КонецПроцедуры

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

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

Процедура КПФоновыеЗаданияОтборПоЗаданиюИлиМетоду(Кнопка = Неопределено)
	
	Кнопка = ЭлементыФормы.КПФоновыеЗадания.Кнопки.ОтборПоЗаданиюИлиМетоду;
	ОтборПоЗаданиюИлиМетоду = Не Кнопка.Пометка;
	Кнопка.Пометка = ОтборПоЗаданиюИлиМетоду;
	Если ОтборПоЗаданиюИлиМетоду И ОтборПоМетоду Тогда
		КПФоновыеЗаданияОтборПоМетоду();
	Иначе
		ОбновитьОтборФоновыхЗаданийПоЗаданиюИлиМетоду();
	КонецЕсли; 
	
КонецПроцедуры

Процедура КПФоновыеЗаданияОтборПоМетоду(Кнопка = Неопределено)
	
	Кнопка = ЭлементыФормы.КПФоновыеЗадания.Кнопки.ОтборПоМетоду;
	ОтборПоМетоду = Не Кнопка.Пометка;
	Кнопка.Пометка = ОтборПоМетоду;
	Если ОтборПоЗаданиюИлиМетоду И ОтборПоМетоду Тогда
		КПФоновыеЗаданияОтборПоЗаданиюИлиМетоду(); 
	Иначе
		ОбновитьОтборФоновыхЗаданийПоЗаданиюИлиМетоду();
	КонецЕсли; 
	
КонецПроцедуры

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

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

Процедура СписокРегламентныхЗаданийПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	Если ОтборПоЗаданиюИлиМетоду Или ОтборПоМетоду Тогда
		ОбновитьОтборФоновыхЗаданийПоЗаданиюИлиМетоду();
	КонецЕсли; 
	
КонецПроцедуры

Процедура ВыполнитьРегламентноеЗаданиеВЭтомСеансе(НаСервере = Ложь)
	
	ТекущиеДанные = ЭлементыФормы.СписокРегламентныхЗаданий.ТекущиеДанные;
	Если Ложь
		Или ТекущиеДанные = Неопределено 
		Или ТекущиеДанные.Идентификатор = "" // Для отбора фоновых заданий с пустым регламентным заданием
	Тогда
		Возврат;
	КонецЕсли;  
	РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ТекущиеДанные.Идентификатор));
	Если РегламентноеЗадание = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	РегламентныеЗаданияПоследниеВыбранныеДобавить();
	СтрокаПараметров = "";
	Индекс = 0;
	Пока Индекс < РегламентноеЗадание.Параметры.Количество() Цикл
		СтрокаПараметров = СтрокаПараметров + "_АлгоритмОбъект[" + Индекс + "]";
		Если Индекс < (РегламентноеЗадание.Параметры.Количество()-1) Тогда
			СтрокаПараметров = СтрокаПараметров + ",";
		КонецЕсли;
		Индекс = Индекс + 1;
	КонецЦикла;
	ТекстПрограммы = "" + РегламентноеЗадание.Метаданные.ИмяМетода + "(" + СтрокаПараметров + ");";
	ПараметрыЗадания = ирОбщий.СкопироватьКоллекциюЛкс(РегламентноеЗадание.Параметры);
	ВосстановитьРазрешениеПоВнешнимРесурсамБСП = Ложь;
	Если Истина
		И ТекущиеДанные.РаботаетСВнешнимиРесурсамиБСП 
		И ирСервер.ЛиРаботаСВнешнимиРесурсамиЗаблокированаБСП()
	Тогда
		//ИмяПользователя = РегламентноеЗадание.ИмяПользователя;
		ИмяПользователя = ИмяПользователя();
		СтароеРазрешениеПоВнешнимРесурсам = ХранилищеСистемныхНастроек.Загрузить("РегламентныеЗадания", РегламентноеЗадание.Метаданные.ИмяМетода,, ИмяПользователя) = Истина;
		Если Не СтароеРазрешениеПоВнешнимРесурсам Тогда
			Ответ = Вопрос("Задание обращается к внешним ресурсам, работа с которыми заблокирована. Запустить с обходом блокировки?", РежимДиалогаВопрос.ДаНетОтмена);
			Если Ответ = КодВозвратаДиалога.Отмена Тогда
				Возврат;
			ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда
				ХранилищеСистемныхНастроек.Сохранить("РегламентныеЗадания", РегламентноеЗадание.Метаданные.ИмяМетода, Истина,, ИмяПользователя);
				ВосстановитьРазрешениеПоВнешнимРесурсамБСП = Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	Попытка
		Если НаСервере Тогда
			ирСервер.ВыполнитьАлгоритм(ТекстПрограммы, ПараметрыЗадания);
		Иначе
			ирОбщий.ВыполнитьАлгоритм(ТекстПрограммы, ПараметрыЗадания);
		КонецЕсли;
	Исключение
		Если ВосстановитьРазрешениеПоВнешнимРесурсамБСП Тогда
			ХранилищеСистемныхНастроек.Сохранить("РегламентныеЗадания", РегламентноеЗадание.Метаданные.ИмяМетода, Ложь,, ИмяПользователя);
		КонецЕсли;
		ВызватьИсключение;
	КонецПопытки;
	Если ВосстановитьРазрешениеПоВнешнимРесурсамБСП Тогда
		ХранилищеСистемныхНастроек.Сохранить("РегламентныеЗадания", РегламентноеЗадание.Метаданные.ИмяМетода, Ложь,, ИмяПользователя);
	КонецЕсли;
	ОбновитьСписокРегламентныхЗаданий();

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

Процедура КПРегламентныеЗаданияВыполнитьРегламентноеЗаданиеНаСервере(Кнопка)
	
	ВыполнитьРегламентноеЗаданиеВЭтомСеансе(Истина);
	
КонецПроцедуры

Процедура КПРегламентныеЗаданияВыполнитьРегламентноеЗаданиеНаКлиенте(Кнопка)
	
	ВыполнитьРегламентноеЗаданиеВЭтомСеансе();
	
КонецПроцедуры

Процедура КПРегламентныеЗаданияВыполнитьРегламентноеЗаданиеВФоновомЗадании(Кнопка)
	
	ВыполнитьВыделенныеРегламентныеЗадания(Ложь);
	
КонецПроцедуры

Процедура КПРегламентныеЗаданияВыполнитьВФоновомЗаданииБезРасширений(Кнопка)
	
	ВыполнитьВыделенныеРегламентныеЗадания(Истина);
	
КонецПроцедуры

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

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

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

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

Функция НаименованиеЗадания(Знач ПредставлениеЗадания = "", Знач ТипЗапуска = "Ручной", Знач БезРасширений = Ложь)
	
	НаименованиеЗадания = ТипЗапуска + " запуск " + ?(БезРасширений, "без расширений ", "") + """" + ПредставлениеЗадания + """ пользователем """ + ИмяПользователя() + """";
	Возврат НаименованиеЗадания;

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

Функция КлючФоновыхЗаданийРегламентногоЗадания(Знач РегламентноеЗадание)
	
	#Если Сервер И Не Сервер Тогда
		РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору();
	#КонецЕсли
	КлючЗадания = РегламентноеЗадание.Ключ;
	Если Не ЗначениеЗаполнено(КлючЗадания) Тогда
		КлючЗадания = "КонсольЗаданий." + РегламентноеЗадание.УникальныйИдентификатор;
	КонецЕсли;
	Возврат КлючЗадания;

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

Процедура КПРегламентныеЗаданияРаботатьДиспетчером(Кнопка)
	
	Кнопка.Пометка = Не Кнопка.Пометка;
	Если Кнопка.Пометка Тогда 
		ПодключитьОбработчикОжидания("ЗапуститьРегламентныеЗаданияПоРасписанию", 0.1, Истина);
	Иначе
		ОтключитьОбработчикОжидания("ЗапуститьРегламентныеЗаданияПоРасписанию");
	КонецЕсли;
	
КонецПроцедуры  

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

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

Процедура КПРегламентныеЗаданияВКонсолиКода(Кнопка)
	
	ТекущиеДанные = ЭлементыФормы.СписокРегламентныхЗаданий.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;  
	РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(ТекущиеДанные.Идентификатор));
	СтрокаПараметров = "";
	Индекс = 0;
	СтруктураПараметров = Новый Структура;
	Пока Индекс < РегламентноеЗадание.Параметры.Количество() Цикл
		ИмяПараметра = "П" + (Индекс + 1);
		СтрокаПараметров = СтрокаПараметров + ИмяПараметра;
		Если Индекс < (РегламентноеЗадание.Параметры.Количество()-1) Тогда
			СтрокаПараметров = СтрокаПараметров + ",";
		КонецЕсли;
		СтруктураПараметров.Вставить(ИмяПараметра, РегламентноеЗадание.Параметры[Индекс]);
		Индекс = Индекс + 1;
	КонецЦикла;
	ТекстПрограммы = "" + РегламентноеЗадание.Метаданные.ИмяМетода + "(" + СтрокаПараметров + ");";
	ирОбщий.ОперироватьСтруктуройЛкс(ТекстПрограммы, ,СтруктураПараметров);
	
КонецПроцедуры

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

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

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

Процедура КПФоновыеЗаданияПоказатьСообщенияПользователю(Кнопка)

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

Процедура СписокФоновыхЗаданийВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Если Колонка = ЭлементыФормы.СписокФоновыхЗаданий.Колонки.СообщенияПользователю Тогда
		Идентификатор = ВыбраннаяСтрока.Идентификатор;
		ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Идентификатор));
		СообщенияПользователю = ирОбщий.СообщенияПользователюОтФоновогоЗаданияЛкс(ФоновоеЗадание);
		#Если ТолстыйКлиентУправляемоеПриложение Тогда
			ОчиститьСообщения();
		#КонецЕсли
		Если СообщенияПользователю.Количество() > 0 Тогда
			ирОбщий.СообщитьЛкс("+++Сообщения пользователю от фонового задания " + Идентификатор);
			Для Каждого СообщениеПользователю Из СообщенияПользователю Цикл
				ирОбщий.СообщитьЛкс(СообщениеПользователю.Текст,, Истина);
				СообщениеПользователю.Сообщить();
			КонецЦикла; 
			ирОбщий.СообщитьЛкс("---Сообщения пользователю от фонового задания " + Идентификатор);
		КонецЕсли; 
	ИначеЕсли Колонка = ЭлементыФормы.СписокФоновыхЗаданий.Колонки.ОшибкиЖР Тогда
		ОткрытьОшибкиЖРПоЗаданию(ВыбраннаяСтрока);
	ИначеЕсли Колонка = Элемент.Колонки.Ошибка Тогда
		ТекстЯчейки = ВыбраннаяСтрока[Колонка.Данные];
		Если ЗначениеЗаполнено(ТекстЯчейки) Тогда
			ирКлиент.ОткрытьТекстЛкс(ТекстЯчейки, , "Обычный", Истина, ВыбраннаяСтрока.Ключ);
		КонецЕсли; 
	ИначеЕсли Колонка = Элемент.Колонки.РазделениеДанныхПредставление Тогда
		ирКлиент.ЯчейкаТабличногоПоляРасширенногоЗначения_ВыборЛкс(ЭтаФорма, Элемент, СтандартнаяОбработка, ВыбраннаяСтрока.РазделениеДанных);
	Иначе
		ОткрытьТекущееФоновоеЗаданиеСписка();
	КонецЕсли; 
	
КонецПроцедуры

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

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

Процедура КПРегламентныеЗаданияВключить(Кнопка)
	
	УстановитьИспользованиеВыделенныхРегламентныхЗаданий(Истина);
	
КонецПроцедуры

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

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

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

Функция ИмяСобытияПереключенияЗаданияДляЖурналаРегистрации()
	
	Возврат "ИР. Переключение регламентного задания";

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

Процедура КПРегламентныеЗаданияВыключить(Кнопка)
	
	УстановитьИспользованиеВыделенныхРегламентныхЗаданий(Ложь);

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

Процедура КоманднаяПанельФоновыеЗаданияОтладчикФоновыхЗаданий(Кнопка)
	
	СтрокаСоединения = ирСервер.СтрокаСоединенияСервераЛкс();
	ПараметрыЗапуска = ирОбщий.ПараметрыЗапускаПриложения1СЛкс(,,, Истина,,,,,, СтрокаСоединения);
	ЗапуститьСистему(ПараметрыЗапуска);
	
КонецПроцедуры

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

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

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

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

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

Процедура МетодыПриАктивизацииСтроки(Элемент)
	
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
	Если ОтборПоЗаданиюИлиМетоду Или ОтборПоМетоду Тогда
		ОбновитьОтборФоновыхЗаданийПоЗаданиюИлиМетоду();
	КонецЕсли; 

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

Процедура МетодыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
	
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
	ОформлениеСтроки.Ячейки.ГруппаПоследнееФоновоеЗадание.Видимость = Ложь;
	ОформлениеСтроки.Ячейки.ГруппаДлительность.Видимость = Ложь;
	ОформитьСтрокуЗадания(ОформлениеСтроки, ДанныеСтроки);
	Если ДанныеСтроки.КоличествоАктивных > 0 Тогда
		ОформлениеСтроки.ЦветТекста = Новый Цвет(0, 0, 200);
	КонецЕсли; 
	
КонецПроцедуры

Процедура КоманднаяПанельМетодыОбновить(Кнопка)
	
	ОбновитьСписокМетодовСПараметрами(Ложь);
	
КонецПроцедуры

Процедура КлсКомандаНажатие(Кнопка) Экспорт 
	
	ирКлиент.УниверсальнаяКомандаФормыЛкс(ЭтаФорма, Кнопка);
	
КонецПроцедуры

Процедура ОбработчикОжиданияСПараметрамиЛкс() Экспорт 
	
	ирКлиент.ОбработчикОжиданияСПараметрамиЛкс();

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

Процедура КПРегламентныеЗаданияОткрытьИТС(Кнопка)
	
	ирКлиент.ОткрытьСсылкуИТСЛкс("http://its.1c.ru/db/v?doc#bookmark:dev:TI000000792");
	
КонецПроцедуры

Процедура ПериодПоследниеМинутыПриИзменении(Элемент)
	
	АвтоОбновитьФоновыеЗадания();
	Если ЭлементыФормы.ПанельОсновная.ТекущаяСтраница = ЭлементыФормы.ПанельОсновная.Страницы.Методы Тогда
		ОбновитьСписокМетодов();
	Иначе
		Методы.Очистить();
	КонецЕсли; 
	
КонецПроцедуры

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

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

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

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

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

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

Процедура КоманднаяПанельМетодыВыполнитьМетодВФоновомЗадании(Кнопка)
	ВыполнитьВыделенныеМетодыВФоне(Ложь);

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

Процедура КоманднаяПанельМетодыВыполнитьВФоновомЗаданииБезРасширений(Кнопка)
	ВыполнитьВыделенныеМетодыВФоне(Истина);
КонецПроцедуры

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

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

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

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

Процедура КоманднаяПанельМетодыВыполнитьМетодНаСервере(Кнопка)
	
	ВыполнитьМетодВЭтомСеансе(Истина);

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

Процедура КоманднаяПанельМетодыВыполнитьМетодНаКлиенте(Кнопка)
	
	ВыполнитьМетодВЭтомСеансе();
	
КонецПроцедуры

Процедура КоманднаяПанельФоновыеЗаданияПолучатьОшибкиИзЖурнала(Кнопка = Неопределено)
	
	Кнопка = ЭлементыФормы.КПФоновыеЗадания.Кнопки.ПолучатьОшибкиИзЖурнала;
	ЭтаФорма.ПолучатьОшибкиИзЖурнала = Не Кнопка.Пометка;
	Кнопка.Пометка = ПолучатьОшибкиИзЖурнала;
	ирКлиент.СохранитьНастройкуФормыЛкс(ЭтаФорма);
	Если ПолучатьОшибкиИзЖурнала Тогда
		ОбновитьСписокФоновыхЗаданий();
	КонецЕсли; 
	
КонецПроцедуры

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

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

Процедура СортировкаРегламентныхЗаданийОчистка(Элемент, СтандартнаяОбработка)
	
	УстановитьСортировкуРегламентныхЗаданийПоУмолчанию();
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

Процедура СортировкаРегламентныхЗаданийПриИзменении(Элемент = Неопределено)
	
	ирКлиент.СохранитьНастройкуФормыЛкс(ЭтаФорма);
	ОбновитьСписокРегламентныхЗаданий();
	
КонецПроцедуры

Процедура СортировкаМетодовПриИзменении(Элемент = Неопределено)
	
	ирКлиент.СохранитьНастройкуФормыЛкс(ЭтаФорма);
	ОбновитьСписокМетодов();
	
КонецПроцедуры

Процедура СортировкаМетодовОчистка(Элемент, СтандартнаяОбработка)

	УстановитьСортировкуМетодовПоУмолчанию();
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

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

Процедура ОбновитьОтборФоновыхЗаданийПоСостоянию()
	
	Массив = Новый Массив;
	Если СостояниеАктивно Тогда
		Массив.Добавить(СостояниеФоновогоЗадания.Активно);
	КонецЕсли;
	Если СостояниеЗавершено Тогда
		Массив.Добавить(СостояниеФоновогоЗадания.Завершено);
	КонецЕсли;
	Если СостояниеЗавершеноСОшибкой Тогда
		Массив.Добавить(СостояниеФоновогоЗадания.ЗавершеноАварийно);
	КонецЕсли;
	Если СостояниеОтменено Тогда
		Массив.Добавить(СостояниеФоновогоЗадания.Отменено);
	КонецЕсли;
	Если Массив.Количество() > 0 ТОгда
		ОтборФоновыхЗаданий.Вставить("Состояние", Массив);
	ИначеЕсли ОтборФоновыхЗаданий <> Неопределено И ОтборФоновыхЗаданий.Свойство("Состояние") Тогда 
		ОтборФоновыхЗаданий.Удалить("Состояние");
	КонецЕсли;
	ФоновыеЗаданияУстановитьОтбор();

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

Процедура СостояниеАктивноПриИзменении(Элемент = Неопределено)
	
	ЭтаФорма.СостояниеВсе = Не СостояниеАктивно И Не СостояниеЗавершено И Не СостояниеЗавершеноСОшибкой И Не СостояниеОтменено;
	ОбновитьОтборФоновыхЗаданийПоСостоянию();
	
КонецПроцедуры

Процедура КПРегламентныеЗаданияПерейтиКОпределениюМетода(Кнопка)
	
	Если ЭлементыФормы.СписокРегламентныхЗаданий.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ирКлиент.ОткрытьМетодМодуляПоИмениЛкс(ЭлементыФормы.СписокРегламентныхЗаданий.ТекущаяСтрока.ИмяМетода);
	
КонецПроцедуры

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

Процедура КоманднаяПанельФоновыеЗаданияПерейтиКОпределениюМетода(Кнопка)
	
	Если ЭлементыФормы.СписокФоновыхЗаданий.ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ирКлиент.ОткрытьМетодМодуляПоИмениЛкс(ЭлементыФормы.СписокФоновыхЗаданий.ТекущаяСтрока.ИмяМетода);
	
КонецПроцедуры

Процедура РегламентныеПодстрокаПриИзменении(Элемент)
	
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	ирКлиент.СохранитьНастройкуФормыЛкс(ЭтаФорма);
	ОбновитьСписокРегламентныхЗаданий();
	
КонецПроцедуры

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

Процедура МетодыПодстрокаПриИзменении(Элемент)
	
	ирКлиент.ПолеВводаСИсториейВыбора_ПриИзмененииЛкс(Элемент, ЭтаФорма);
	ирКлиент.СохранитьНастройкуФормыЛкс(ЭтаФорма);
	ОбновитьСписокМетодов();

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

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

Процедура КПРегламентныеЗаданияСохранитьСписокВключенных(Кнопка = Неопределено)
	
	ВключенныеЗадания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(Новый Структура("Использование", Истина));
	СписокВключенных = Новый Массив;
	Для Каждого ВключенноеЗадание Из ВключенныеЗадания Цикл
		#Если Сервер И Не Сервер Тогда
			ВключенноеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание();
		#КонецЕсли
		СписокВключенных.Добавить(ВключенноеЗадание.УникальныйИдентификатор);
	КонецЦикла;
	ирКлиент.СохранитьЗначениеВФайлИнтерактивноЛкс(СписокВключенных, "urt", "Список включенных регламентных заданий", Ложь);
	
КонецПроцедуры

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

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

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

Процедура УстановитьСортировкуРегламентныхЗаданийПоУмолчанию()
	
	ЭтаФорма.СортировкаРегламентныхЗаданий = "МетаданныеИмя Возр";

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

Процедура УстановитьСортировкуМетодовПоУмолчанию()
	
	ЭтаФорма.СортировкаМетодов = "ИмяМетода Возр";

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

Процедура КПРегламентныеЗаданияСортироватьПоВозрастанию(Кнопка)
	
	Если ЭлементыФормы.СписокРегламентныхЗаданий.ТекущаяКолонка = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ЭтаФорма.СортировкаРегламентныхЗаданий = ЭлементыФормы.СписокРегламентныхЗаданий.ТекущаяКолонка.Данные + " Возр";
	СортировкаРегламентныхЗаданийПриИзменении();
	
КонецПроцедуры

Процедура КПРегламентныеЗаданияСортироватьПоУбыванию(Кнопка)
	
	Если ЭлементыФормы.СписокРегламентныхЗаданий.ТекущаяКолонка = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ЭтаФорма.СортировкаРегламентныхЗаданий = ЭлементыФормы.СписокРегламентныхЗаданий.ТекущаяКолонка.Данные + " Убыв";
	СортировкаРегламентныхЗаданийПриИзменении();
	
КонецПроцедуры

Процедура КоманднаяПанельМетодыСортироватьПоВозрастанию(Кнопка)
	
	Если ЭлементыФормы.Методы.ТекущаяКолонка = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ЭтаФорма.СортировкаМетодов = ЭлементыФормы.Методы.ТекущаяКолонка.Данные + " Возр";
	СортировкаМетодовПриИзменении();
	
КонецПроцедуры

Процедура КоманднаяПанельМетодыСортироватьПоУбыванию(Кнопка)
	
	Если ЭлементыФормы.Методы.ТекущаяКолонка = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	ЭтаФорма.СортировкаМетодов = ЭлементыФормы.Методы.ТекущаяКолонка.Данные + " Убыв";
	СортировкаМетодовПриИзменении();
	
КонецПроцедуры

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

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

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

Процедура КПРегламентныеЗаданияТаблицаЗапусков(Кнопка)
	
	ФормаОтчета = ПолучитьФорму("ИнтервалыРаботыФоновыхЗаданий", ЭтаФорма);
	ФормаОтчета.ДатаНачала = ТекущаяДата() - ПериодПоследниеМинуты*60;
	ФормаОтчета.ДатаКонца = ТекущаяДата();
	#Если Сервер И Не Сервер Тогда
		РасшифровкаРегламентногоЗадания();
	#КонецЕсли
	ФормаОтчета.ОбработчикРасшифровкиТочки = "РасшифровкаРегламентногоЗадания";
	ФормаОтчета.Открыть();
	ФормаОтчета.ДействияФормыСформировать();

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

Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок) Экспорт 
	
	ирКлиент.ТабличноеПолеПриПолученииДанныхЛкс(ЭтаФорма, Элемент, ОформленияСтрок);

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

Процедура КПРегламентныеЗаданияПоОбъекту(Кнопка)
	ТекущаяСтрока = ЭлементыФормы.СписокРегламентныхЗаданий.ТекущаяСтрока;
	Если ТекущаяСтрока = Неопределено Тогда
		Возврат;
	КонецЕсли; 
	СтруктураОтбора = Новый Структура;
	СтруктураОтбора.Вставить("Метаданные", Метаданные.РегламентныеЗадания.Найти(ТекущаяСтрока.МетаданныеИмя).ПолноеИмя());
	СтруктураОтбора.Вставить("Данные", ТекущаяСтрока.Наименование);
	АнализЖурналаРегистрации = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирАнализЖурналаРегистрации");
	#Если Сервер И Не Сервер Тогда
		АнализЖурналаРегистрации = Обработки.ирАнализЖурналаРегистрации.Создать();
	#КонецЕсли
	АнализЖурналаРегистрации.ОткрытьСОтбором(,, СтруктураОтбора);
КонецПроцедуры

ирКлиент.ИнициироватьФормуЛкс(ЭтаФорма, "Обработка.ирКонсольЗаданий.Форма.ФормаКонсоли");

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

СписокВыбора = ЭлементыФормы.ПериодПоследниеМинуты.СписокВыбора;
СписокВыбора.Добавить(30, "30 минут");
СписокВыбора.Добавить(120, "2 часа");
СписокВыбора.Добавить(360, "6 часов");
СписокВыбора.Добавить(720, "12 часов");
СписокВыбора.Добавить(1440, "1 сутки");
СписокВыбора.Добавить(0, "все");
ЭтаФорма.ПериодПоследниеМинуты = 60;
УстановитьСортировкуРегламентныхЗаданийПоУмолчанию();
УстановитьСортировкуМетодовПоУмолчанию();

