Перем СписокТрекеров;
Перем СоответствиеИменПолей;

Перем мПоказыватьНастройки;
Перем мТекПозицияВДереве;
Перем мТекПозицияВСписке;

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ ДЕЙСТВИЙ ФОРМЫ

Процедура ДействияФормыЗакрыть(Кнопка)
	Закрыть();
КонецПроцедуры

Процедура ДействияФормыПолучитьСписокПроектов(Кнопка)
	
	СформироватьДеревоПроектовТрекера();
	
КонецПроцедуры

Процедура ДействияФормыПолучитьСписокПользователей(Кнопка)
	
	СформироватьДеревоПользователейТрекера();	
	
КонецПроцедуры

Процедура ДействияФормыПолучитьСписокДопПолей(Кнопка)
	
	СформироватьДеревоДопПолейТрекера();
	
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ ДЕЙСТВИЙ КОМАНДНЫХ ПАНЕЛЕЙ

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

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


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

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


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

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

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

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


Функция ЕстьФлажки()
	
	Для Каждого Задача Из СписокЗадач Цикл
		Если Задача.Пометка Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
КонецФункции


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

Процедура КоманднаяПанельСписокЗадачПоказатьСкрытьОписание(Кнопка)
	
	НастройкиФормы.ПоказатьОписание = НЕ НастройкиФормы.ПоказатьОписание;
	
	ПоказатьСкрытьОписаниеHTML();
	
КонецПроцедуры





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


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

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

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

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

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

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


Процедура КоманднаяПанельСписокЗадачСкопироватьВБуфер(Кнопка)
	
	ТекСтрока = ЭлементыФормы.СписокЗадач.ТекущиеДанные;
	Если Не ТекСтрока = Неопределено Тогда
		ВставитьТекстВБуферОбмена(Сервер + ":" + Формат(Порт, "ЧГ=0") + "/issues/"+Формат(ТекСтрока.Идентификатор, "ЧГ=0"));
	КонецЕсли;
	
КонецПроцедуры

Процедура КоманднаяПанельСписокЗадачПерейти(Кнопка)
	СтрокаПорт = Формат(Порт, "ЧГ=0");
	
	Если Найти(Кнопка.Имя, "СписокЗадач") Тогда

		ТекСтрока = ЭлементыФормы.СписокЗадач.ТекущиеДанные;
		Если Не ТекСтрока = Неопределено Тогда
			
			СтрокаДерева = ДеревоПроектовЗадач.Строки.Найти(ТекСтрока.Идентификатор, "Идентификатор", Истина);
			Если СтрокаДерева <> Неопределено И СтрокаДерева.Идентификатор <> 0 Тогда
				мПроект = ВернутьПервогоРодителяСтроки(СтрокаДерева).ПроектЗадача;
				
				ИдПроекта = ПолучитьИдентификаторПараметра(мПроект, "projects");
				ЗапуститьПриложение("http://" + Сервер + ":" + СтрокаПорт + "/projects/p0"+Формат(ИдПроекта-1, "ЧГ=0") + "/issues");
				
			КонецЕсли;
		КонецЕсли;
	Иначе
		ТекСтрока = ЭлементыФормы.СписокЗадач.ТекущиеДанные;
		Если Не ТекСтрока = Неопределено Тогда
			ЗапуститьПриложение("http://" + Сервер + ":" + СтрокаПорт + "/issues/"+Формат(ТекСтрока.Идентификатор, "ЧГ=0"));
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры



////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗАНАЧЕНИЯ


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


Функция Инициализация(Отборы = Ложь)
	
	Если Не ВсеПоляЗаполнены(Новый Структура("Сервер, Порт, Пользователь, Пароль")) Тогда
		Возврат Ложь;
	КонецЕсли;
	
	ОтчетОВыполнении = СформироватьСтруктуруОтчетаОВыполнении();
	
	// Получить список проектов из трекера
	Если ЗагруженныеДанные.Получить("projects") = Неопределено Тогда
		Данные = ПолучитьДанныеРесурсаИзТрекера("projects", ОтчетОВыполнении);
		Если НЕ ОтчетОВыполнении.ЕстьОшибки Тогда
			ЗагруженныеДанные.Вставить("projects", Данные);
		Иначе
			Сообщить(ОтчетОВыполнении.ТекстОшибки, СтатусСообщения.Важное);
			Возврат Ложь;
		КонецЕсли;
	КонецЕсли;
	
	// Формируем структуру списков данных, которые нам необходимо получить из трекера
	Если Отборы Тогда
		ПоляВыбора = Новый Структура("queries, custom_fields", 
									"queries", "custom_fields");
		Если ЗначениеЗаполнено(Проект) Тогда
			мПроект = ПолучитьИдентификаторПараметра(Проект, "projects");
			ПоляВыбора.Вставить("memberships", "projects/"+мПроект+"/memberships");								
		КонецЕсли;
	Иначе
		ПоляВыбора = Новый Структура("trackers, issue_statuses, issue_priorities, time_entry_activities, custom_fields", 
									"trackers", "issue_statuses", "enumerations/issue_priorities", "enumerations/time_entry_activities", "custom_fields");
	КонецЕсли;
	
	// Заполняем поля выбора
	Для Каждого Поле Из ПоляВыбора Цикл
		Если ЗагруженныеДанные.Получить(Поле.Ключ) = Неопределено Тогда
			Данные = ПолучитьДанныеРесурсаИзТрекера(Поле.Значение, ОтчетОВыполнении);
			Если НЕ ОтчетОВыполнении.ЕстьОшибки Тогда
				ЗагруженныеДанные.Вставить(Поле.Ключ, Данные);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;							

	Если ОтчетОВыполнении.ЕстьОшибки Тогда
		Сообщить(ОтчетОВыполнении.ТекстОшибки, СтатусСообщения.Важное);
		Возврат Ложь;
	КонецЕсли;
	
	УспешнаяИнициализация = Истина;
	Возврат Истина;
