Перем ЭтотРасширение;

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

Процедура ПолучитьАктуальнуюВерсиюОтложенно()
	
	Если ирКэш.НомерВерсииПлатформыЛкс() < 802018 Тогда
		// объект HTTPЗапрос недоступен
		Возврат;
	КонецЕсли; 
	НазваниеНаСайте = "Инструменты разработчика " + НазваниеВарианта + " 1С 8";
	ИмяСервера = ирКэш.АдресСайтаЛкс();
	Соединение = ирОбщий.HTTPСоединение(ИмяСервера);
	Запрос = Новый ("HTTPЗапрос");
	Запрос.АдресРесурса = "load/osnovnye/1";
	Попытка
		СтрокаОтвета = Соединение.Получить(Запрос);
	Исключение
		СтрокаОтвета = Неопределено;
	КонецПопытки; 
	Если СтрокаОтвета <> Неопределено Тогда
		ЧтениеHtml = Новый ЧтениеHTML;
		ЧтениеHtml.УстановитьСтроку(СтрокаОтвета.ПолучитьТелоКакСтроку());
		ПостроительDOM = Новый ПостроительDOM;
		ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
		УзлыФайлов = ДокументHTML.ПолучитьЭлементыПоИмени("a");
		Для Каждого УзелФайла Из УзлыФайлов Цикл
			ТекстовоеСодержимое = НРег(УзелФайла.ТекстовоеСодержимое);
			Если Найти(ТекстовоеСодержимое, НРег(НазваниеНаСайте)) > 0 Тогда
				ЭтаФорма.АктуальнаяВерсия = НазваниеВарианта + " " + Сред(ТекстовоеСодержимое, Найти(ТекстовоеСодержимое, "v") + 1);
				ЭтаФорма.СсылкаНаСтраницуСкачивания = УзелФайла.Гиперссылка;
				Прервать;
			КонецЕсли; 
		КонецЦикла;
	КонецЕсли;
	Если Истина
		И ЗначениеЗаполнено(АктуальнаяВерсия) 
		И Не ирОбщий.СтрокиРавныЛкс(ЭтаФорма.АктуальнаяВерсия, ИспользуемаяВерсия)
	Тогда
		ЭлементыФормы.КнопкаОбновить.ЦветТекстаКнопки = Новый Цвет(0, 0, 255);
		ЭлементыФормы.КнопкаОбновить.Доступность = Истина;
	КонецЕсли; 

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

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

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

Процедура Надпись2Нажатие(Элемент)
	
	ЗапуститьПриложение("http://" + ирКэш.АдресСайтаЛкс());
	
КонецПроцедуры

Процедура ОписаниеНаСайтеНажатие(Элемент)
	
	СтрокаОписания = ПолучитьСтрокуОписанияИнструмента();
	ЗапуститьПриложение("http://" + ирКэш.АдресСайтаЛкс() + "/" + СтрокаОписания.Описание);
	
КонецПроцедуры

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

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

Процедура Надпись5Нажатие(Элемент)
	
	ЗапуститьПриложение("mailto:tormozit@mail.ru?subject=Инструменты разработчика " + ИспользуемаяВерсия);
	
КонецПроцедуры

Процедура ПорядокОписанияПроблемНажатие(Элемент)
	
	ЗапуститьПриложение("http://devtool1c.ucoz.ru/forum/2-2-1");
	
КонецПроцедуры

