Перем ОбработчикРасшифровкиТочки Экспорт;

Функция СохраняемаяНастройкаФормы(выхНаименование, выхИменаСвойств) Экспорт 
	выхИменаСвойств = "Форма.ДатаНачала, Форма.ДатаКонца";
КонецФункции

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

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

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

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

Процедура КнопкаВыбораПериодаНажатие(Элемент)
	
	НастройкаПериода = Новый НастройкаПериода;
	НастройкаПериода.УстановитьПериод(ДатаНачала, ?(ДатаКонца='0001-01-01', ДатаКонца, КонецДня(ДатаКонца)));
	НастройкаПериода.РедактироватьКакИнтервал = Истина;
	НастройкаПериода.РедактироватьКакПериод = Истина;
	НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
	Если НастройкаПериода.Редактировать() Тогда
		ДатаНачала = НастройкаПериода.ПолучитьДатуНачала();
		ДатаКонца = НастройкаПериода.ПолучитьДатуОкончания();
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ДействияФормыСформировать(Кнопка = Неопределено) Экспорт 
	
	Если Не ЗначениеЗаполнено(ДатаНачала) Тогда
		ирОбщий.СообщитьЛкс("Необходимо заполнить начальную дату");
		Возврат;
	КонецЕсли; 
	ПараметрыЗаполнения = Новый Структура;
	ПараметрыЗаполнения.Вставить("ДатаНачала", ДатаНачала);
	ПараметрыЗаполнения.Вставить("ДатаОкончания", ДатаКонца);
	ПараметрыЗаполнения.Вставить("РазмерОдновременноСессий", 1);
	ПараметрыЗаполнения.Вставить("МинимальнаяДлительностьСеансовЗаданий", 1);
	ПараметрыЗаполнения.Вставить("ОтображатьФоновыеЗадания", Истина);
	ПараметрыЗаполнения.Вставить("ВыводитьЗаголовок", Ложь);
	ПараметрыЗаполнения.Вставить("ВыводитьОтбор", Истина);
	ПараметрыЗаполнения.Вставить("ЗаголовокОтчета", "");
	ПараметрыЗаполнения.Вставить("СкрытьРегламентныеЗадания", Новый СписокЗначений);
	ПараметрыЗаполнения.Вставить("СмещениеВремениСервера", 0);
	РезультатОтчета = СформироватьОтчетПоИнтерваламРаботыЗаданий(ПараметрыЗаполнения);
	ЭлементыФормы.ПолеТабличногоДокумента.Очистить();
	ЭлементыФормы.ПолеТабличногоДокумента.Вывести(РезультатОтчета);
	Возврат;
	
	// Простой вариант выгрузки
	Запрос = Новый Запрос;
	Запрос.Текст = "//{Запрос: 0, -2 ////////////////////////////////////////
	|ВЫБРАТЬ
	|	Т.Дата КАК Дата,
	|	Т.ИмяПользователя КАК ИмяПользователя,
	|	Т.ИмяПриложения КАК ИмяПриложения,
	|	Т.Компьютер КАК Компьютер,
	|	Т.Метаданные КАК Метаданные,
	|	Т.Пользователь КАК Пользователь,
	|	Т.Сеанс КАК Сеанс,
	|	Т.Событие КАК Событие,
	|	Т.Соединение КАК СоединениеП
	|ПОМЕСТИТЬ Таблица
	|ИЗ
	|	&Таблица КАК Т
	|;
	|//{Запрос: 1, -1 ////////////////////////////////////////
	|ВЫБРАТЬ
	|	СобытияНачала.Сеанс КАК Сеанс,
	|	СобытияНачала.Дата КАК ДатаНачала,
	|	СобытияКонца.Дата КАК ДатаКонца,
	|	РАЗНОСТЬДАТ(СобытияНачала.Дата, СобытияКонца.Дата, СЕКУНДА) КАК Длительность,
	|	СобытияНачала.Метаданные КАК Метаданные,
	|	СобытияНачала.ИмяПользователя КАК ИмяПользователя
	|ИЗ
	|	Таблица КАК СобытияНачала
	|	ЛЕВОЕ СОЕДИНЕНИЕ Таблица КАК СобытияКонца
	|	ПО ИСТИНА
	|		И СобытияКонца.Событие = &СобытиеКонец
	|		И СобытияКонца.СоединениеП = СобытияНачала.СоединениеП
	|		И СобытияКонца.Сеанс = СобытияНачала.Сеанс
	|ГДЕ СобытияНачала.Событие = &СобытиеНачало
	|";
	Параметры = Запрос.Параметры;
	Запрос.Параметры.Вставить("СобытиеКонец",  "_$Job$_.Finish");
	Запрос.Параметры.Вставить("СобытиеНачало", "_$Job$_.Start");
	СтруктураОтбора = Новый Структура;
	СтруктураОтбора.Вставить("ИмяПриложения", "BackgroundJob");
	АнализЖурналаРегистрации = ирОбщий.СоздатьОбъектПоИмениМетаданныхЛкс("Обработка.ирАнализЖурналаРегистрации");
	#Если Сервер И Не Сервер Тогда
		АнализЖурналаРегистрации = Обработки.ирАнализЖурналаРегистрации.Создать();
	#КонецЕсли
	ТаблицаЗапусков = АнализЖурналаРегистрации.ПолучитьДанные(ДатаНачала, ДатаКонца, СтруктураОтбора, 100000);
	#Если Сервер И Не Сервер Тогда
		ТаблицаЗапусков = АнализЖурналаРегистрации.ТаблицаЖурнала;
	#КонецЕсли
	Запрос.УстановитьПараметр("Таблица", ТаблицаЗапусков.Выгрузить());
	ТаблицаИнтервалов = Запрос.Выполнить().Выгрузить();
	ирКлиент.ОткрытьТаблицуВКонсолиКомпоновкиЛкс(ТаблицаИнтервалов);
	