КонецФункции


Процедура ОткрытьФормуЗадачиДляРедактирования(НомерЗадачи) Экспорт
	
	Инициализация();	
	
	УстановитьПоляЗадачиПоУмолчанию();
	
	ОтчетОВыполнении = СформироватьСтруктуруОтчетаОВыполнении();
	
	Отборы = "&include=attachments,changesets,watchers,children,journals";
	ДанныеРесурса = ПолучитьДанныеРесурсаИзТрекера("issues/"+Формат(НомерЗадачи,"ЧГ=0")+"", ОтчетОВыполнении, Отборы);
	
	Если ОтчетОВыполнении.ЕстьОшибки Тогда
		Сообщить(ОтчетОВыполнении.ТекстОшибки);
		Возврат;
	КонецЕсли;
	
	ФормаЗадачи = ПолучитьФорму("ФормаЗадачи", ЭтаФорма, Формат(НомерЗадачи,"ЧГ=0"));
	ФормаЗадачи.СтруктураЗадачи	= ДанныеРесурса.issue;
	ФормаЗадачи.НоваяЗадача		= Ложь;
	ФормаЗадачи.Открыть();
	
КонецПроцедуры


Функция ВернутьПервогоРодителяСтроки(СтрокаДерева)
	
	Если СтрокаДерева.Родитель = Неопределено Тогда
		Возврат СтрокаДерева;
	Иначе
		Возврат ВернутьПервогоРодителяСтроки(СтрокаДерева.Родитель);
	КонецЕсли;
	
КонецФункции

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

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

Процедура ПерезаполнитьСписокЗапросов()
		
	Данные = ЗагруженныеДанные.Получить("queries");
	Если Данные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ПодменюЗапросы = ЭлементыФормы.КоманднаяПанельДеревоПроектовЗадач.Кнопки.Запросы;
	ПодменюЗапросы.Кнопки.Очистить();
	
	спКнопок = Новый СписокЗначений;
	
	Если ЗначениеЗаполнено(Проект) Тогда
		мПроект = ПолучитьИдентификаторПараметра(Проект, "projects");
	КонецЕсли;
	
	Для Каждого Запрос Из Данные["queries"] Цикл
		Если НЕ Запрос.Свойство("project_id") Тогда
			спКнопок.Добавить(Запрос.id, Запрос.name);
		КонецЕсли;
		Если мПроект <> Неопределено И Запрос.Свойство("project_id") И Запрос.project_id = мПроект Тогда
			спКнопок.Добавить(Запрос.id, Запрос.name);	
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого Кнопка Из спКнопок Цикл
		КнопкаНажатие = Новый Действие("ОбновитьСписокЗадачПоЗапросу");
		ТипКнопки = ТипКнопкиКоманднойПанели.Действие; 
		
		НоваяКнопка = ПодменюЗапросы.Кнопки.Добавить("Запрос_"+Формат(Кнопка.Значение, "ЧГ=0"), ТипКнопки,  Кнопка.Представление,КнопкаНажатие);
		НоваяКнопка.Картинка = БиблиотекаКартинок.СтартБизнесПроцесса; 
	КонецЦикла;
	
КонецПроцедуры

