////////////////////////////////////////////////////////////////////////////////
// Переменные
//

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

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

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

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

// Обновить список регламентных заданий
//
Процедура ОбновитьСписокРегламентныхЗаданий()
	
	Если БлокироватьОбновление Тогда
		Возврат;
	КонецЕсли;
	ОбновитьСписокРегламентныхЗаданийСПараметрами();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КПФоновыеЗаданияОбновить(Кнопка)
	
	АвтоОбновитьФоновыеЗадания();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

	Если ДанныеСтроки.СостояниеЗадания = СостояниеФоновогоЗадания.Активно Тогда
		ОформлениеСтроки.ЦветТекста = Новый Цвет(0, 0, 200);
	ИначеЕсли ДанныеСтроки.СостояниеЗадания = СостояниеФоновогоЗадания.Завершено Тогда
	ИначеЕсли ДанныеСтроки.СостояниеЗадания = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда	
		ОформлениеСтроки.ЦветТекста = Новый Цвет(128, 0, 0);
	ИначеЕсли ДанныеСтроки.СостояниеЗадания = СостояниеФоновогоЗадания.Отменено Тогда	
		ОформлениеСтроки.ЦветТекста = Новый Цвет(128, 128, 0);
	КонецЕсли;
	
КонецПроцедуры // ОформитьСтрокуЗадания()
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура КоманднаяПанельРегламентныеЗаданияРаботатьДиспетчером(Кнопка)
	
	Пока Истина Цикл
		Состояние("Работаю диспетчером заданий... CTRL+Break для прерывания");
		ВыполнитьОбработкуЗаданий();
		ОбработкаПрерыванияПользователя();
	КонецЦикла; 
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура СтруктураКоманднойПанелиНажатие(Кнопка)
	
	ирОбщий.ОткрытьСтруктуруКоманднойПанелиЛкс(ЭтаФорма, Кнопка);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

Процедура МетодыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	
	ОформлениеСтроки.Ячейки.ГруппаПоследнееФоновоеЗадание.Видимость = Ложь;
	ОформитьСтрокуЗадания(ОформлениеСтроки, ДанныеСтроки);
	
КонецПроцедуры

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

Процедура КП_СписокОПодсистеме(Кнопка)
	
	ирОбщий.ОткрытьСправкуПоПодсистемеЛкс(ЭтотОбъект);

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

Процедура КоманднаяПанельМетодыМенеджерТабличногоПоля(Кнопка)
	
	ирОбщий.ОткрытьМенеджерТабличногоПоляЛкс(ЭлементыФормы.Методы, ЭтаФорма);

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

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

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

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

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

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

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

Процедура ПриЗакрытии()
	
	ирОбщий.Форма_ПриЗакрытииЛкс(ЭтаФорма);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