КонецПроцедуры

// Функция формирует отчет по работе регламентных заданий.
//
// Параметры:
//   ПараметрыЗаполнения - структура - набор параметров, необходимых для построения отчета:
// 	ДатаНачала    - дата - начало периода, по которому будет собираться информация.
// 	ДатаОкончания - дата - окончание периода, по которому будет собираться информация.
// 	РазмерОдновременноСессий	- число - минимальное количество одновременно работавших регламентных
// 		заданий для отображения в таблице.
// 	МинимальнаяДлительностьСеансовЗаданий - число - минимальная продолжительность
// 		сеансов регламентных заданий в секундах.
// 	ОтображатьФоновыеЗадания - булево - если истина, на диаграмме ганта будет выводиться строка с 
// 		интервалами сеансов фоновых заданий.
// 	ВыводитьЗаголовок - ТипВыводаТекстаКомпоновкиДанных - предназначен для отключения/включения заголовка.
// 	ВыводитьОтбор - ТипВыводаТекстаКомпоновкиДанных - предназначен для отключения/включения отображения отбора.
// 	СкрытьРегламентныеЗадания - СписокЗначений - список регламентных заданий, которые необходимо исключить из отчета.
//
Функция СформироватьОтчетПоИнтерваламРаботыЗаданий(ПараметрыЗаполнения) Экспорт
	
	// Параметры отчета
	ДатаНачала = ПараметрыЗаполнения.ДатаНачала;
	ДатаОкончания = ПараметрыЗаполнения.ДатаОкончания;
	МинимальнаяДлительностьСеансовЗаданий = ПараметрыЗаполнения.МинимальнаяДлительностьСеансовЗаданий;
	ВыводитьЗаголовок = ПараметрыЗаполнения.ВыводитьЗаголовок;
	ВыводитьОтбор = ПараметрыЗаполнения.ВыводитьОтбор;
	
	Результат = Новый Структура;
	Отчет = Новый ТабличныйДокумент; 
	Если Не ЗначениеЗаполнено(ДатаОкончания) Тогда
		ДатаОкончания = ТекущаяДата();
	КонецЕсли;
	
	// Получаем данные для построения отчета.
	ПолучитьДанные = ДанныеДляОтчетаПоИнтерваламРаботыЗаданий(ПараметрыЗаполнения);
	ТаблицаСеансыРегламентныхЗаданий = ПолучитьДанные.ТаблицаСеансыРегламентныхЗаданий;
	ОдновременноСессий = ПолучитьДанные.ИтогоОдновременноРегламентныхЗаданий;
	КоличествоЗапусков = ПолучитьДанные.КоличествоЗапусков;
	ОтчетПустой        = ПолучитьДанные.ОтчетПустой;
	Макет = ПолучитьМакет("ИнтервалыРаботыФоновыхЗаданий");
	
	// Набор цветов для фона диаграммы и таблицы.
	ЦветаФона = Новый Массив;
	ЦветаФона.Добавить(WebЦвета.Белый);
	ЦветаФона.Добавить(WebЦвета.СветлоЖелтый);
	ЦветаФона.Добавить(WebЦвета.Лимонный);
	ЦветаФона.Добавить(WebЦвета.НавахоБелый);
	
	// Формируем шапку отчета
	Если ВыводитьЗаголовок Тогда
		Отчет.Вывести(Макет.ПолучитьОбласть("ШапкаОтчета"));
	КонецЕсли;
	
	Если ВыводитьОтбор Тогда
		Область = Макет.ПолучитьОбласть("Отбор");
		Если МинимальнаяДлительностьСеансовЗаданий > 0 Тогда
			РежимОтображенияИнтервалов = НСтр("ru = 'Отключено отображение интервалов с нулевой продолжительностью'");
		Иначе
			РежимОтображенияИнтервалов = НСтр("ru = 'Включено отображение интервалов с нулевой продолжительностью'");
		КонецЕсли;
		Область.Параметры.ДатаНачала = ДатаНачала;
		Область.Параметры.ДатаОкончания = ДатаОкончания;
		Область.Параметры.РежимОтображенияИнтервалов = РежимОтображенияИнтервалов;
		Отчет.Вывести(Область);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ОдновременноСессий) Тогда
	
		Отчет.Вывести(Макет.ПолучитьОбласть("ШапкаТаблицы"));
		
		// Формируем таблицу максимального количества одновременно запущенных РЗ.
		ТекущееКоличествоСессий = 0; 
		ИндексЦвета = 3;
		Для Каждого СтрокаОдновременноСессий Из ОдновременноСессий Цикл
			Область = Макет.ПолучитьОбласть("Таблица");
			Если ТекущееКоличествоСессий <> 0 
				И ТекущееКоличествоСессий <> СтрокаОдновременноСессий.ОдновременноРегламентныхЗаданий
				И ИндексЦвета <> 0 Тогда
				ИндексЦвета = ИндексЦвета - 1;
			КонецЕсли;
			Если СтрокаОдновременноСессий.ОдновременноРегламентныхЗаданий = 1 Тогда
				ИндексЦвета = 0;
			КонецЕсли;
			Область.Параметры.Заполнить(СтрокаОдновременноСессий);
			ЦветФонаТаблицы = ЦветаФона.Получить(ИндексЦвета);
			Область.Области.Таблица.ЦветФона = ЦветФонаТаблицы;
			Отчет.Вывести(Область);
			ТекущееКоличествоСессий = СтрокаОдновременноСессий.ОдновременноРегламентныхЗаданий;
			МассивРегламентныхЗаданий = СтрокаОдновременноСессий.СписокРегламентныхЗаданий;
			ИндексРегламентногоЗадания = 0;
			Отчет.НачатьГруппуСтрок(, Ложь);
			Для Каждого Элемент Из МассивРегламентныхЗаданий Цикл
				Если Не ТипЗнч(Элемент) = Тип("Число") И Не ТипЗнч(Элемент) = Тип("Дата") Тогда
					Область = Макет.ПолучитьОбласть("СписокРегламентныхЗаданий");
					Область.Параметры.СписокРегламентныхЗаданий = ирОбщий.СтрШаблонЛкс(НСтр("ru = '%1 (сеанс %2)'"),
						Элемент,
						МассивРегламентныхЗаданий[ИндексРегламентногоЗадания+1]);
				ИначеЕсли Не ТипЗнч(Элемент) = Тип("Дата") И Не ТипЗнч(Элемент) = Тип("Строка") Тогда
					Область.Параметры.РасшифровкаЗадания = Новый Структура;
					Область.Параметры.РасшифровкаЗадания.Вставить("ТипРасшифровки", "РасшифровкаРегламентногоЗадания");
					Область.Параметры.РасшифровкаЗадания.Вставить("Сеанс", Элемент);
					НаименованиеЗадания = МассивРегламентныхЗаданий.Получить(ИндексРегламентногоЗадания-1);
					Область.Параметры.РасшифровкаЗадания.Вставить("НаименованиеЗадания", НаименованиеЗадания);
					Область.Параметры.РасшифровкаЗадания.Вставить("ДатаНачала", ДатаНачала);
					Область.Параметры.РасшифровкаЗадания.Вставить("ДатаОкончания", ДатаОкончания);
					Отчет.Вывести(Область);
				КонецЕсли;
				ИндексРегламентногоЗадания = ИндексРегламентногоЗадания + 1;
			КонецЦикла;
			Отчет.ЗакончитьГруппуСтрок();
		КонецЦикла;
	КонецЕсли;
	
	Отчет.Вывести(Макет.ПолучитьОбласть("ПустаяСтрока"));
	
	// Получаем ДиаграммуГанта и задаем параметры, необходимые для ее заполнения.
	Область = Макет.ПолучитьОбласть("Диаграмма");
	ДиаграммаГанта = Область.Рисунки.ДиаграммаГанта.Объект;
	ДиаграммаГанта.Обновление = Ложь;  
	
	Серия = ДиаграммаГанта.Серии.Добавить();

	ТекущееСобытие			 = Неопределено;
	ОбщаяПродолжительностьРЗ = 0;
	Точка					 = Неопределено;
	СтрокаКоличествоЗапусков = Неопределено;
	ЗапусковРегламентногоЗадания = 0;
	ПризнакСменыТочки        = Ложь;
	
	// Заполняем диаграмму ганта	
	Для Каждого СтрокаРегламентныеЗадания Из ТаблицаСеансыРегламентныхЗаданий Цикл
		ДлительностьИнтервалаРегламентногоЗадания = СтрокаРегламентныеЗадания.ДатаОкончанияЗадания - СтрокаРегламентныеЗадания.ДатаЗапускаЗадания;
		Если ДлительностьИнтервалаРегламентногоЗадания >= МинимальнаяДлительностьСеансовЗаданий Тогда
			Если ТекущееСобытие <> СтрокаРегламентныеЗадания.НазваниеСобытия Тогда
				Если ТекущееСобытие <> Неопределено И ПризнакСменыТочки Тогда
					Точка.Расшифровка.Вставить("КоличествоСеансов", ЗапусковРегламентногоЗадания);
					Точка.Расшифровка.Вставить("ОбщаяДлительность", ОбщаяПродолжительностьРЗ);
					Точка.Расшифровка.Вставить("ДатаНачала", ДатаНачала);
					Точка.Расшифровка.Вставить("ДатаОкончания", ДатаОкончания);
					ТочкаНазвание = ирОбщий.СтрШаблонЛкс(НСтр("ru = '%1 (%2 из %3)'"),
						Точка.Значение,
						ЗапусковРегламентногоЗадания,
						Строка(СтрокаКоличествоЗапусков.Запусков));
					Точка.Значение = ТочкаНазвание;
				КонецЕсли;
				СтрокаКоличествоЗапусков = КоличествоЗапусков.Найти(СтрокаРегламентныеЗадания.НазваниеСобытия, "НазваниеСобытия");
				Если Ложь
					Или СтрокаРегламентныеЗадания.СобытиеМетаданные <> ""  
					Или СтрокаРегламентныеЗадания.НазваниеСобытия <> ""  
				Тогда 
					ТочкаНазвание = СтрокаРегламентныеЗадания.НазваниеСобытия;
					Если ЗначениеЗаполнено(СтрокаРегламентныеЗадания.СобытиеМетаданные) Тогда
						КартинкаТочки = БиблиотекаКартинок.РегламентноеЗадание;
					Иначе
						КартинкаТочки = Новый Картинка; 
					КонецЕсли; 
					Точка = ДиаграммаГанта.УстановитьТочку(ТочкаНазвание);
					Точка.Расшифровка = Новый Структура;
					ИнтервалНачало = Новый Массив;
					ИнтервалКонец = Новый Массив;
					СеансРегламентногоЗадания = Новый Массив;
					Точка.Расшифровка.Вставить("ТипРасшифровки", "РасшифровкаТочки");
					Точка.Расшифровка.Вставить("ПолноеИмяМетаданных", СтрокаРегламентныеЗадания.СобытиеМетаданные);
					Точка.Расшифровка.Вставить("Событие", СтрокаРегламентныеЗадания.НазваниеСобытия);
					Точка.Расшифровка.Вставить("КоличествоОтменено", СтрокаКоличествоЗапусков.Отменено);
					Точка.Расшифровка.Вставить("КоличествоОшибка", СтрокаКоличествоЗапусков.ОшибкаВыполнения);                                                             
					Точка.Расшифровка.Вставить("ИнтервалыНачало", ИнтервалНачало);
					Точка.Расшифровка.Вставить("ИнтервалыОкончание", ИнтервалКонец);
					Точка.Расшифровка.Вставить("Сеансы", СеансРегламентногоЗадания);
					Точка.Расшифровка.Вставить("МинимальнаяДлительность", МинимальнаяДлительностьСеансовЗаданий);
					Точка.Расшифровка.Вставить("Наименование", СтрокаРегламентныеЗадания.Наименование);
					ТекущееСобытие = СтрокаРегламентныеЗадания.НазваниеСобытия;
					ОбщаяПродолжительностьРЗ = 0;
					ЗапусковРегламентногоЗадания = 0;
					Точка.Картинка = КартинкаТочки;
				ИначеЕсли Не ЗначениеЗаполнено(СтрокаРегламентныеЗадания.ИмяПользователя) Тогда
					ТочкаНазвание = НСтр("ru = 'Безымянные системные фоновые задания'");
					Точка = ДиаграммаГанта.УстановитьТочку(ТочкаНазвание);
					ОбщаяПродолжительностьРЗ = 0;
				Иначе
					ТочкаНазвание = НСтр("ru = 'Безымянные пользовательские фоновые задания'");
					Точка = ДиаграммаГанта.УстановитьТочку(ТочкаНазвание);
					ОбщаяПродолжительностьРЗ = 0;
				КонецЕсли;
			КонецЕсли;
			Значение = ДиаграммаГанта.ПолучитьЗначение(Точка, Серия);
			Интервал = Значение.Добавить();
			Интервал.Начало = СтрокаРегламентныеЗадания.ДатаЗапускаЗадания;
			Интервал.Конец = СтрокаРегламентныеЗадания.ДатаОкончанияЗадания;
			Интервал.Текст = ирОбщий.СтрШаблонЛкс(НСтр("ru = '%1 - %2'"),
				Формат(Интервал.Начало, "ДЛФ=T"),
				Формат(Интервал.Конец, "ДЛФ=T"));
			ПризнакСменыТочки = Ложь;
			// Не заполняем расшифровку для фоновых заданий.
			Если СтрокаРегламентныеЗадания.СобытиеМетаданные <> "" Тогда
				ИнтервалНачало.Добавить(СтрокаРегламентныеЗадания.ДатаЗапускаЗадания);
				ИнтервалКонец.Добавить(СтрокаРегламентныеЗадания.ДатаОкончанияЗадания);
				СеансРегламентногоЗадания.Добавить(СтрокаРегламентныеЗадания.Сеанс);
				ОбщаяПродолжительностьРЗ = ДлительностьИнтервалаРегламентногоЗадания + ОбщаяПродолжительностьРЗ;
				ЗапусковРегламентногоЗадания = ЗапусковРегламентногоЗадания + 1;
				ПризнакСменыТочки = Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла; 
	
	Если ЗапусковРегламентногоЗадания <> 0 И ЗначениеЗаполнено(Точка.Расшифровка) Тогда
		// Присваиваем расшифровку последней точке.
		Точка.Расшифровка.Вставить("КоличествоСеансов", ЗапусковРегламентногоЗадания);
		Точка.Расшифровка.Вставить("ОбщаяДлительность", ОбщаяПродолжительностьРЗ);
		Точка.Расшифровка.Вставить("ДатаНачала", ДатаНачала);
		Точка.Расшифровка.Вставить("ДатаОкончания", ДатаОкончания);
		ТочкаНазвание = ирОбщий.СтрШаблонЛкс(НСтр("ru = '%1 (%2 из %3)'"),
			Точка.Значение,
			ЗапусковРегламентногоЗадания,
			Строка(СтрокаКоличествоЗапусков.Запусков));
		Точка.Значение = ТочкаНазвание;
	КонецЕсли;
		
	// Устанавливаем настройки отображения диаграммы.
	ЦветаДиаграммыГанта(ДатаНачала, ДиаграммаГанта, ОдновременноСессий, ЦветаФона);
	ПериодАнализа = ДатаОкончания - ДатаНачала;
	ШкалаВремениДиаграммыГанта(ДиаграммаГанта, ПериодАнализа);
	
	КоличествоКолонок = ДиаграммаГанта.Точки.Количество();
	Область.Рисунки.ДиаграммаГанта.Высота = 15 + 10 * КоличествоКолонок;
	Область.Рисунки.ДиаграммаГанта.Ширина = 450;
	ДиаграммаГанта.АвтоОпределениеПолногоИнтервала	 = Ложь; 
	ДиаграммаГанта.ОтображениеИнтервала = ОтображениеИнтервалаДиаграммыГанта.Плоский;
	Если ирКэш.НомерВерсииПлатформыЛкс() >= 803012 Тогда
		ДиаграммаГанта.ОбластьЛегенды.Расположение = ПредопределенноеЗначение("РасположениеЛегендыДиаграммы.Нет"); // Через ПредопределенноеЗначение() вычисляем для компиляции на старых плафтформах
	КонецЕсли; 
	ДиаграммаГанта.РастягиваниеПоВертикали = РастягиваниеПоВертикалиДиаграммыГанта.РастягиватьСтрокиИДанные;
	ДиаграммаГанта.УстановитьПолныйИнтервал(ДатаНачала, ДатаОкончания);
	ДиаграммаГанта.Обновление = Истина;

	Отчет.Вывести(Область);
	Возврат Отчет;