Процедура ПерезаполнитьКнопкиВариантовРедактированияЗадач()
	
	СтруктураПодменю = Новый Структура("trackers, issue_statuses, issue_priorities", 
										"Трекер", "Статус", "Приоритет");
	
	ПодменюИзменить = ЭлементыФормы.КоманднаяПанельСписокЗадач.Кнопки.Изменить;
	
	Для Каждого КиЗ Из СтруктураПодменю Цикл
		Кнопка = ПодменюИзменить.Кнопки.Найти(КиЗ.Значение);
		Если Кнопка <> Неопределено Тогда
			ПодменюИзменить.Кнопки.Удалить(Кнопка);
		КонецЕсли;
	КонецЦикла;	
	
	Для Каждого КиЗ Из СтруктураПодменю Цикл
		
		// Новое подменю
		НовоеПодменю = ПодменюИзменить.Кнопки.Добавить(КиЗ.Значение, ТипКнопкиКоманднойПанели.Подменю, КиЗ.Значение);
	
		Данные = ЗагруженныеДанные.Получить(КиЗ.Ключ);
		Если Данные = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		Для Каждого СтрокаДанных Из Данные[КиЗ.Ключ] Цикл
			КнопкаНажатие = Новый Действие("ИзменитьСвойстваВыбранныхЗадач");
			ТипКнопки = ТипКнопкиКоманднойПанели.Действие; 
			
			НоваяКнопка = НовоеПодменю.Кнопки.Добавить(КиЗ.Значение + "_" + СтрокаДанных["name"], ТипКнопки, СтрокаДанных["name"], КнопкаНажатие);
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры


Процедура ОбновитьСписокЗадачПоЗапросу(Кнопка)
	
	ИдЗапроса = Число(Прав(Кнопка.Имя, СтрДлина(Кнопка.Имя) - 7));
	
	КоманднаяПанельСписокЗадачОбновитьСписок(Неопределено);

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


Функция СформироватьПараметрыЗапросаПолученияДанныхСТрекера()
	Отборы = "";
	
	Если ЗначениеЗаполнено(Проект) Тогда
		Идентификатор = ПолучитьИдентификаторПараметра(Проект, "projects");
		Если Идентификатор <> Неопределено Тогда
			Отборы = Отборы + "&project_id="+Идентификатор;
		КонецЕсли;
	КонецЕсли;
	Если ЗначениеЗаполнено(Исполнитель) Тогда
		Идентификатор = ПолучитьИдентификаторПараметра(Исполнитель, "memberships");
		Если Идентификатор <> Неопределено Тогда
			Отборы = Отборы + "&assigned_to_id="+Идентификатор;
		КонецЕсли;
	КонецЕсли;
	Если ЗначениеЗаполнено(Статус) Тогда
		Если Статус = "*" Или Статус = "open" Или Статус = "closed" Тогда
			Идентификатор = Статус;	
		Иначе
			Идентификатор = ПолучитьИдентификаторПараметра(Статус, "issue_statuses");
		КонецЕсли;
		Если Идентификатор <> Неопределено Тогда
			Отборы = Отборы + "&status_id="+Идентификатор;
		КонецЕсли;
	КонецЕсли;
	Если ЗначениеЗаполнено(Приоритет) Тогда
		Идентификатор = ПолучитьИдентификаторПараметра(Приоритет, "issue_priorities");
		Если Идентификатор <> Неопределено Тогда
			Отборы = Отборы + "&priority_id="+Идентификатор;
		КонецЕсли;
	КонецЕсли;
	Если ЗначениеЗаполнено(Трекер) Тогда
		Идентификатор = ПолучитьИдентификаторПараметра(Трекер, "trackers");
		Если Идентификатор <> Неопределено Тогда
			Отборы = Отборы + "&tracker_id="+Идентификатор;
		КонецЕсли;
	КонецЕсли;
	Если ЗначениеЗаполнено(ДатаНач) И ЗначениеЗаполнено(ДатаКон) Тогда
		Отборы = Отборы + "&due_date="+ЗакодироватьОперации("><")+ФорматироватьДату(ДатаНач)+"|"+ФорматироватьДату(ДатаКон);
	ИначеЕсли ЗначениеЗаполнено(ДатаНач) Тогда		
		Отборы = Отборы + "&due_date="+ЗакодироватьОперации(">=")+ФорматироватьДату(ДатаНач); 
	ИначеЕсли ЗначениеЗаполнено(ДатаКон) Тогда		
		Отборы = Отборы + "&due_date="+ЗакодироватьОперации("<=")+ФорматироватьДату(ДатаКон); 
	КонецЕсли;
	Если ИдЗапроса <> 0 Тогда
		Отборы = Отборы + "&query_id="+ИдЗапроса;
		ИдЗапроса = 0;
	КонецЕсли;
	Для Каждого Поле Из тНастраиваемыеПоля  Цикл
		Если Поле.Пометка И ЗначениеЗаполнено(Поле.Значение) Тогда
			Отборы = Отборы + "&cf_"+Поле.Идентификатор+"="+Поле.Значение;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Отборы;
КонецФункции

Функция ФорматироватьДату(Дата)
	Возврат Формат(Дата,"ДФ=yyyy-MM-dd");
КонецФункции


Функция ЗакодироватьОперации(Знак)
	
	Результат = СтрЗаменить(Знак, ">", "%3E");
	Результат = СтрЗаменить(Знак, "<", "%3C");
	Результат = СтрЗаменить(Знак, "=", "%3D");
	
	Возврат Результат;
