Перем мЧистыйЗаголовокФормы;
Перем мИндикатор;

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

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

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

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

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

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

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

Процедура ДействияФормыЗагрузить(Кнопка = Неопределено)
	Если ирКэш.НомерВерсииПлатформыЛкс() < 802018 Тогда
		// объект HTTPЗапрос недоступен
		Возврат;
	КонецЕсли;
	Если Кнопка <> Неопределено Или ЗадачиПодсистемы.Количество() = 0 Тогда
		ЗагрузитьЗадачи();
	КонецЕсли;
КонецПроцедуры

Процедура ЗагрузитьЗадачи() Экспорт
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("zip");
	Ответ = ирОбщий.ЗапроситьХТТПЛкс("https://devtool1c.ucoz.ru/load/0-0-0-29-20");
	Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ИмяВременногоФайла);
	СыраяТаблица = ирОбщий.ЗагрузитьЗначениеИзФайлаЛкс(ИмяВременногоФайла,, "Внутр");
	УдалитьФайлы(ИмяВременногоФайла);
	ЗадачиПодсистемы.Загрузить(СыраяТаблица);
	ЗаполнитьДанныеПоиска();                 
	ЭлементыФормы.НадписьДатаАктуальности.Заголовок = "Актуальность снимка: " + Формат(ирОбщий.ЛучшиеЭлементыКоллекцииЛкс(ЗадачиПодсистемы, "Обновлено").Обновлено, "ДЛФ=DT");
	ПерваяЗадачаИспользуемойВерсии = ЗадачиПодсистемы.НайтиСтроки(Новый Структура("ВерсияПодсистемы", ИспользуемаяВерсия));
	Если ПерваяЗадачаИспользуемойВерсии.Количество() Тогда
		ЭлементыФормы.ЗадачиПодсистемы.ТекущаяСтрока = ПерваяЗадачаИспользуемойВерсии[0];
	КонецЕсли;
	ЭтаФорма.КоличествоЭлементов = СыраяТаблица.Количество();
	Если НомерИспользуемойВерсии() < ЗадачиПодсистемы[0].ВерсияЧисло Тогда
		ЭтаФорма.ОтборВерсий = "больше";
		ВерсииПриИзменении();
	КонецЕсли;
КонецПроцедуры

Функция БазовыйАдресРепозитория(Знач Репозиторий) Экспорт
	БазоваяСсылка = "https://api.github.com/repos/" + Репозиторий;
	Возврат БазоваяСсылка;
КонецФункции

Процедура ЗаявкиВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	НомерЗадачи = XMLСтрока(ВыбраннаяСтрока.Номер);
	Если Колонка = Элемент.Колонки.Ссылка Тогда
		ЗапуститьПриложение("http://www.hostedredmine.com/issues/" + НомерЗадачи); // https специально убрал, чтобы увеличить шанс обхода блокировок https://github.com/tormozit/RDT1C/issues/818
	Иначе
		ТекстЗадачи = ВыбраннаяСтрока.Описание;
		Попытка
			Ответ = ирОбщий.ЗапроситьХТТПЛкс("https://www.hostedredmine.com/issues/"+НомерЗадачи+".json?include=attachments",,, 2); 
			ТекстЖСОН = Ответ.ПолучитьТелоКакСтроку(); // см. ТекстЖСОНОбразец
			СтруктураЗадачи = ирОбщий.ОбъектИзТекстаЖСОНЛкс(ТекстЖСОН);
			Для Каждого Вложение Из СтруктураЗадачи.issue.attachments Цикл
				ТекстЗадачи = СтрЗаменить(ТекстЗадачи, "!" + Вложение.filename + "!", "![]("+Вложение.content_url+")");
			КонецЦикла;
		Исключение
			ирОбщий.СообщитьЛкс("Ошибка загрузки картинок: " + ОписаниеОшибки());
		КонецПопытки;
		ирКлиент.ОткрытьТекстЛкс(ТекстЗадачи, ВыбраннаяСтрока.Заголовок, "Markdown", Истина,,,,,, ЗадачиПодсистемыСтрокаПоиска);
	КонецЕсли;
КонецПроцедуры