КонецФункции

// Функция получает информацию по регламентным задания из журнала регистрации.
//
// Параметры:
//   ПараметрыЗаполнения - структура - набор параметров, необходимых для построения отчета:
// 	ДатаНачала    - дата - начало периода, по которому будет собираться информация.
// 	ДатаОкончания - дата - окончание периода, по которому будет собираться информация.
// 	РазмерОдновременноСессий	- число - минимальное количество одновременно работавших регламентных
// 		заданий для отображения в таблице.
// 	МинимальнаяДлительностьСеансовЗаданий - число - минимальная продолжительность
// 		сеансов регламентных заданий в секундах.
// 	ОтображатьФоновыеЗадания - булево - если истина, на диаграмме ганта будет выводиться строка с 
// 		интервалами сеансов фоновых заданий.
// 	СкрытьРегламентныеЗадания - СписокЗначений - список регламентных заданий, которые необходимо исключить из отчета.
//
// Возвращаемое значение
//   таблица значений - таблица, содержащая информацию по работе регламентных заданий
//   из журнала регистрации.
//
Функция ДанныеДляОтчетаПоИнтерваламРаботыЗаданий(ПараметрыЗаполнения)
	
	ДатаНачала = ПараметрыЗаполнения.ДатаНачала;
	ДатаОкончания = ПараметрыЗаполнения.ДатаОкончания;
	РазмерОдновременноСессий = ПараметрыЗаполнения.РазмерОдновременноСессий;
	ОтображатьФоновыеЗадания = ПараметрыЗаполнения.ОтображатьФоновыеЗадания;
	МинимальнаяДлительностьСеансовЗаданий =
		ПараметрыЗаполнения.МинимальнаяДлительностьСеансовЗаданий;
	СкрытьРегламентныеЗадания = ПараметрыЗаполнения.СкрытьРегламентныеЗадания;
	СмещениеВремениСервера = ПараметрыЗаполнения.СмещениеВремениСервера;
	
	ДанныеЖурналаРегистрации = Новый ТаблицаЗначений;
	
	Уровни = Новый Массив;
	Уровни.Добавить(УровеньЖурналаРегистрации.Информация);
	Уровни.Добавить(УровеньЖурналаРегистрации.Предупреждение);
	Уровни.Добавить(УровеньЖурналаРегистрации.Ошибка);
	
	СобытияРЗ = Новый Массив;
	СобытияРЗ.Добавить("_$Job$_.Start");
	СобытияРЗ.Добавить("_$Job$_.Cancel");
	СобытияРЗ.Добавить("_$Job$_.Terminate");
	СобытияРЗ.Добавить("_$Job$_.Fail"); // Старое
	СобытияРЗ.Добавить("_$Job$_.Error"); // Новое
	СобытияРЗ.Добавить("_$Job$_.Succeed"); // Старое
	СобытияРЗ.Добавить("_$Job$_.Finish"); // Новое
	
	УстановитьПривилегированныйРежим(Истина);
	ОтборЖурнала = Новый Структура;
	ОтборЖурнала.Вставить("Уровень", Уровни);
	ОтборЖурнала.Вставить("ДатаНачала", ДатаНачала + СмещениеВремениСервера);
	ОтборЖурнала.Вставить("ДатаОкончания", ДатаОкончания + СмещениеВремениСервера);
	ОтборЖурнала.Вставить("Событие", СобытияРЗ);
	
	ВыгрузитьЖурналРегистрации(ДанныеЖурналаРегистрации, ОтборЖурнала);
	ОтчетПустой = (ДанныеЖурналаРегистрации.Количество() = 0);
	
	Если СмещениеВремениСервера <> 0 Тогда
		Для Каждого СтрокаТаблицы Из ДанныеЖурналаРегистрации Цикл
			СтрокаТаблицы.Дата = СтрокаТаблицы.Дата - СмещениеВремениСервера;
		КонецЦикла;
	КонецЕсли;
	
	// Формируем данные для отбора по регламентным заданиям.
	СписокВсехРегламентныхЗаданий = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
	СоответствиеМетаданныеИдентификатор = Новый Соответствие;
	СоответствиеМетаданныеНазвание = Новый Соответствие;
	СоответствиеМетаданныеНазвание.Вставить("", "<>");
	СоответствиеНаименованиеИдентификатор = Новый Соответствие;
	УстановитьПривилегированныйРежим(Ложь);
	
	Для Каждого РегЗадание Из СписокВсехРегламентныхЗаданий Цикл
		СоответствиеМетаданныеИдентификатор.Вставить(РегЗадание.Метаданные, Строка(РегЗадание.УникальныйИдентификатор));
		СоответствиеНаименованиеИдентификатор.Вставить(РегЗадание.Наименование, Строка(РегЗадание.УникальныйИдентификатор));
		СоответствиеМетаданныеНазвание.Вставить(РегЗадание.Метаданные, РегЗадание.Метаданные.Представление());
	КонецЦикла;
	
	// Заполняем параметры, необходимые для определения одновременно работавших регламентных заданий.
	ПараметрыОдновременноСессий = Новый Структура;
	ПараметрыОдновременноСессий.Вставить("ДанныеЖурналаРегистрации", ДанныеЖурналаРегистрации);
	ПараметрыОдновременноСессий.Вставить("СоответствиеНаименованиеИдентификатор", СоответствиеНаименованиеИдентификатор);
	ПараметрыОдновременноСессий.Вставить("СоответствиеМетаданныеИдентификатор", СоответствиеМетаданныеИдентификатор);
	ПараметрыОдновременноСессий.Вставить("СоответствиеМетаданныеНазвание", СоответствиеМетаданныеНазвание);
	ПараметрыОдновременноСессий.Вставить("СкрытьРегламентныеЗадания", СкрытьРегламентныеЗадания);
	ПараметрыОдновременноСессий.Вставить("МинимальнаяДлительностьСеансовЗаданий",
		МинимальнаяДлительностьСеансовЗаданий);
	
	// Максимальное количество одновременных сессий	регламентных заданий.
	ОдновременноСессий = ОдновременноРегламентныхЗаданий(ПараметрыОдновременноСессий);
	
	// Отбираем нужные значения из таблицы ОдновременноСессий.
	ОдновременноСессий.Сортировать("ОдновременноРегламентныхЗаданий Убыв");
	
	СтрокаИтогоОдновременноРегламентныхЗаданий = Неопределено;
	ИтогоОдновременноРегламентныхЗаданий = Новый ТаблицаЗначений();
	ИтогоОдновременноРегламентныхЗаданий.Колонки.Добавить("ДатаОдновременноРегламентныхЗаданий", 
		Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50)));
	ИтогоОдновременноРегламентныхЗаданий.Колонки.Добавить("ОдновременноРегламентныхЗаданий", 
		Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10))); 
	ИтогоОдновременноРегламентныхЗаданий.Колонки.Добавить("СписокРегламентныхЗаданий");
	
	Для Каждого СтрокаОдновременноСессий Из ОдновременноСессий Цикл
		Если СтрокаОдновременноСессий.ОдновременноРегламентныхЗаданий >= РазмерОдновременноСессий
			И СтрокаОдновременноСессий.ОдновременноРегламентныхЗаданий >= 2 Тогда
			СтрокаИтогоОдновременноРегламентныхЗаданий = ИтогоОдновременноРегламентныхЗаданий.Добавить();
			СтрокаИтогоОдновременноРегламентныхЗаданий.ДатаОдновременноРегламентныхЗаданий = 
				СтрокаОдновременноСессий.ДатаОдновременноРегламентныхЗаданий;
			СтрокаИтогоОдновременноРегламентныхЗаданий.ОдновременноРегламентныхЗаданий = 
				СтрокаОдновременноСессий.ОдновременноРегламентныхЗаданий;
			СтрокаИтогоОдновременноРегламентныхЗаданий.СписокРегламентныхЗаданий = 
				СтрокаОдновременноСессий.СписокРегламентныхЗаданий;
		КонецЕсли;
	КонецЦикла;
	
	ДанныеЖурналаРегистрации.Сортировать("Метаданные, Данные, Дата, Сеанс");
	
	// Заполняем параметры, необходимые для получения данных по каждому сеансу регламентных заданий.
	ПараметрыСеансыРегламентныхЗаданий = Новый Структура;
	ПараметрыСеансыРегламентныхЗаданий.Вставить("ДанныеЖурналаРегистрации", ДанныеЖурналаРегистрации);
	ПараметрыСеансыРегламентныхЗаданий.Вставить("СоответствиеНаименованиеИдентификатор", СоответствиеНаименованиеИдентификатор);
	ПараметрыСеансыРегламентныхЗаданий.Вставить("СоответствиеМетаданныеИдентификатор", СоответствиеМетаданныеИдентификатор);
	ПараметрыСеансыРегламентныхЗаданий.Вставить("СоответствиеМетаданныеНазвание", СоответствиеМетаданныеНазвание);
	ПараметрыСеансыРегламентныхЗаданий.Вставить("ОтображатьФоновыеЗадания", ОтображатьФоновыеЗадания);
	ПараметрыСеансыРегламентныхЗаданий.Вставить("СкрытьРегламентныеЗадания", СкрытьРегламентныеЗадания);
	
	// Регламентные задания
	ТаблицаСеансыРегламентныхЗаданий = 
		СеансыРегламентныхЗаданий(ПараметрыСеансыРегламентныхЗаданий).ТаблицаСеансыРегламентныхЗаданий;
	КоличествоЗапусков = СеансыРегламентныхЗаданий(ПараметрыСеансыРегламентныхЗаданий).КоличествоЗапусков;
	
	Результат = Новый Структура;
	Результат.Вставить("ТаблицаСеансыРегламентныхЗаданий", ТаблицаСеансыРегламентныхЗаданий);
	Результат.Вставить("ИтогоОдновременноРегламентныхЗаданий", ИтогоОдновременноРегламентныхЗаданий);
	Результат.Вставить("КоличествоЗапусков", КоличествоЗапусков);
	Результат.Вставить("ОтчетПустой", ОтчетПустой);
	
	Возврат Результат;