КонецФункции



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

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

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


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

Процедура ЗаполнитьСписокЗначенийПоМассиву(Список, Массив)
	Для Каждого Эл Из Массив Цикл
		Список.Добавить(Эл);
	КонецЦикла;
КонецПроцедуры


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

Функция ФорматироватьСтрокуВДату(Значение)
	
	Если ТипЗнч(Значение) = Тип("Дата") Тогда
		Возврат Значение;
	КонецЕсли;
	
	Значение = СтрЗаменить(Значение, " ", "");
	Значение = СтрЗаменить(Значение, ".", "");
	Значение = СтрЗаменить(Значение, "-", "");
	Значение = СтрЗаменить(Значение, ":", "");
	Значение = СтрЗаменить(Значение, "T", "");
	Значение = СтрЗаменить(Значение, "Z", "");
	
	Возврат Дата(Значение);
КонецФункции



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

	ЭлементыФормы[ТабличноеПоле].ГоризонтальныеЛинии	= Истина;
	ЭлементыФормы[ТабличноеПоле].ВертикальныеЛинии		= Истина;
	
	Для Каждого СтрокаДерева Из Дерево.Строки Цикл
		ЭлементыФормы[ТабличноеПоле].Развернуть(СтрокаДерева, Истина); // Развернем все строки
	КонецЦикла;
	
КонецПроцедуры

Функция СформироватьДерево(ВидДерева)
	
	Дерево = Новый ДеревоЗначений;
	Если ВидДерева = "issues" Тогда
		Дерево.Колонки.Добавить("ПроектЗадача",           ПолучитьОписаниеТиповСтроки(100), "Проект/Задача", 100);
		Дерево.Колонки.Добавить("Идентификатор",          ПолучитьОписаниеТиповЧисла(5,0), 	"Номер задачи", 10);
		//Дерево.Колонки.Добавить("Тема",                   ПолучитьОписаниеТиповСтроки(150), "Тема");
		//Дерево.Колонки.Добавить("Описание",               ПолучитьОписаниеТиповСтроки(1000),"Описание");
		//Дерево.Колонки.Добавить("Статус",                 ПолучитьОписаниеТиповСтроки(100),, 20);
		//Дерево.Колонки.Добавить("Приоритет",              ПолучитьОписаниеТиповСтроки(100),, 20);
		//Дерево.Колонки.Добавить("Трекер",                 ПолучитьОписаниеТиповСтроки(100),, 20);
		//Дерево.Колонки.Добавить("Исполнитель",            ПолучитьОписаниеТиповСтроки(100),, 30);
		//Дерево.Колонки.Добавить("ОценкаВремени",          ПолучитьОписаниеТиповЧисла(10,2),, 10);
		//Дерево.Колонки.Добавить("ПроцентВыполнения",      ПолучитьОписаниеТиповЧисла(10,2),, 10);
		//Дерево.Колонки.Добавить("ДополнительныеПоля",   ,, 10);
		//Дерево.Колонки.Добавить("ДатаНачала",             ПолучитьОписаниеТиповСтроки(100),, 20);
		//Дерево.Колонки.Добавить("ДатаВыполнения",         ПолучитьОписаниеТиповСтроки(100),, 20);
		Дерево.Колонки.Добавить("ИдентификаторПроекта",   ПолучитьОписаниеТиповЧисла(5,0), 	"Ид. проекта", 10);
	ИначеЕсли ВидДерева = "projects" Тогда
		Дерево.Колонки.Добавить("НазваниеПроекта",        ПолучитьОписаниеТиповСтроки(100),	"Название проета", 30);
		Дерево.Колонки.Добавить("Описание",               ПолучитьОписаниеТиповСтроки(1000), 	"Описание", 50);
		Дерево.Колонки.Добавить("Идентификатор",          ПолучитьОписаниеТиповЧисла(5,0), 	"Идентификатор", 10);
	ИначеЕсли ВидДерева = "users" Тогда
		Дерево.Колонки.Добавить("Идентификатор",          ПолучитьОписаниеТиповЧисла(5,0), 	"Идентификатор", 10);
		Дерево.Колонки.Добавить("Имя",                    ПолучитьОписаниеТиповСтроки(100), 	"Имя", 20);
		Дерево.Колонки.Добавить("Фамилия",                ПолучитьОписаниеТиповСтроки(100), 	"Фамилия", 20);
		Дерево.Колонки.Добавить("Логин",                  ПолучитьОписаниеТиповСтроки(100), 	"Логин", 20);
		Дерево.Колонки.Добавить("Почта",                  ПолучитьОписаниеТиповСтроки(100), 	"Почта", 20);
		Дерево.Колонки.Добавить("ДатаСоздания",           ПолучитьОписаниеТиповСтроки(100), 	"Создан", 10);
		Дерево.Колонки.Добавить("ДатаАвторизации",        ПолучитьОписаниеТиповСтроки(100), 	"Авторизировался", 10);
	ИначеЕсли ВидДерева = "custom_fields" Тогда
		Дерево.Колонки.Добавить("Идентификатор",          ПолучитьОписаниеТиповЧисла(5,0), 	"Идентификатор", 10);
		Дерево.Колонки.Добавить("ИмяПоля",                ПолучитьОписаниеТиповСтроки(100), 	"Имя поля", 20);
		Дерево.Колонки.Добавить("ТипКастомизации",        ПолучитьОписаниеТиповСтроки(100), 	"Тип кастомизации", 20);
		Дерево.Колонки.Добавить("ФорматПоля",             ПолучитьОписаниеТиповСтроки(100), 	"Формат поля", 20);
		Дерево.Колонки.Добавить("МинДлина",               ПолучитьОписаниеТиповСтроки(100), 	"Мин. длина", 20);
		Дерево.Колонки.Добавить("МаксДлина",              ПолучитьОписаниеТиповСтроки(100), 	"Макс. длина", 10);
		Дерево.Колонки.Добавить("ЗначениеПоУмолчанию",    ПолучитьОписаниеТиповСтроки(100), 	"По умолчанию", 10);
		Дерево.Колонки.Добавить("Видимость",              ПолучитьОписаниеТиповСтроки(100), 	"Видимость", 10);
		Дерево.Колонки.Добавить("Обязательный",           ПолучитьОписаниеТиповСтроки(100), 	"Обязательное", 10);
		Дерево.Колонки.Добавить("Фильтруется",            ПолучитьОписаниеТиповСтроки(100), 	"Фильтруется", 10);
		Дерево.Колонки.Добавить("УчаствуетВПоиске",       ПолучитьОписаниеТиповСтроки(100), 	"Участвует в поиске", 10);
	КонецЕсли;
	
	Возврат Дерево;