Функция ТекстЖСОНОбразец()
	Возврат 
	"{
	|  ""issue"": {
	|    ""id"": 1007610,
	|    ""project"": {
	|      ""id"": 55589,
	|      ""name"": ""Инструменты разработчика Tormozit для 1С""
	|    },
	|    ""tracker"": {
	|      ""id"": 1,
	|      ""name"": ""Bug""
	|    },
	|    ""status"": {
	|      ""id"": 5,
	|      ""name"": ""Closed""
	|    },
	|    ""priority"": {
	|      ""id"": 4,
	|      ""name"": ""Normal""
	|    },
	|    ""author"": {
	|      ""id"": 109519,
	|      ""name"": ""Сергей Старых""
	|    },
	|    ""category"": {
	|      ""id"": 25972,
	|      ""name"": ""Поле текста программы""
	|    },
	|    ""fixed_version"": {
	|      ""id"": 20220,
	|      ""name"": ""8.02.1""
	|    },
	|    ""subject"": ""Восстановлено заполнение списка автодополнения встроенными функциями и функциями модулей языка выражений компоновки данных"",
	|    ""description"": ""Стало:\r\n\r\n!clipboard-202511210816-gsgdd.png!\r\n\r\n!clipboard-202511210839-lvj3y.png!\r\n"",
	|    ""start_date"": null,
	|    ""due_date"": null,
	|    ""done_ratio"": 0,
	|    ""is_private"": false,
	|    ""estimated_hours"": null,
	|    ""total_estimated_hours"": null,
	|    ""created_on"": ""2025-11-21T05:17:02Z"",
	|    ""updated_on"": ""2025-11-23T18:01:24Z"",
	|    ""closed_on"": ""2025-11-21T05:17:02Z"",
	|    ""attachments"": [
	|      {
	|        ""id"": 3689079,
	|        ""filename"": ""clipboard-202511210816-gsgdd.png"",
	|        ""filesize"": 20940,
	|        ""content_type"": ""image/png"",
	|        ""description"": """",
	|        ""content_url"": ""https://www.hostedredmine.com/attachments/download/3689079/clipboard-202511210816-gsgdd.png"",
	|        ""thumbnail_url"": ""https://www.hostedredmine.com/attachments/thumbnail/3689079"",
	|        ""author"": {
	|          ""id"": 109519,
	|          ""name"": ""Сергей Старых""
	|        },
	|        ""created_on"": ""2025-11-21T05:16:54Z""
	|      },
	|      {
	|        ""id"": 3689089,
	|        ""filename"": ""clipboard-202511210839-lvj3y.png"",
	|        ""filesize"": 21499,
	|        ""content_type"": ""image/png"",
	|        ""description"": """",
	|        ""content_url"": ""https://www.hostedredmine.com/attachments/download/3689089/clipboard-202511210839-lvj3y.png"",
	|        ""thumbnail_url"": ""https://www.hostedredmine.com/attachments/thumbnail/3689089"",
	|        ""author"": {
	|          ""id"": 109519,
	|          ""name"": ""Сергей Старых""
	|        },
	|        ""created_on"": ""2025-11-21T05:39:55Z""
	|      }
	|    ]
	|  }
	|}";
КонецФункции

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

Процедура ЗаполнитьДанныеПоиска() Экспорт
	Для Сч=1 По 2 Цикл
		ИмяКолонки = "ДанныеПоиска" + Сч;
		Для Каждого СписокЭлемент Из ЗадачиПодсистемы.НайтиСтроки(Новый Структура(ИмяКолонки, "")) Цикл
			СписокЭлемент[ИмяКолонки] = СписокЭлемент.Заголовок + " " + СписокЭлемент.Описание;
		КонецЦикла;
	КонецЦикла;
	ЭтаФорма.КоличествоЭлементов = ЗадачиПодсистемы.Количество();
КонецПроцедуры

Процедура ЗаявкиПриАктивизацииСтроки(Элемент)
	ирКлиент.ТабличноеПолеПриАктивизацииСтрокиЛкс(ЭтаФорма, Элемент);
КонецПроцедуры

Процедура ЗаявкиПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	ОформлениеСтроки.Ячейки.Ссылка.УстановитьТекст("http://www.hostedredmine.com/issues/" + XMLСтрока(ДанныеСтроки.Номер));
	Если ДанныеСтроки.Приоритет = "High" Тогда
		ОформлениеСтроки.ЦветФона = ирОбщий.ЦветФонаОшибкиЛкс();
	КонецЕсли;
	ирКлиент.ТабличноеПолеПриВыводеСтрокиЛкс(ЭтаФорма, Элемент, ОформлениеСтроки, ДанныеСтроки);
КонецПроцедуры

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

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

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

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

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

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

Функция НомерИспользуемойВерсии() Экспорт
	Значение = ИспользуемаяВерсия;
	Значение = СтрЗаменить(Значение, ".", "");
	Значение = СтрЗаменить(Значение, "e", "");
	Значение = СтрЗаменить(Значение, "p", "");	
	Результат = Число(Значение);
	Возврат Результат;
КонецФункции

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

Процедура ДействияФормыНайтиПоСсылке(Кнопка)
	Ссылка = ирКлиент.ТекстИзБуфераОбменаОСЛкс();
	Если Ложь
		Или СтрДлина(Ссылка) > 100
		Или Не ирОбщий.ЛиЦифраЛкс(Прав(Ссылка, 1))
	Тогда
		Ссылка = "";
	КонецЕсли;
	Если ВвестиЗначение(Ссылка, "Введите ссылку или номер задачи с сайта www.hostedredmine.com") Тогда
		НомерЗадачиТекст = ирОбщий.ПоследнийФрагментЛкс(Ссылка, "/");
		Попытка
			НомерЗадачиЧисло = Число(НомерЗадачиТекст);
		Исключение
			Возврат;
		КонецПопытки;
		Найденное = ЗадачиПодсистемы.Найти(НомерЗадачиЧисло, "Номер");
		Если Найденное <> Неопределено Тогда
			ЭлементыФормы.ЗадачиПодсистемы.ТекущаяСтрока = Найденное;
			ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ЗадачиПодсистемы;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

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