КонецФункции

Функция ОдновременноРегламентныхЗаданий(ПараметрыОдновременноСессий)
	
	ДанныеЖурналаРегистрации 			  = ПараметрыОдновременноСессий.ДанныеЖурналаРегистрации;
	СоответствиеНаименованиеИдентификатор = ПараметрыОдновременноСессий.СоответствиеНаименованиеИдентификатор;
	СоответствиеМетаданныеИдентификатор   = ПараметрыОдновременноСессий.СоответствиеМетаданныеИдентификатор;
	СоответствиеМетаданныеНазвание 		  = ПараметрыОдновременноСессий.СоответствиеМетаданныеНазвание;
	СкрытьРегламентныеЗадания 			  = ПараметрыОдновременноСессий.СкрытьРегламентныеЗадания;
	МинимальнаяДлительностьСеансовЗаданий = ПараметрыОдновременноСессий.МинимальнаяДлительностьСеансовЗаданий;
	ОдновременноСессий = Новый ТаблицаЗначений();
	ОдновременноСессий.Колонки.Добавить("ДатаОдновременноРегламентныхЗаданий", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(50)));
	ОдновременноСессий.Колонки.Добавить("ОдновременноРегламентныхЗаданий", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)));
	ОдновременноСессий.Колонки.Добавить("СписокРегламентныхЗаданий");
	МассивРегламентныхЗаданий = Новый Массив;
	ОдновременноРегламентныхЗаданий = 0;
	Счетчик = 0;
	ТекущаяДата = Неопределено;
	СтрокаТаблицы = Неопределено;
	МаксМассивРегламентныхЗаданий = Неопределено;
	Для Каждого СтрокаДанныхЖурналаРегистрации Из ДанныеЖурналаРегистрации Цикл 
		Если Ложь
			Или Не ЗначениеЗаполнено(СтрокаДанныхЖурналаРегистрации.Дата)
			//Или Не ЗначениеЗаполнено(СтрокаДанныхЖурналаРегистрации.Метаданные) 
		Тогда
			Продолжить;
		КонецЕсли;
		
		НазваниеИУникальныйИдентификатор = НазваниеИУникальныйИдентификаторСеансаРегламентногоЗадания(
			СтрокаДанныхЖурналаРегистрации, СоответствиеНаименованиеИдентификатор,
			СоответствиеМетаданныеИдентификатор, СоответствиеМетаданныеНазвание);
			
		НазваниеРегламентногоЗадания = НазваниеИУникальныйИдентификатор.НазваниеСеанса;
		УникальныйИдентификаторРегламентногоЗадания = НазваниеИУникальныйИдентификатор.УникальныйИдентификаторРегламентногоЗадания;
		
		Если Не СкрытьРегламентныеЗадания = Неопределено
			И Не ТипЗнч(СкрытьРегламентныеЗадания) = Тип("Строка") Тогда
			
			ФильтрРегламентныхЗаданий = СкрытьРегламентныеЗадания.НайтиПоЗначению(
				УникальныйИдентификаторРегламентногоЗадания);
			Если Не ФильтрРегламентныхЗаданий = Неопределено Тогда
				Продолжить;
			КонецЕсли;
		ИначеЕсли Не СкрытьРегламентныеЗадания = Неопределено
			И ТипЗнч(СкрытьРегламентныеЗадания) = Тип("Строка") Тогда
			
			Если УникальныйИдентификаторРегламентногоЗадания = СкрытьРегламентныеЗадания Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;	
		
		ДатаОдновременноРегламентныхЗаданий = НачалоЧаса(СтрокаДанныхЖурналаРегистрации.Дата);
		
		Если ТекущаяДата <> ДатаОдновременноРегламентныхЗаданий Тогда
			Если СтрокаТаблицы <> Неопределено Тогда
				СтрокаТаблицы.ОдновременноРегламентныхЗаданий = ОдновременноРегламентныхЗаданий;
				СтрокаТаблицы.ДатаОдновременноРегламентныхЗаданий = ирОбщий.СтрШаблонЛкс(НСтр("ru = '%1 - %2'"),
					Формат(ТекущаяДата, "ДЛФ=T"),
					Формат(КонецЧаса(ТекущаяДата), "ДЛФ=T"));
				СтрокаТаблицы.СписокРегламентныхЗаданий = МаксМассивРегламентныхЗаданий;
			КонецЕсли;
			СтрокаТаблицы = ОдновременноСессий.Добавить();
			ОдновременноРегламентныхЗаданий = 0;
			Счетчик    = 0;
			МассивРегламентныхЗаданий.Очистить();
			ТекущаяДата = ДатаОдновременноРегламентныхЗаданий;
		КонецЕсли;
		
		Если СтрокаДанныхЖурналаРегистрации.Событие = "_$Job$_.Start" Тогда
			Счетчик = Счетчик + 1;
			МассивРегламентныхЗаданий.Добавить(НазваниеРегламентногоЗадания);
			МассивРегламентныхЗаданий.Добавить(СтрокаДанныхЖурналаРегистрации.Сеанс);
			МассивРегламентныхЗаданий.Добавить(СтрокаДанныхЖурналаРегистрации.Дата);
		Иначе
			ИндексРегламентногоЗадания = МассивРегламентныхЗаданий.Найти(НазваниеРегламентногоЗадания);
			Если ИндексРегламентногоЗадания = Неопределено Тогда 
				Продолжить;
			КонецЕсли;
			
			Если ЗначениеЗаполнено(МаксМассивРегламентныхЗаданий) Тогда
				ИндексСтрокиМассива = МаксМассивРегламентныхЗаданий.Найти(НазваниеРегламентногоЗадания);
				Если ИндексСтрокиМассива <> Неопределено 
					И МаксМассивРегламентныхЗаданий[ИндексСтрокиМассива+1] = МассивРегламентныхЗаданий[ИндексРегламентногоЗадания+1]
					И СтрокаДанныхЖурналаРегистрации.Дата - МаксМассивРегламентныхЗаданий[ИндексСтрокиМассива+2] <
						МинимальнаяДлительностьСеансовЗаданий Тогда
					МаксМассивРегламентныхЗаданий.Удалить(ИндексСтрокиМассива);
					МаксМассивРегламентныхЗаданий.Удалить(ИндексСтрокиМассива);
					МаксМассивРегламентныхЗаданий.Удалить(ИндексСтрокиМассива);
					ОдновременноРегламентныхЗаданий = ОдновременноРегламентныхЗаданий - 1;
				КонецЕсли;
			КонецЕсли;    						
			МассивРегламентныхЗаданий.Удалить(ИндексРегламентногоЗадания);
			МассивРегламентныхЗаданий.Удалить(ИндексРегламентногоЗадания); // Удаляем значение сеанса
			МассивРегламентныхЗаданий.Удалить(ИндексРегламентногоЗадания); // Удаляем значение даты
			Счетчик = Счетчик - 1;
		КонецЕсли;
		
		Счетчик = Макс(Счетчик, 0);
		Если Счетчик > ОдновременноРегламентныхЗаданий Тогда
			МаксМассивРегламентныхЗаданий = Новый Массив;
			Для Каждого Элемент Из МассивРегламентныхЗаданий Цикл
				МаксМассивРегламентныхЗаданий.Добавить(Элемент);
			КонецЦикла;
		КонецЕсли;
		ОдновременноРегламентныхЗаданий = Макс(ОдновременноРегламентныхЗаданий, Счетчик);
	КонецЦикла;
		
	Если ОдновременноРегламентныхЗаданий <> 0 Тогда
		СтрокаТаблицы.ОдновременноРегламентныхЗаданий  = ОдновременноРегламентныхЗаданий;
		СтрокаТаблицы.ДатаОдновременноРегламентныхЗаданий = ирОбщий.СтрШаблонЛкс(НСтр("ru = '%1 - %2'"),
			Формат(ТекущаяДата, "ДЛФ=T"),
			Формат(КонецЧаса(ТекущаяДата), "ДЛФ=T"));
		СтрокаТаблицы.СписокРегламентныхЗаданий = МаксМассивРегламентныхЗаданий;
	КонецЕсли;
	
	Возврат ОдновременноСессий;