КонецФункции


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

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

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

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

Процедура ПриЗакрытии()
	
	СохранитьНастройкиФормы(ЭтаФорма);
	СохранитьЗначение(Метаданные().Имя+"_НастройкиФормы", НастройкиФормы);
	
	ЗагруженныеДанные = Неопределено;
	
КонецПроцедуры


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

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

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

Процедура ЗаполнитьСписокДопПолейЗадачи(ТекЗадача, ЗаполнятьЗначение = Ложь)
	//Закладка{Проверить необходимость данной процедуры}
	НастраиваемыеПоля.Очистить();
	
	Для Каждого СтруктураПоля Из ТекЗадача.НастраиваемыеПоля Цикл
		ДопПоле = СтруктураПоля.Значение;
		
		нСтрока = НастраиваемыеПоля.Добавить();
		
		нСтрока.Идентификатор = ДопПоле.id;
		нСтрока.Имя = ДопПоле.name;
		
		Если ЗаполнятьЗначение Тогда
			нСтрока.Значение = ДопПоле.value;
			нСтрока.Пометка = Истина;
		Иначе
			
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры


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

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

Процедура ЗаполнитьТаблицуНастраиваемыхПолей()
	
	//: ЗагруженныеДанные = Новый Соответствие
	Данные = ЗагруженныеДанные.Получить("custom_fields");
	Если Данные = Неопределено Тогда
		ОтчетОВыполнении = СформироватьСтруктуруОтчетаОВыполнении();
		Данные = ПолучитьДанныеРесурсаИзТрекера("custom_fields", ОтчетОВыполнении);
		
		Если ОтчетОВыполнении.ЕстьОшибки Тогда
			Сообщить(ОтчетОВыполнении.ТекстОшибки);
			Возврат;
		КонецЕсли;
		
		ЗагруженныеДанные.Вставить("custom_fields", Данные);
	КонецЕсли;
	
	тНастраиваемыеПоля.Очистить();
	Для Каждого Поле Из Данные["custom_fields"] Цикл
		Если Поле.customized_type = "issue" И Поле.Свойство("is_filter") И Поле.is_filter Тогда
			нСтрока = тНастраиваемыеПоля.Добавить();
			
			нСтрока.Идентификатор = Поле.id;
			нСтрока.Имя = Поле.name;
			
			Если Поле.field_format = "string" Тогда
				нСтрока.Значение = "";
			ИначеЕсли Поле.field_format = "bool" Тогда
				Если Поле.Свойство("default_value") Тогда
					нСтрока.Значение = Поле.default_value;
				Иначе
					нСтрока.Значение = 0;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////
// ПОВТОРЯЮЩИЕСЯ ДЕЙСТВИЯ ПРИ ИЗМЕНЕНИИ РАЗНЫХ РЕКВИЗИТОВ

Процедура УстановитьВидимость()
	
КонецПроцедуры