Процедура ОбновитьНажатие(Элемент)
	
	ИмяСервера = ирКэш.АдресСайтаЛкс();
	Соединение = ирОбщий.HTTPСоединение(ИмяСервера);
	Запрос = Новый ("HTTPЗапрос");
	Запрос.АдресРесурса = СсылкаНаСтраницуСкачивания;
	СтрокаОтвета = Соединение.Получить(Запрос);
	СсылкаНаСкачивание = Неопределено;
	Если СтрокаОтвета <> Неопределено Тогда
		ЧтениеHtml = Новый ЧтениеHTML;
		ЧтениеHtml.УстановитьСтроку(СтрокаОтвета.ПолучитьТелоКакСтроку());
		ПостроительDOM = Новый ПостроительDOM;
		ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
		УзлыФайлов = ДокументHTML.ПолучитьЭлементыПоИмени("a");
		Для Каждого УзелФайла Из УзлыФайлов Цикл
			ТекстовоеСодержимое = НРег(УзелФайла.ТекстовоеСодержимое);
			Если Найти(ТекстовоеСодержимое, НРег("Скачать с сервера")) > 0 Тогда
				СсылкаНаСкачивание = УзелФайла.Гиперссылка;
				Прервать;
			КонецЕсли; 
		КонецЦикла;
	КонецЕсли;
	Если СсылкаНаСкачивание = Неопределено Тогда
		ВызватьИсключение "Ссылка на скачивание не найдена"; 
	КонецЕсли; 
	Запрос = Новый ("HTTPЗапрос");
	Запрос.АдресРесурса = СсылкаНаСкачивание;
	СтрокаОтвета = Соединение.Получить(Запрос);
	СсылкаНаСкачивание = СтрокаОтвета.Заголовки.Получить("Location");
	Запрос = Новый ("HTTPЗапрос");
	Запрос.АдресРесурса = ирОбщий.РазделитьURLЛкс(СсылкаНаСкачивание).ПутьКФайлуНаСервере;
	Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
		БазоваяФорма = ирПортативный.ПолучитьФорму();
		БазоваяФорма.Закрыть();
		Если БазоваяФорма.Открыта() Тогда 
			Возврат;
		КонецЕсли; 
		Ответ = Вопрос("При завершении обновления будет необходимо выполнить перезапуск клиентского приложения. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
		Если Ответ <> КодВозвратаДиалога.ОК Тогда
			Возврат;
		КонецЕсли;
		ИмяАрхиваСтаройВерсии = ирПортативный.мКаталогОбработки + "ИР_" + ИспользуемаяВерсия + ".zip";
		ИмяАрхиваНовойВерсии = ирПортативный.мКаталогОбработки + "ИР_" + АктуальнаяВерсия + ".zip";
		СоздатьКаталог(ирПортативный.мКаталогОбработки + "temp");
		СоздатьКаталог(ирПортативный.мКаталогОбработки + "temp\Модули");
		ирОбщий.СкопироватьФайлыЛкс(ирПортативный.мКаталогОбработки + "Модули", ирПортативный.мКаталогОбработки + "temp\Модули");
		КопироватьФайл(ирПортативный.мКаталогОбработки + "ирПортативный.epf", ирПортативный.мКаталогОбработки + "temp\ирПортативный.epf");
		АрхивированиеУспешно = Истина;
		Попытка
			ЗаписьZip = Новый ЗаписьZipФайла(ИмяАрхиваСтаройВерсии);
			ЗаписьZip.Добавить(ирПортативный.мКаталогОбработки + "temp\*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);
			ЗаписьZip.Записать();
		Исключение
			Сообщить(ОписаниеОшибки());
			АрхивированиеУспешно = Ложь;
		КонецПопытки;
		УдалитьФайлы(ирПортативный.мКаталогОбработки + "temp");
		Если АрхивированиеУспешно Тогда
			Предупреждение("Архивы старой и новой версии сохранены в каталоге """ + ирПортативный.мКаталогОбработки + """", 10);
		Иначе
			Ответ = Вопрос("При архивировании используемой версии возникла ошибка. Продолжить обновление?", РежимДиалогаВопрос.ОКОтмена);
			Если Ответ <> КодВозвратаДиалога.ОК Тогда
				Возврат;
			КонецЕсли;
		КонецЕсли; 
		СтрокаОтвета = Соединение.Получить(Запрос);
		ДвоичныеДанные = СтрокаОтвета.ПолучитьТелоКакДвоичныеДанные();
		ДвоичныеДанные.Записать(ИмяАрхиваНовойВерсии);
		ЧтениеZip = Новый ЧтениеZipФайла(ИмяАрхиваНовойВерсии);
		ЧтениеZip.ИзвлечьВсе(ирПортативный.мКаталогОбработки, РежимВосстановленияПутейФайловZIP.Восстанавливать);
		ЗавершитьРаботуСистемы(, Истина, "/Execute""" + ирПортативный.ИспользуемоеИмяФайла + """");
	ИначеЕсли ЭтотРасширение <> Неопределено Тогда 
		Ответ = Вопрос("При завершении обновления будет необходимо выполнить перезапуск клиентского приложения. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
		Если Ответ <> КодВозвратаДиалога.ОК Тогда
			Возврат;
		КонецЕсли;
		Каталог = ирОбщий.ВыбратьКаталогВФормеЛкс(,, "Выберите каталог для сохранения файлов старой и новой версий");
		Если Не ЗначениеЗаполнено(Каталог) Тогда
			Возврат;
		КонецЕсли; 
		СтрокаОтвета = Соединение.Получить(Запрос);
		ДвоичныеДанные = СтрокаОтвета.ПолучитьТелоКакДвоичныеДанные();
		ИмяФайлаСтаройВерсии = Каталог + "\ИР_" + ИспользуемаяВерсия + ".cfe";
		ИмяАрхиваНовойВерсии = Каталог + "\ИР_" + АктуальнаяВерсия + ".cfe";
		ДвоичныеДанные.Записать(ИмяАрхиваНовойВерсии);
		#Если Сервер И Не Сервер Тогда
		    ЭтотРасширение = РасширенияКонфигурации.Создать();
		#КонецЕсли
		ЭтотРасширение.ПолучитьДанные().Записать(ИмяФайлаСтаройВерсии);
		ЭтотРасширение.Записать(ДвоичныеДанные);
		ирОбщий.АдаптироватьРасширениеЛкс(Истина);
		//ЭтотРасширение.ПолучитьДанные().Записать(ИмяАрхиваНовойВерсии);
		ЗавершитьРаботуСистемы(, Истина);
	Иначе
		Каталог = ирОбщий.ВыбратьКаталогВФормеЛкс(,, "Выберите каталог для сохранения файла новой подсистемы");
		Если Не ЗначениеЗаполнено(Каталог) Тогда
			Возврат;
		КонецЕсли; 
		СтрокаОтвета = Соединение.Получить(Запрос);
		ДвоичныеДанные = СтрокаОтвета.ПолучитьТелоКакДвоичныеДанные();
		ИмяФайла = Каталог + "\Инструменты разработчика " + АктуальнаяВерсия + ".cf";
		ДвоичныеДанные.Записать(ИмяФайла);
		Сообщить("Теперь выполните объединение конфигурации базы с """ + ИмяФайла + """");
	КонецЕсли; 
	
КонецПроцедуры

Процедура ИнформацияДляТехническойПоддержкиНажатие(Элемент)
	
	Текст = ИнформацияДляТехническойПоддержки();
	ирОбщий.ОткрытьТекстЛкс(Текст, "Информация для технической поддержки");
	
КонецПроцедуры

Функция ИнформацияДляТехническойПоддержки()
	
	Если Метаданные.РегистрыСведений.Найти("ВерсииПодсистем") <> Неопределено Тогда
		Запрос = Новый Запрос;
		Запрос.Текст = "
		|ВЫБРАТЬ
		|	ВерсииПодсистем.Версия КАК Версия
		|ИЗ
		|	РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем
		|ГДЕ
		|	ВерсииПодсистем.ИмяПодсистемы = &ИмяПодсистемы
		|";
		Запрос.УстановитьПараметр("ИмяПодсистемы", "СтандартныеПодсистемы");
		Таблица = Запрос.Выполнить().Выгрузить();
		Если Таблица.Количество() > 0 Тогда
			ВерсияБСП = Таблица[0].Версия;
		КонецЕсли; 
	КонецЕсли; 
	
	// Системный вариант
	//Платформа: 1С:Предприятие 8.3 (8.3.9.2033)
	//Конфигурация: Комплексная автоматизация, редакция 1.1 (1.1.20.1) (http://v8.1c.ru/ka/)
	//Copyright (С) ООО "1C", 2010-2012. Все права защищены
	//(http://www.1c.ru/)
	//Режим: Файловый (без сжатия)
	//Приложение: Тонкий клиент
	//Локализация: Информационная база: русский (Россия), Сеанс: русский (Россия)
	//Вариант интерфейса: Такси
	
	ВК = ирКэш.ВКОбщая();
	СистемнаяИнформация = Новый СистемнаяИнформация;
	Текст = 
	"Платформа: " + СистемнаяИнформация.ВерсияПриложения + "
	|Режим БД: " + ?(ирКэш.ЭтоФайловаяБазаЛкс(), "файловый", "клиент-серверный") + "
	|Конфигурация. Название: " + Метаданные.Синоним + " (" + Метаданные.Версия + ")
	|Конфигурация. Основной режим запуска: " + Метаданные.ОсновнойРежимЗапуска + "
	|Конфигурация. Режим совместимости: " + Метаданные.РежимСовместимости;
	Если ЗначениеЗаполнено(ВерсияБСП) Тогда
		Текст = Текст + "
		|Конфигурация. Версия БСП: " + ВерсияБСП;
	КонецЕсли; 
	Текст = Текст + "
	|Инструменты разработчика: " + ИспользуемаяВерсия + "
	|Клиент. ОС: " + СистемнаяИнформация.ТипПлатформы + " " + СистемнаяИнформация.ВерсияОС + "
	|Клиент. Приложение: " + ТекущийРежимЗапуска() + " " + ?(ирКэш.Это64битныйПроцессЛкс(), "64б", "32б") + "
	|Клиент. От имени администратора Windows: " + ВК.IsAdmin();
	Если Не ирКэш.ЭтоФайловаяБазаЛкс() Тогда
		Текст = Текст + Символы.ПС + ирСервер.ИнфоСервераПриложений();
	КонецЕсли; 
	Возврат Текст;

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

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