КонецФункции

Функция СеансыРегламентныхЗаданий(ПараметрыСеансыРегламентныхЗаданий)

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

// Процедура для установки цвета интервалов и фона диаграммы ганта.
//
// Параметры:
//   ДатаНачала - день, за который производится построение диаграммы.
//   ДиаграммаГанта - диаграмма ганта, тип - РисунокТабличногоДокумента.
//   ОдновременноСессий - таблица значений с данными по количеству одновременно работавших
// 		регламентных заданий в течении дня.
//   ЦветаФона - массив цветов для интервалов фона.
//
Процедура ЦветаДиаграммыГанта(ДатаНачала, ДиаграммаГанта, ОдновременноСессий, ЦветаФона)
	// Добавляем цвета интервалов фона.
	ТекущееКоличествоСессий = 0;
	ИндексЦвета = 3;
	Для Каждого СтрокаОдновременноСессий Из ОдновременноСессий Цикл
		Если СтрокаОдновременноСессий.ОдновременноРегламентныхЗаданий = 1 Тогда
			Продолжить
		КонецЕсли;
		СтрокаДаты = Лев(СтрокаОдновременноСессий.ДатаОдновременноРегламентныхЗаданий, 8);
		ДатаНачалоИФ =  Дата(Формат(ДатаНачала,"ДЛФ=D") + " " + СтрокаДаты);
		ДатаКонецИФ = КонецЧаса(ДатаНачалоИФ);
		ИнтервалДГ = ДиаграммаГанта.ИнтервалыФона.Добавить(ДатаНачалоИФ, ДатаКонецИФ);
		Если ТекущееКоличествоСессий <> 0 
			И ТекущееКоличествоСессий <> СтрокаОдновременноСессий.ОдновременноРегламентныхЗаданий 
			И ИндексЦвета <> 0 Тогда
			ИндексЦвета = ИндексЦвета - 1;
		КонецЕсли;
		ЦветФона = ЦветаФона.Получить(ИндексЦвета);
		ИнтервалДГ.Цвет = ЦветФона;
		
		ТекущееКоличествоСессий = СтрокаОдновременноСессий.ОдновременноРегламентныхЗаданий;
	КонецЦикла;
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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