Процедура УстановитьДоступность()
	
	ЭлементыФормы.КоманднаяПанельСписокЗадач.Кнопки.Добавить.Доступность		= УспешнаяИнициализация;
	ЭлементыФормы.КоманднаяПанельСписокЗадач.Кнопки.Изменить.Доступность		= УспешнаяИнициализация;
	ЭлементыФормы.КоманднаяПанельСписокЗадач.Кнопки.ОбновитьСписок.Доступность	= УспешнаяИнициализация;
	
КонецПроцедуры

Процедура УстановитьЗаголовки()
	
КонецПроцедуры

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

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

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

Процедура УстановитьОписаниеЗадачи(ТекстОписания);
	
	// TODO: 
	
	//	{Форма.Форма.Форма(1230)}: Ошибка при установке значения атрибута контекста (innerHTML)
	// ЭлементыФормы.ОписаниеЗадачиHTML.Документ.getElementById ("txt").innerHTML = ТекстОписания;
	//по причине:
	//Произошла исключительная ситуация (0x800a0258)
	
	ЭлементыФормы.ОписаниеЗадачиHTML.Документ.getElementById ("txt").innerHTML = ТекстОписания;
	
	// Посылаем сообщение невидимой кнопке, чтобы выполнить команду JS
	Команда = ЭлементыФормы.ОписаниеЗадачиHTML.Документ.getElementById ("SendEvent");    
	Команда.click("onclick");
	
	// получаем результат из контейнера DIV
	лРез = ЭлементыФормы.ОписаниеЗадачиHTML.Документ.getElementById ("BufferData").innerHTML;
	
КонецПроцедуры

Функция ФорматированиеСтроки(Знач Строка)
	Строка = СокрЛП(Строка);
	Строка = СтрЗаменить(Строка, "-", "");
	
	Возврат ?(Строка="","00010101", Строка);
КонецФункции


Процедура УправлениеОтображениемПанелиПользователя()
	
	Кнопка = ЭлементыФормы.КоманднаяПанельНастройки.Кнопки.Настройки;
	
	Если Кнопка.Пометка тогда
		ЭлементыФормы.ПанельНастроек.Свертка = РежимСверткиЭлементаУправления.Нет;
		ЭлементыФормы.Разделитель6.Свертка   = РежимСверткиЭлементаУправления.Нет;
		ШиринаПанели = ЭлементыФормы.ПанельНастроек.Ширина;
		ШиринаПанели = 281;
		Если ШиринаПанели / ЭтаФорма.Ширина > 0.5 тогда
			ШиринаПанели = 281;
			ЭлементыФормы.ПанельНастроек.Ширина = ШиринаПанели;
			ЭлементыФормы.ПанельНастроек.Лево = ЭлементыФормы.Панель.Ширина - 12 - ШиринаПанели - ЭлементыФормы.ДеревоПроектовЗадач.Ширина - 6;
		КонецЕсли;
		ЭлементыФормы.Разделитель6.УстановитьПривязку(ГраницаЭлементаУправления.Право, ЭтаФорма.Панель, ГраницаЭлементаУправления.Право);
		ЭлементыФормы.ПанельНастроек.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ЭлементыФормы.Разделитель6, ГраницаЭлементаУправления.Право);
		
		ЭлементыФормы.Разделитель6.Лево = ЭлементыФормы.Панель.Ширина - ШиринаПанели - 6;
		ЭлементыФормы.СписокЗадач.Ширина = ЭлементыФормы.Панель.Ширина - 12 - ШиринаПанели - ЭлементыФормы.ДеревоПроектовЗадач.Ширина - 6;
		ЭлементыФормы.ПанельОписание.Ширина = ЭлементыФормы.СписокЗадач.Ширина;
		ЭлементыФормы.Разделитель7.Ширина = ЭлементыФормы.СписокЗадач.Ширина;
	Иначе
		ЭлементыФормы.ПанельНастроек.УстановитьПривязку(ГраницаЭлементаУправления.Лево);
		ЭлементыФормы.Разделитель6.УстановитьПривязку(ГраницаЭлементаУправления.Право, ЭлементыФормы.ПанельНастроек, ГраницаЭлементаУправления.Лево);
		ЭлементыФормы.ПанельНастроек.Свертка = РежимСверткиЭлементаУправления.Право;
		ЭлементыФормы.Разделитель6.Свертка  	= РежимСверткиЭлементаУправления.Право;
	КонецЕсли;
	
КонецПроцедуры

Процедура УправлениеОтображениемОписанияHTML()
	
	Кнопка = ЭлементыФормы.КоманднаяПанельСписокЗадач.Кнопки.ПоказатьСкрытьОписание;
	ВысотаКомПанели = ЭлементыФормы.КоманднаяПанельСписокЗадач.Высота; 
	
	Если Кнопка.Пометка тогда
		ЭлементыФормы.ПанельОписание.Свертка = РежимСверткиЭлементаУправления.Нет;
		ЭлементыФормы.Разделитель7.Свертка   = РежимСверткиЭлементаУправления.Нет;
		//ВысотаОписания = ЭлементыФормы.ОписаниеЗадачиHTML.Высота;
		ВысотаОписания = 192;
		Если ВысотаОписания / ЭтаФорма.Высота > 0.5 тогда
			ВысотаОписания = 192;
			ЭлементыФормы.ПанельОписание.Высота = ВысотаОписания;
			ЭлементыФормы.ПанельОписание.Верх = ЭлементыФормы.Панель.Высота - 6 - ВысотаОписания - ЭлементыФормы.СписокЗадач.Высота;
		КонецЕсли;
		ЭлементыФормы.Разделитель7.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ЭтаФорма.Панель, ГраницаЭлементаУправления.Низ);
		ЭлементыФормы.ПанельОписание.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ЭлементыФормы.Разделитель7, ГраницаЭлементаУправления.Низ);
		
		ЭлементыФормы.Разделитель7.Верх = ЭлементыФормы.Панель.Высота - ВысотаОписания - 6 - ВысотаКомПанели - 10;
		ЭлементыФормы.СписокЗадач.Высота = ЭлементыФормы.Панель.Высота - 6 - ВысотаОписания - ВысотаКомПанели - 10 - 38;
	Иначе
		ЭлементыФормы.ПанельОписание.УстановитьПривязку(ГраницаЭлементаУправления.Верх);
		ЭлементыФормы.Разделитель7.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ЭлементыФормы.ПанельОписание, ГраницаЭлементаУправления.Верх);
		ЭлементыФормы.ПанельОписание.Свертка	= РежимСверткиЭлементаУправления.Низ;
		ЭлементыФормы.Разделитель7.Свертка		= РежимСверткиЭлементаУправления.Низ;
	КонецЕсли;
	
КонецПроцедуры


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


////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЧНЫХ ПОЛЕЙ 

Процедура ТаблицаВложенийПриПолученииДанных(Элемент, ОформленияСтрок)
	
	Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		
		ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
		Ячейки = ОформлениеСтроки.Ячейки;
		
		ЯчейкаСКартинкой = Ячейки["Картинка"];
		ЯчейкаСКартинкой.ОтображатьКартинку = Истина;
		
		// TODO Переделать на использование коллекции картинок и добавить ее в обработку, чтобы не зависило от конфигурации
		Попытка 
			Если ДанныеСтроки["Расширение"] = ".xls" Или ДанныеСтроки["Расширение"] = ".xlsx" Тогда
				ЯчейкаСКартинкой.Картинка = БиблиотекаКартинок.ПиктограммаФайла_Excel;
			ИначеЕсли ДанныеСтроки["Расширение"] = ".epf" Тогда
				ЯчейкаСКартинкой.Картинка = БиблиотекаКартинок.ПиктограммаФайла_EPF;
			ИначеЕсли ДанныеСтроки["Расширение"] = ".txt" Или ДанныеСтроки["Расширение"] = ".ini" Тогда
				ЯчейкаСКартинкой.Картинка = БиблиотекаКартинок.ПиктограммаФайла_TXT;
			ИначеЕсли ДанныеСтроки["Расширение"] = ".cf" Или ДанныеСтроки["Расширение"] = ".dt" Тогда
				ЯчейкаСКартинкой.Картинка = БиблиотекаКартинок.ПиктограммаФайла_1С;
			ИначеЕсли ДанныеСтроки["Расширение"] = ".doc" Тогда
				ЯчейкаСКартинкой.Картинка = БиблиотекаКартинок.ПиктограммаФайла_Word;
			ИначеЕсли ДанныеСтроки["Расширение"] = ".xml" Тогда
				ЯчейкаСКартинкой.Картинка = БиблиотекаКартинок.ПиктограммаФайла_XML;
			Иначе
				ЯчейкаСКартинкой.Картинка = БиблиотекаКартинок.ПиктограммаФайла_TXT;
			КонецЕсли;
		Исключение
		КонецПопытки;
			
	КонецЦикла;
	
КонецПроцедуры

Процедура ТаблицаВложенийПередНачаломДобавления(Элемент, Отказ, Копирование)
	Отказ = Истина;
КонецПроцедуры


Процедура ЗадачиПриПолученииДанных(Элемент, ОформленияСтрок)
	
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		Если ОформлениеСтроки.ДанныеСтроки.ИдентификаторПроекта > 0 Тогда
			ОформлениеСтроки.Шрифт = Новый Шрифт(,, Истина,);		
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

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

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



Процедура НаблюдателиПередНачаломДобавления(Элемент, Отказ, Копирование)
	Отказ = Истина;
КонецПроцедуры

Процедура ДопПоляПередНачаломДобавления(Элемент, Отказ, Копирование)
	Отказ = Истина;
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ИЗМЕНЕНИЯ РЕКВИЗИТОВ

Процедура ИдентификаторПроектаНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	ЗаполнитьСписокВыбораПроекта();
КонецПроцедуры

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

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

Процедура СтатусНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)             
	ДопВариантыПолей = Новый Массив;
	ДопВариантыПолей.Добавить("open");
	ДопВариантыПолей.Добавить("closed");
	ДопВариантыПолей.Добавить("*");
	ЗаполнитьСписокВыбораЭлементаФормы(ЭтаФорма, Элемент.Имя, "issue_statuses",, ДопВариантыПолей);
КонецПроцедуры


Процедура ПриоритетНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	ЗаполнитьСписокВыбораЭлементаФормы(ЭтаФорма, Элемент.Имя, "enumerations/issue_priorities", "issue_priorities");
КонецПроцедуры

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

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

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

Процедура ИдентификаторПравДоступаПриИзменении(Элемент)
	УстановитьЗаголовки();
КонецПроцедуры

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

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

	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

Процедура СерверПриИзменении(Элемент)
	
	Если Не ЗначениеЗаполнено(Порт) Тогда
		Порт = 80;
	КонецЕсли;
	
КонецПроцедуры


// Для отладки

// Отладка свертки панели описания задач
Процедура КоманднаяПанельНастройкиРазмеры(Кнопка)
	
	Сообщить("Панель - " + ЭлементыФормы.Панель.Высота + "
			|Командная панель - " + ЭлементыФормы.КоманднаяПанельСписокЗадач.Высота + "
			|Список задач - " + ЭлементыФормы.СписокЗадач.Высота + "
			|Разделитель - " + ЭлементыФормы.Разделитель7.Высота + "
			|Панель описание - " + ЭлементыФормы.ПанельОписание.Высота);
			
	ЭлементыФормы.ПанельОписание.Видимость = Ложь;
			
КонецПроцедуры


мСоздатьЗадачу = Ложь;
мРедактироватьЗадачу = Ложь;

мПоказыватьНастройки = Истина;

УспешнаяИнициализация = Истина;

СоответствиеИменПолей = Новый Соответствие;
// Общие поля
СоответствиеИменПолей.Вставить("Идентификатор",       "id");          
СоответствиеИменПолей.Вставить("Описание",            "description");          
// issues
СоответствиеИменПолей.Вставить("Автор",               "author");          
СоответствиеИменПолей.Вставить("Исполнитель",         "assigned_to");          
СоответствиеИменПолей.Вставить("НастраиваемыеПоля",   "custom_fields");          
СоответствиеИменПолей.Вставить("ПроцентВыполнения",   "done_ratio");          
СоответствиеИменПолей.Вставить("ОценкаВремени",		  "estimated_hours");          
СоответствиеИменПолей.Вставить("Приоритет",           "priority");          
СоответствиеИменПолей.Вставить("Проект",              "project");          
СоответствиеИменПолей.Вставить("ДатаНачала",          "start_date");          
СоответствиеИменПолей.Вставить("ДатаСоздания",        "created_on");          
СоответствиеИменПолей.Вставить("ДатаВыполнения",      "due_date");          
СоответствиеИменПолей.Вставить("Статус",              "status");          
СоответствиеИменПолей.Вставить("Тема",                "subject");          
СоответствиеИменПолей.Вставить("ПроектЗадача",        "subject");          
СоответствиеИменПолей.Вставить("Трекер",              "tracker");          
СоответствиеИменПолей.Вставить("НомерРодителя",       "parent");          
// projects
СоответствиеИменПолей.Вставить("НазваниеПроекта",     "name");          
// users
СоответствиеИменПолей.Вставить("Имя",                 "firstname");          
СоответствиеИменПолей.Вставить("Дата авторизации",    "last_login_on");          
СоответствиеИменПолей.Вставить("Фамилия",             "lastname");          
СоответствиеИменПолей.Вставить("Логин",               "login");          
СоответствиеИменПолей.Вставить("Почта",               "mail");
// custom_fields
СоответствиеИменПолей.Вставить("ИмяПоля",             "name");          
СоответствиеИменПолей.Вставить("ТипКастомизации",     "customized_type");          
СоответствиеИменПолей.Вставить("ФорматПоля",          "field_format");          
СоответствиеИменПолей.Вставить("МинДлина",            "min_length");          
СоответствиеИменПолей.Вставить("МаксДлина",           "max_length");
СоответствиеИменПолей.Вставить("ЗначениеПоУмолчанию", "default_value");
СоответствиеИменПолей.Вставить("Видимость",           "visible");
СоответствиеИменПолей.Вставить("Обязательный",        "is_required");
СоответствиеИменПолей.Вставить("Фильтруется",         "is_filter");
СоответствиеИменПолей.Вставить("УчаствуетВПоиске",    "searchable");

