gifts2017

Скрипт автообновления типовых конфигураций

Опубликовал Sergey Фамилия (sergey279) в раздел Программирование - Практика программирования

Батник на "языке 1С" для клиент серверных баз, скачивает с сайта ИТС нужное обновление, бекапит базу и обновляет. На что-то новое не претендует, как рабочая заготовка для собственных "обновляторов" подойдет. В текущем виде все работает. Надо только занести свои переменные.

Химера из двух работ

Скрипт для автоматического обновления баз 1С (загрузка с сайта, применение и др)

http://infostart.ru/public/241253/

И

Как решать повседневные задачи с помощью OneScript

http://infostart.ru/public/327581/


----
В итоге Батник на "языке 1С" для клиент серверных баз, скачивает с сайта ИТС нужное обновление, бекапит базу и обновляет. Подойдет как рабочая заготовка для собственных "обновляторов". В текущем виде все работает. Надо только занести свои переменные.
 

// 	Путь к обновлениям
Перем мРасположениеОбновлений;

//Параметры для подключения к серверу обновления 1С
Перем мИтсЛогин;
Перем мИтсПароль;

//****
Перем home;
Перем DumpIB;

Перем ФайлСписокОбновленийZIP;
Перем ФайлСписокОбновленийXML;

Перем КодВозврата;

// Проверка существования файла или каталога.
//
// Параметр:
//  ПутьКФайлу   - Строка - путь к файлу или каталогу, существование которого
//                 нужно проверить.
//
// Возвращаемое значение:
//  Булево - признак существования файла или каталога.
//
Функция ФайлСуществует(Знач ПутьКФайлу) Экспорт
	
	Файл = Новый Файл(ПутьКФайлу);
	Возврат Файл.Существует();
	
КонецФункции 

Процедура УстановитьКонстанты()
	каталог_tmplts = "D:\tmplts";
 	мИтсЛогин = "---";
	мИтсПароль = "---";
	
	//**Ниже можно не менять.
	мРасположениеОбновлений = каталог_tmplts + "\1c";
	home = каталог_tmplts + "\1Cupdate";
	DumpIB = home + "\DumpIB\";
	ФайлСписокОбновленийXML = home + "\v8cscdsc.xml";
	ФайлСписокОбновленийZIP = home + "\v8upd11.zip";
	
	Если НЕ ФайлСуществует(home) Тогда
		СоздатьКаталог(home); 
	КонецЕсли;
	
	Если НЕ ФайлСуществует(DumpIB) Тогда
		СоздатьКаталог(DumpIB); 
	КонецЕсли;
	
	Если НЕ ФайлСуществует(мРасположениеОбновлений) Тогда
		СоздатьКаталог(мРасположениеОбновлений); 
	КонецЕсли;

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

Функция ВернутьРелизИПлатформу(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль)

   ПараметрыБазы = Неопределено;
 
   Попытка
        //Создаем COM-объект с идентификатором V82.COMConnector
        COMОбъект = Новый COMОбъект("V"+мВерсияПлатформы+".COMConnector");   //выйдет V82.COMConnector
   Исключение
        Сообщить("Не удалось создать COM-объект!");    
        Возврат ПараметрыБазы;
   КонецПопытки; 

    ПутьКБазе = "srvr="""+ СокрЛП(мИмяСервера) +""";" + "ref=""" + СокрЛП(мИмяБазы)  +""";";    

	СтрокаСоединения = ПутьКБазе + "Usr="""+ СокрЛП(мБазаЛогин) +""";" + "Pwd="""+ СокрЛП(мБазаПароль) + """;";    
 
	 Попытка
        //Устанавливаем внешнее соединение с информационной базой через COM-соединение
        V82 = COMОбъект.Connect(СтрокаСоединения);
    Исключение
    	Сообщить(СтрокаСоединения);
        Сообщить("Внешнее соединение не установлено!");    
        Возврат ПараметрыБазы;
    КонецПопытки;

	 ПараметрыБазы = Новый Структура;
	 ПараметрыБазы.Вставить("ТекущаяВерсия", v82.Метаданные.Версия);
	 ПараметрыБазы.Вставить("ПутьКПлатформе",v82.КаталогПрограммы() + "1cv8.exe");

	 Возврат ПараметрыБазы;
КонецФункции

Процедура УстановитьCOMСоединение(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль) 
   Попытка
        //Создаем COM-объект с идентификатором V82.COMConnector
        COMОбъект = Новый COMОбъект("V"+мВерсияПлатформы+".COMConnector");   //выйдет V82.COMConnector
   Исключение
        Сообщить("Не удалось создать COM-объект!");    
        Возврат;
   КонецПопытки; 

    //Инициализируем строку подключения к информационной базе:    
 //   Если ФайловаяИБ Тогда
        //Файловый вариант 
   //     ПутьКБазе = "File="""+ СокрЛП(КаталогИБ) +""";";
//    Иначе
        //Серверных вариант    
        ПутьКБазе = "srvr="""+ СокрЛП(мИмяСервера) +""";"+
               "ref=""" + СокрЛП(мИмяБазы)  +""";";    
//    КонецЕсли;
                
    СтрокаСоединения = ПутьКБазе +
            "Usr="""+ СокрЛП(мБазаЛогин) +""";"+
            "Pwd="""+ СокрЛП(мБазаПароль) +""";";    
        Сообщить(СтрокаСоединения);         
    Попытка
        //Устанавливаем внешнее соединение с информационной базой через COM-соединение
        V82 = COMОбъект.Connect(СтрокаСоединения);
    Исключение
    	Сообщить(СтрокаСоединения);
        Сообщить("Внешнее соединение не установлено!");    
        Возврат;
    КонецПопытки;
             
КонецПроцедуры

		
		
		
// Загрузка списка обновлений из файла XML
// Достаем из XML файла, наибольший номер возможного обновления
Функция ВыполнитьЗагрузкуСпискаОбновлений(ИмяФайлаЗагрузки,ТекущаяВерсияКонфигурации)
	
	СообщениеОбОшибке = "Ошибка при чтении файла списка обновлений.";
	
	Если НЕ ФайлСуществует(ИмяФайлаЗагрузки) Тогда
		Сообщить("Нету XML файла (списка обновлений)");
		Возврат Неопределено;
	КонецЕсли;
	
	ВерсияДляОбновления = Неопределено;
	Попытка
//		ТаблицаЗначений = Новый ТаблицаЗначений;		
//		ТаблицаЗначений.Колонки.Добавить("Конфигурация",          Тип("Строка"));
//		ТаблицаЗначений.Колонки.Добавить("Поставщик",             Тип("Строка"));
//		ТаблицаЗначений.Колонки.Добавить("Версия",                Тип("Строка"));
//		ТаблицаЗначений.Колонки.Добавить("ВерсияДляОбновления",   Тип("Строка"));
//		ТаблицаЗначений.Колонки.Добавить("ПутьКФайлуОбновления",  Тип("Строка"));
//		ТаблицаЗначений.Колонки.Добавить("РазмерФайлаОбновления", Тип("Число"));
		
		ЧтениеXML = Новый ЧтениеXML;
		ЧтениеXML.ОткрытьФайл(ИмяФайлаЗагрузки);
		ЧтениеXML.Прочитать(); // <?xml version="1.0" encoding="UTF-8" ?> 
		
		// Дата формирования файла.
		ЧтениеXML.Прочитать();
		ЧтениеXML.Прочитать();
		ДатаФормирования = ЧтениеXML.Значение;
		ЧтениеXML.Прочитать();
		// Читаем начало элемента Update или конец элемента UpdateList.
		Пока ЧтениеXML.Прочитать() Цикл
			
			Если ЧтениеXML.Имя = "v8u:updateList" Тогда
				Прервать;					
			Иначе		
				
				Конфигурация = ЧтениеXML.ПолучитьАтрибут("configuration");
				
				Пока ЧтениеXML.Прочитать() Цикл
					
					Если ЧтениеXML.Имя = "v8u:update" Тогда
						Прервать;					
					Иначе		
						
						Если ЧтениеXML.Имя = "v8u:vendor" Тогда
							ЧтениеXML.Прочитать();
							Поставщик = ЧтениеXML.Значение;							
						ИначеЕсли ЧтениеXML.Имя = "v8u:version" Тогда
							ЧтениеXML.Прочитать();
							Версия = ЧтениеXML.Значение;
						ИначеЕсли ЧтениеXML.Имя = "v8u:file" Тогда
							ЧтениеXML.Прочитать();
							ПутьКФайлуОбновления = ЧтениеXML.Значение;
						ИначеЕсли ЧтениеXML.Имя = "v8u:size" Тогда
							ЧтениеXML.Прочитать();
							РазмерФайлаОбновления = ЧтениеXML.Значение;
						ИначеЕсли ЧтениеXML.Имя = "v8u:target" Тогда
							ЧтениеXML.Прочитать();
						//	НоваяСтрока = ТаблицаЗначений.Добавить();
						//	НоваяСтрока.Конфигурация          = Конфигурация;
						//	НоваяСтрока.Поставщик             = Поставщик;
						//	НоваяСтрока.Версия                = Версия;
						//	НоваяСтрока.ВерсияДляОбновления	  = ЧтениеXML.Значение;
						//	НоваяСтрока.ПутьКФайлуОбновления  = ПутьКФайлуОбновления;
						//	НоваяСтрока.РазмерФайлаОбновления = РазмерФайлаОбновления;
							Если ЧтениеXML.Значение = ТекущаяВерсияКонфигурации Тогда   //279 Новые в конце. на последнюю полученную и будем обновяться
								ВерсияДляОбновления = Версия;
							КонецЕсли;
						КонецЕсли;
						
						ЧтениеXML.Прочитать();
						
					КонецЕсли;
					
				КонецЦикла;
				
			КонецЕсли;
			
		КонецЦикла;
		
	Исключение
		Сообщить(СообщениеОбОшибке);
		ЧтениеXML.Закрыть();
		Возврат Неопределено;
		
	КонецПопытки;
	//Возврат ТаблицаЗначений;	
	ЧтениеXML.Закрыть();
	Возврат ВерсияДляОбновления;
	
КонецФункции // ВыполнитьЗагрузкуСпискаОбновлений()


//Входящие Сервер - База - ТипКонфигурации - ВерсияРелиза - ВерсияПлатформы-ИТС логин и пароль необязательно
Процедура ПроверитьОбновлениеКонфигурации(мИмяСервера,мИмяБазы,мТипКонфигурации,мВерсияРелиза,мВерсияПлатформы,мБазаЛогин,мБазаПароль)	
	Сообщить("----------------------------------------------------------------------");
	//удалить старые файлы
	УдалитьФайлы(ФайлСписокОбновленийXML);
	УдалитьФайлы(ФайлСписокОбновленийZIP);	

	// Качаем v8cscdsc.xml в виде v8upd11.zip	
	// Создание HTTP-соединения с сервером обновлений
	СерверОбновлений = Новый HTTPСоединение("downloads.1c.ru",,мИтсЛогин,мИтсПароль,);
	ЗапросКСерверуОбновлений = Новый HTTPЗапрос("/ipp/ITSREPV/V8Update/Configs/"+мТипКонфигурации+"/"+мВерсияРелиза+"/"+мВерсияПлатформы+"/v8upd11.zip");
	СерверОбновлений.Получить(ЗапросКСерверуОбновлений,ФайлСписокОбновленийZIP);

	// Распаковываем v8cscdsc.xml
	ФайлZip = Новый ЧтениеZipФайла(ФайлСписокОбновленийZIP); 
	ФайлZip.ИзвлечьВсе(home);
	ФайлZip.Закрыть();
	УдалитьФайлы(ФайлСписокОбновленийZIP);
	
	//+++++ Запрос версии конфигурации базы...
		ПараметрыComБазы = ВернутьРелизИПлатформу(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль);
		
		Если ПараметрыComБазы = Неопределено Тогда 
			Возврат; 
		КонецЕсли;
		ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений(ФайлСписокОбновленийXML,ПараметрыComБазы.ТекущаяВерсия);
		ТребуетсяОбновление = Ложь;
		Если ВерсияДляОбновления = Неопределено Тогда 
			Сообщить(мИмяБазы + " ver: " +ПараметрыComБазы.ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ");
			Возврат;
		КонецЕсли;
		Сообщить(мИмяБазы + " ver: " +ПараметрыComБазы.ТекущаяВерсия+ " update: " + ВерсияДляОбновления);
	//----- Запрос версии конфигурации базы...
	
	КомандаПакетногоАрхивирования = """" + ПараметрыComБазы.ПутьКПлатформе +""""+" CONFIG /S"+мИмяСервера+"\"+мИмяБазы+" /N"""+мБазаЛогин+""" /P"""+мБазаПароль+""" /DumpIB "+DumpIB + мИмяБазы + ".dt /OUT """+home+"\"+мИмяБазы+".log"" -NoTruncate";
	//NoTruncate - не очищать логи 
	//Сообщить(КомандаПакетногоАрхивирования);
	ЗапуститьПриложение(КомандаПакетногоАрхивирования,,Истина,КодВозврата);
	Если КодВозврата = 0  Тогда
		Сообщить("Резервная копия успешно создана.");
	Иначе
		Сообщить("Ошибка при создании резервной копии");
		Возврат;
	КонецЕсли;
	
	Версия_Для_Обновления = СтрЗаменить(ВерсияДляОбновления, ".", "_"); //в каталоге шаблонов через подчеркивание храняться

	//качаем новую версию, если уже не скачено
	Если НЕ ФайлСуществует(мРасположениеОбновлений +"\"+мТипКонфигурации+"\"+Версия_Для_Обновления+"\") Тогда
		//качаем новую
		// Создание HTTP-соединения с сервером обновлений
	    Заголовки = Новый Соответствие();
	    Заголовки.Вставить("User-Agent", "1C+Enterprise/8.2");     //без заголовка сайт не даст скачать.
		СерверОбновлений = Новый HTTPСоединение("downloads.v8.1c.ru",,мИтсЛогин,мИтсПароль,);
		СтрокаЗапросHTTP = "/tmplts/1c/"+мТипКонфигурации+"/"+ Версия_Для_Обновления +"/1cv8.zip";
		Сообщить(СтрокаЗапросHTTP);
		ЗапросКСерверуОбновлений = Новый HTTPЗапрос(СтрокаЗапросHTTP,Заголовки);
		СерверОбновлений.Получить(ЗапросКСерверуОбновлений, мРасположениеОбновлений+"\1cv8.zip");
		
		ФайлZip = Новый ЧтениеZipФайла(мРасположениеОбновлений+"\1cv8.zip"); 
		ФайлZip.ИзвлечьВсе(мРасположениеОбновлений+"\"+мТипКонфигурации+"\"+Версия_Для_Обновления);
		ФайлZip.Закрыть();
		
		УдалитьФайлы(мРасположениеОбновлений+"\1cv8.zip");
	КонецЕсли;
	//запускаем обновление                                                                                                                                                              
	КомандаПакетногоОбновления = """" + ПараметрыComБазы.ПутьКПлатформе +""""+" CONFIG /S"+мИмяСервера+"\"+мИмяБазы+" /N"""+мБазаЛогин+""" /P"""+мБазаПароль+""" /UpdateCfg "+мРасположениеОбновлений+"\"+мТипКонфигурации+"\"+Версия_Для_Обновления + "\1cv8.cfu /UpdateDBCfg /OUT """+home+"\"+мИмяБазы+".log"" -NoTruncate";
	//Сообщить(КомандаПакетногоОбновления);
	ЗапуститьПриложение(КомандаПакетногоОбновления,,Истина,КодВозврата);
	Если КодВозврата = 0 Тогда
		Сообщить("База Успешно обновлена");
	Иначе
		Сообщить("ОШИБКА ПРИ ОБНОВЛЕНИИ");
		Возврат;
	КонецЕсли;
	
	//Еще разок запрос версии
	//+++++ Запрос версии конфигурации базы...
		ПараметрыComБазы = ВернутьРелизИПлатформу(мИмяСервера,мИмяБазы,мВерсияПлатформы,мБазаЛогин,мБазаПароль);
		
		Если ПараметрыComБазы = Неопределено Тогда 
			Возврат; 
		КонецЕсли;
		ВерсияДляОбновления = ВыполнитьЗагрузкуСпискаОбновлений(ФайлСписокОбновленийXML,ПараметрыComБазы.ТекущаяВерсия);
		ТребуетсяОбновление = Ложь;
		Если ВерсияДляОбновления = Неопределено Тогда 
			Сообщить(мИмяБазы + " ver: " +ПараметрыComБазы.ТекущаяВерсия+ " ОБНОВЛЕНИЕ НЕ ТРЕБУЕТСЯ");
			Возврат;
		КонецЕсли;
		Сообщить(мИмяБазы + " ver: " +ПараметрыComБазы.ТекущаяВерсия+ " update: " + ВерсияДляОбновления);
	//----- Запрос версии конфигурации базы...

КонецПроцедуры
		
УстановитьКонстанты();
//ОСНОВНЫЕ

//ЗУП 2.5
ПроверитьОбновлениеКонфигурации("ka1sql1:1641","up_el","HRM","25","82","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1641","up_spb","HRM","25","82","Администратор","Администратор");


//БП 3.0
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_domx","Accounting","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_el","Accounting","30","83","Администратор","Администратор");

//СВЕТЛАНЫ
//БП 3.0
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_ip","Accounting","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_guild","Accounting","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_lebedeva","Accounting","30","83","Администратор","Администратор");
//ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_service","AccountingBase","30","83","Администратор","Администратор");
ПроверитьОбновлениеКонфигурации("ka1sql1:1741","bp_porsche","Accounting","30","83","Администратор","Администратор");

//ЗУП 2.5
ПроверитьОбновлениеКонфигурации("ka1sql1:1641","up_service","HRM","25","82","Администратор","Администратор");

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Владимир Безфамильный (Vovan1975) 07.07.16 10:35
2. Sergey Фамилия (sergey279) 07.07.16 10:57
(1) Vovan1975, "самозанятый" бухгалтер, повышенной производительности =)
3. Павел Антонов (Seregio22) 07.07.16 13:54
{Форма.Форма.Форма(261)}: Ошибка при вызове конструктора (ЧтениеZipФайла)
ФайлZip = Новый ЧтениеZipФайла(ФайлСписокОбновленийZIP);
по причине:
Некорректный формат файла: ...\1Cupdate\v8upd11.zip

Скаченный файл (1 кб) имеет следующий текст:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /tmplts/ipp/ITSREPV/V8Update/Configs/HRM/25/82/v8upd11.zip was not found on this server.</p>
</body></html>
4. Sergey Фамилия (sergey279) 07.07.16 16:45
(3) Seregio22, щас попробую потестить без паролей и с заблоченым сервером обновлений.
так то пишет что zip распокавать не выходит т.к. не скачался.
5. Павел Антонов (Seregio22) 07.07.16 16:55
(4) sergey279,
дописал строки ниже так:
//НЕ СКАЧИВАЕТСЯ. ЭТО АЛЬТЕРНАТИВА
СерверОбновлений = Новый HTTPСоединение("downloads.1c.ru");
ЗапросКСерверуОбновлений = Новый HTTPЗапрос("ipp/ITSREPV/V8Update/Configs/"+мТипКонфигурации+"/"+мВерсия­Релиза+"/"+мВерсияПлатформы+"/v8upd11.zip");
СерверОбновлений.Получить(ЗапросКСерверуОбновлений,ФайлСписокОбновленийZIP);

вроде есть контакт :)
6. Sergey Фамилия (sergey279) 07.07.16 16:57
(4) sergey279, без всяких паролей наличие номера новых релизов должно скачивать.
щас проверю засунув в форму 1с . сам текст под OneScript использую.
7. Вадик Лавин (LavinVadik) 07.07.16 17:33
идея хороша.но имхо утопия.
8. Sergey Фамилия (sergey279) 07.07.16 17:37
(5) Seregio22, спс, тоже отловил . в OneScript и с "/tmplts" работает, видать просто игнорирует.
а в 1с хоть в отладчике и игнорирует (видно сервер соединения только "downloads.1c.ru") ,а отрабатывает как будто с этим излишком.

СерверОбновлений = Новый HTTPСоединение("downloads.1c.ru",,мИтсЛогин,мИтсПароль,);
//было СерверОбновлений = Новый HTTPСоединение("downloads.1c.ru/tmplts",,мИтсЛогин,мИтсПароль,);

в тексте сейчас исправлю, благодарю.
9. Алексей (Drak0n) 08.07.16 10:29
Объединил текст из данной публикации со своим. Из основных отличий:
1. Загрузка списка обновлений 1 раз для семейства
2. Обновление через несколько релизов
3. Преимущественное обновление на уже скачанные релизы
4. Ну и по мелочи
Получилось вот что:

PS Если автор не против могу выложить отдельной темой

Перем КаталогВременныхФайлов;

Перем НастройкаСоединения;
Перем ПараметрыОбновления;
Перем ПараметрыПротоколирования;

Перем КодВозврата;

// Устанавливает значение констант.
//
// Возвращаемое значение:
//  Булево - признак успешной установки.
//
Функция УстановитьКонстанты()
    
    НастройкаСоединения = Новый Структура();
    НастройкаСоединения.Вставить("Пользователь", "---");
    НастройкаСоединения.Вставить("Пароль",       "---");
    
    Каталог_tmplts = "\\server\H\Дистрибутивы\Конфигурация";
    
    КаталогВременныхФайлов = Каталог_tmplts + "\1Cv8Update"; 
    Если НЕ ПроверитьСоздатьКаталог(КаталогВременныхФайлов) Тогда Возврат Ложь; КонецЕсли;
    
    ПараметрыПротоколирования = Новый Структура();
    ПараметрыПротоколирования.Вставить("КаталогФайловЛогов", КаталогВременныхФайлов + "\Logs");
    Если НЕ ПроверитьСоздатьКаталог(ПараметрыПротоколирования.КаталогФайловЛогов) Тогда Возврат Ложь; КонецЕсли;
    ПараметрыПротоколирования.Вставить("КаталогФайловДампа", КаталогВременныхФайлов + "\DumpIB");
    Если НЕ ПроверитьСоздатьКаталог(ПараметрыПротоколирования.КаталогФайловДампа) Тогда Возврат Ложь; КонецЕсли;
    
    ПараметрыОбновления = Новый Структура();
    ПараметрыОбновления.Вставить("ИмяZipФайлаСпискаШаблонов", "v8upd11.zip");
    ПараметрыОбновления.Вставить("ИмяZipФайлаОбновления"   , "1cv8.zip");
    ПараметрыОбновления.Вставить("КаталогФайловОбновления"    , каталог_tmplts + "\1C"); 
    Если НЕ ПроверитьСоздатьКаталог(ПараметрыОбновления.КаталогФайловОбновления) Тогда Возврат Ложь; КонецЕсли;
    
    Возврат Истина;
    
КонецФункции

// Скачивает из Интернета списки обновлений.
//
// Параметры:
//  ТипКонфигурации - Строка - Краткое наименование конфигурации;
//  ВерсияРелиза    - Строка - Версия релиза;
//  ВерсияПлатформы - Строка - Версия платформы: 82; 83.
//
// Возвращаемое значение:
//  Булево - признак успешного получения.
//
Функция ПолучитьСпискиОбновлений(ТипКонфигурации, ВерсияРелиза, ВерсияПлатформы = "83") 
    
    Сообщить("----------------------------------------------------------------------");
    Сообщить(СтрШаблон(НСтр("ru = 'Конфигурация %1, релиз %2, платформа %3.'"), 
        ТипКонфигурации, ВерсияРелиза, ВерсияПлатформы));     
    
    СообщитьПользователю(НСтр("ru = 'Получение списков обновления.'"));   
    
    // Очищаем устаревшие файлы
    ZipФайлСпискаШаблонов = КаталогВременныхФайлов + ПараметрыОбновления.ИмяZipФайлаСпискаШаблонов; 
    Попытка
        УдалитьФайлы(ZipФайлСпискаШаблонов);    
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
            |%2'"), ZipФайлСпискаШаблонов, ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    
    ФайлСпискаШаблонов = КаталогВременныхФайлов + "\v8cscdsc.xml"; 
    Попытка
        УдалитьФайлы(ФайлСпискаШаблонов);
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
            |%2'"), ФайлСпискаШаблонов, ИнформацияОбОшибке()));
    КонецПопытки;
    
    // Получаем сам файл из Интернета.
    Попытка
        Соединение = Новый HTTPСоединение("downloads.1c.ru", , НастройкаСоединения.Пользователь, НастройкаСоединения.Пароль,);
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось установить HTTP-соединение с сервером downloads.1c.ru:
            |%1'"), ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    
    Попытка
        HTTPЗапрос = Новый HTTPЗапрос(СтрШаблон("/ipp/ITSREPV/V8Update/Configs/%1/%2/%3/v8upd11.zip", ТипКонфигурации, ВерсияРелиза, ВерсияПлатформы));
        Соединение.Получить(HTTPЗапрос, ZipФайлСпискаШаблонов);
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось получить файл с сервера downloads.1c.ru:
            |%1'"), ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    
    // Распаковываем файл
    Попытка
        ФайлZip = Новый ЧтениеZipФайла(ZipФайлСпискаШаблонов); 
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1:
            |%2'"), ZipФайлСпискаШаблонов, ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    ФайлZip.ИзвлечьВсе(КаталогВременныхФайлов);
    ФайлZip.Закрыть();
    
    Попытка
        УдалитьФайлы(ZipФайлСпискаШаблонов);    
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
            |%2'"), ZipФайлСпискаШаблонов, ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    
    ФайлСпискаШаблоновОбъект = Новый Файл(ФайлСпискаШаблонов);
    Если НЕ ФайлСпискаШаблоновОбъект.Существует() Тогда    
        СообщитьПользователю(НСтр("ru = 'XML файл списка шаблонов не найден в каталоге.'"));
        Возврат Ложь;
    КонецЕсли;
    
    СообщитьПользователю(НСтр("ru = 'Списки обновления успешно получены.'"));
    
    Возврат Истина;
    
КонецФункции

// Обновляет информационную базу.
// 
// Параметры:
//  ТипКонфигурации                          - Строка - Краткое наименование конфигурации
//  ВариантРаботыИнформационнойБазы             - Число  - Вариант работы информационной базы: 0 - файловый; 1 -
//                                                             клиент-серверный;
//  КаталогИнформационнойБазы                   - Строка - Каталог информационной базы для файлового режима работы;
//  ИмяСервера1СПредприятия                     - Строка - Имя сервера1С:Предприятия;
//  ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - Имя информационной базы на сервере1С:Предприятия;
//  АутентификацияОперационнойСистемы           - Булево - Признак аутентификации операционной системы при создании
//                                                             внешнего подключения к информационной базе;
//  ИмяПользователя                             - Строка - Имя пользователя информационной базы;
//  ПарольПользователя                          - Строка - Пароль пользователя информационной базы.
//  ВерсияПлатформы                              - Строка - Версия платформы: 82; 83;
// 
Процедура ПроверитьОбновлениеКонфигурации(ТипКонфигурации,
                                        ВариантРаботыИнформационнойБазы = 0,
                                        КаталогИнформационнойБазы = "",
                                        ИмяСервера1СПредприятия = "",
                                        ИмяИнформационнойБазыНаСервере1СПредприятия = "",
                                        АутентификацияОперационнойСистемы = Ложь,
                                        ИмяПользователя = "",
                                        ПарольПользователя = "",
                                        ВерсияПлатформы = "83")
    
    Сообщить("----------------------------------------------------------------------");
    Сообщить(СтрШаблон(НСтр("ru = 'Информационная база %1.'"), 
        ?(ВариантРаботыИнформационнойБазы = 0, КаталогИнформационнойБазы, ИмяИнформационнойБазыНаСервере1СПредприятия)));
    
    ПараметрыПодключения = Новый Структура;
    ПараметрыПодключения.Вставить("ВерсияПлатформы", ВерсияПлатформы);
    ПараметрыПодключения.Вставить("ВариантРаботыИнформационнойБазы", ВариантРаботыИнформационнойБазы);
    ПараметрыПодключения.Вставить("КаталогИнформационнойБазы", КаталогИнформационнойБазы);
    ПараметрыПодключения.Вставить("ИмяСервера1СПредприятия", ИмяСервера1СПредприятия);
    ПараметрыПодключения.Вставить("ИмяИнформационнойБазыНаСервере1СПредприятия", ИмяИнформационнойБазыНаСервере1СПредприятия);
    ПараметрыПодключения.Вставить("АутентификацияОперационнойСистемы", АутентификацияОперационнойСистемы);
    ПараметрыПодключения.Вставить("ИмяПользователя", ИмяПользователя);
    ПараметрыПодключения.Вставить("ПарольПользователя", ПарольПользователя);
    
    СтрокаСоединения = ПолучитьСтрокуСоединения(ПараметрыПодключения);
    
    Пока Истина Цикл
        ИмяВременногоФайла = "Base" + Формат(ТекущаяДата(), "ДФ=ггММддЧЧммсс");        
        СтрокаДампа = """" + ПараметрыПротоколирования.КаталогФайловДампа + "\" + ИмяВременногоФайла + ".dt""";
        СтрокаЛогов = """" + ПараметрыПротоколирования.КаталогФайловЛогов + "\" + ИмяВременногоФайла + ".log""";
        
        // Получение параметров информационной базы
        Соединение = УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения);   
        Если Соединение = Неопределено Тогда
            Возврат;
        КонецЕсли;     
        ПараметрыComБазы = Новый Структура;
        ПараметрыComБазы.Вставить("ТекущаяВерсия", Соединение.Метаданные.Версия);
        ПараметрыComБазы.Вставить("ПутьКПлатформе",Соединение.КаталогПрограммы() + "1cv8.exe");
        Соединение = Неопределено;
        
        // Прверка наличия обновлений
        МассивОбновлений = ВыполнитьЗагрузкуСпискаОбновлений(ПараметрыComБазы.ТекущаяВерсия);
        Если МассивОбновлений = Неопределено Тогда 
            Возврат;
        КонецЕсли;     
        
        КоличествоДоступныхОбновлений = МассивОбновлений.Количество(); 
        Если КоличествоДоступныхОбновлений = 0 Тогда
            СообщитьПользователю(СтрШаблон(НСтр("ru = 'Текущая версия: %1. Обновление не требуется.'"), ПараметрыComБазы.ТекущаяВерсия));
            Прервать;
        КонецЕсли;
        
        ЗагруженноеОбновлениеНайдено = Ложь;
        Для Сч = 1 По КоличествоДоступныхОбновлений Цикл
            ВерсияДляОбновления = МассивОбновлений[КоличествоДоступныхОбновлений - Сч]; 
            ФайлОбновленияВерсии = СтрШаблон("%1\%2\%3\1cv8.cfu", ПараметрыОбновления.КаталогФайловОбновления, ТипКонфигурации, ВерсияДляОбновления.Версия);
            ФайлОбновленияВерсииОбъект = Новый Файл(ФайлОбновленияВерсии);
            Если ФайлОбновленияВерсииОбъект.Существует() Тогда
                ЗагруженноеОбновлениеНайдено = Истина;
                СообщитьПользователю(СтрШаблон(НСтр("ru = 'Текущая версия: %1. Доступна для обновления версия: %2.'"), 
                    ПараметрыComБазы.ТекущаяВерсия, ВерсияДляОбновления.Версия));
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        // Загрузка файлов обновления
        Если Не ЗагруженноеОбновлениеНайдено Тогда
            ВерсияДляОбновления = МассивОбновлений[КоличествоДоступныхОбновлений - 1]; 
            ФайлОбновленияВерсии = СтрШаблон("%1\%2\%3\1cv8.cfu", ПараметрыОбновления.КаталогФайловОбновления, ТипКонфигурации, ВерсияДляОбновления.Версия);
            СообщитьПользователю(СтрШаблон(НСтр("ru = 'Текущая версия: %1. Доступна для загрузки версия: %2 (Поставщик %3, размер %4).'"), 
            ПараметрыComБазы.ТекущаяВерсия, ВерсияДляОбновления.Версия, ВерсияДляОбновления.Поставщик, ВерсияДляОбновления.РазмерФайлаОбновления));
            Если НЕ ПолучитьФайлыОбновлений(ТипКонфигурации, ВерсияДляОбновления) Тогда
                Возврат;
            КонецЕсли;
        КонецЕсли;
        
        // Создание резервной копии
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Создание резервной копии информационной базы (%1).'"), ИмяВременногоФайла));
        КомандаПакетногоАрхивирования = СтрШаблон("""%1"" CONFIG %2 /DumpIB %3 /OUT %4 -NoTruncate",
        ПараметрыComБазы.ПутьКПлатформе, СтрокаСоединения, СтрокаДампа, СтрокаЛогов);
        ЗапуститьПриложение(КомандаПакетногоАрхивирования, , Истина, КодВозврата);
        Если КодВозврата = 0  Тогда
            СообщитьПользователю(НСтр("ru = 'Резервная копия информационной базы успешно создана.'"));
        Иначе
            СообщитьПользователю(НСтр("ru = 'Ошибка при создании резервной копии информационной базы.'"));
            Возврат;
        КонецЕсли;
        
        // Обновление информационной базы                                                                                                                                                              
        СообщитьПользователю(НСтр("ru = 'Обновление информационной базы.'"));
        КомандаПакетногоОбновления = СтрШаблон("""%1"" CONFIG %2 /UpdateCfg ""%3"" /UpdateDBCfg /OUT %4 -NoTruncate",
        ПараметрыComБазы.ПутьКПлатформе, СтрокаСоединения, ФайлОбновленияВерсии, СтрокаЛогов);
        ЗапуститьПриложение(КомандаПакетногоОбновления, , Истина, КодВозврата);
        Если КодВозврата = 0 Тогда
            СообщитьПользователю(НСтр("ru = 'Информационная база успешно обновлена.'"));
        Иначе
            СообщитьПользователю(НСтр("ru = 'Ошибка при обновлении информационной базы.'"));
            Возврат;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

// Проверяет наличия каталога и в случае его отсутствия пытается создать новый.
//
// Параметры:
//  КаталогФайла - Строка - Путь к каталогу, существование которого нужно проверить.
//
// Возвращаемое значение:
//  Булево - признак существования каталога.
//
Функция ПроверитьСоздатьКаталог(КаталогФайла)
    
    КаталогФайлаОбъект = Новый Файл(КаталогФайла);
    Если НЕ КаталогФайлаОбъект.Существует() Тогда
        Попытка 
            СоздатьКаталог(КаталогФайла);
        Исключение
            СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось создать каталог %1.
                |%2'"), КаталогФайла, ИнформацияОбОшибке()));
            Возврат Ложь;
        КонецПопытки;
    КонецЕсли;
    
    Возврат Истина;
    
КонецФункции

// Добавляет дату и время перед сообщением и выводит сообщение пользователю.
//
// Параметры:
//  ТекстСообщенияПользователю - Строка - Текст сообщения.
//
Процедура СообщитьПользователю(ТекстСообщенияПользователю)
    
    ТекстСообщенияПользователю = СтрШаблон("%1 %2", ТекущаяДата(), ТекстСообщенияПользователю);
    Сообщить(ТекстСообщенияПользователю);
    
КонецПроцедуры

// Устанавливает внешнее соединение с информационной базой по переданным параметрам подключения и возвращает указатель
// на это соединение.
// 
// Параметры:
//  ПараметрыПодключения - Структура - параметры для установки внешнего соединения с информационной базой.
//
//    * ВерсияПлатформы                              - Строка - Версия платформы: 82; 83;
//    * ВариантРаботыИнформационнойБазы             - Число  - Вариант работы информационной базы: 0 - файловый; 1 -
//                                                             клиент-серверный;
//    * КаталогИнформационнойБазы                   - Строка - Каталог информационной базы для файлового режима работы;
//    * ИмяСервера1СПредприятия                     - Строка - Имя сервера1С:Предприятия;
//    * ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - Имя информационной базы на сервере1С:Предприятия;
//    * АутентификацияОперационнойСистемы           - Булево - Признак аутентификации операционной системы при создании
//                                                             внешнего подключения к информационной базе;
//    * ИмяПользователя                             - Строка - Имя пользователя информационной базы;
//    * ПарольПользователя                          - Строка - Пароль пользователя информационной базы.
// 
// Возвращаемое значение:
//  COMОбъект, Неопределено - указатель на COM-объект соединения или Неопределено в случае ошибки;
//
Функция УстановитьВнешнееСоединениеСБазой(знач ПараметрыПодключения) 
    
    ИмяCOMСоединителя = "V" + ПараметрыПодключения.ВерсияПлатформы + ".COMConnector";
    Попытка
        COMОбъект = Новый COMОбъект(ИмяCOMСоединителя);
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось подключится к другой программе:
            |%1'"), ИнформацияОбОшибке()));
        Возврат Неопределено;
    КонецПопытки; 
    
    ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
    
    // Проверка корректности указания параметров.
    ОшибкаПроверкиЗаполнения = Ложь;
    Если ФайловыйВариантРаботы Тогда
        Если ПустаяСтрока(ПараметрыПодключения.КаталогИнформационнойБазы) Тогда
            ТекстСообщения = НСтр("ru = 'Не задано месторасположение каталога информационной базы.'");
            ОшибкаПроверкиЗаполнения = Истина;
        КонецЕсли;
    Иначе
        Если ПустаяСтрока(ПараметрыПодключения.ИмяСервера1СПредприятия) Или ПустаяСтрока(ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия) Тогда
            ТекстСообщения = НСтр("ru = 'Не заданы обязательные параметры подключения: ""Имя сервера""; ""Имя информационной базы на сервере"".'");
            ОшибкаПроверкиЗаполнения = Истина;
        КонецЕсли;
    КонецЕсли;
    
    Если ОшибкаПроверкиЗаполнения Тогда
        СообщитьПользователю(ТекстСообщения);
        Возврат Неопределено;
    КонецЕсли;
    
    // Формирование строки соединения.
    ШаблонСтрокиСоединения = "[СтрокаБазы][СтрокаАутентификации]";
    
    Если ФайловыйВариантРаботы Тогда
        СтрокаБазы = "File = ""&КаталогИнформационнойБазы""";
        СтрокаБазы = СтрЗаменить(СтрокаБазы, "&КаталогИнформационнойБазы", ПараметрыПодключения.КаталогИнформационнойБазы);
    Иначе
        СтрокаБазы = "Srvr = ""&ИмяСервера1СПредприятия""; Ref = ""&ИмяИнформационнойБазыНаСервере1СПредприятия""";
        СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяСервера1СПредприятия",                     ПараметрыПодключения.ИмяСервера1СПредприятия);
        СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяИнформационнойБазыНаСервере1СПредприятия", ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия);
    КонецЕсли;
    
    Если ПараметрыПодключения.АутентификацияОперационнойСистемы Тогда
        СтрокаАутентификации = "";
    Иначе
        
        Если СтрНайти(ПараметрыПодключения.ИмяПользователя, """") Тогда
            ПараметрыПодключения.ИмяПользователя = СтрЗаменить(ПараметрыПодключения.ИмяПользователя, """", """""");
        КонецЕсли;
        
        Если СтрНайти(ПараметрыПодключения.ПарольПользователя, """") Тогда
            ПараметрыПодключения.ПарольПользователя = СтрЗаменить(ПараметрыПодключения.ПарольПользователя, """", """""");
        КонецЕсли;
        
        СтрокаАутентификации = "; Usr = ""&ИмяПользователя""; Pwd = ""&ПарольПользователя""";
        СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ИмяПользователя",    ПараметрыПодключения.ИмяПользователя);
        СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ПарольПользователя", ПараметрыПодключения.ПарольПользователя);
    КонецЕсли;
    
    СтрокаСоединения = СтрЗаменить(ШаблонСтрокиСоединения, "[СтрокаБазы]", СтрокаБазы);
    СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "[СтрокаАутентификации]", СтрокаАутентификации);
    
    Попытка
        Соединение = COMОбъект.Connect(СтрокаСоединения);
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось подключится к другой программе:
            |%1'"), ИнформацияОбОшибке()));
        Возврат Неопределено;
    КонецПопытки;
    
    Возврат Соединение;
    
КонецФункции

// Возвращает строку для подключения к внешней базе по переданным параметрам подключения.
// 
// Параметры:
//  ПараметрыПодключения - Структура - параметры для установки внешнего соединения с информационной базой.
//
//    * ВерсияПлатформы                              - Строка - Версия платформы: 82; 83;
//    * ВариантРаботыИнформационнойБазы             - Число  - Вариант работы информационной базы: 0 - файловый; 1 -
//                                                             клиент-серверный;
//    * КаталогИнформационнойБазы                   - Строка - Каталог информационной базы для файлового режима работы;
//    * ИмяСервера1СПредприятия                     - Строка - Имя сервера1С:Предприятия;
//    * ИмяИнформационнойБазыНаСервере1СПредприятия - Строка - Имя информационной базы на сервере1С:Предприятия;
//    * АутентификацияОперационнойСистемы           - Булево - Признак аутентификации операционной системы при создании
//                                                             внешнего подключения к информационной базе;
//    * ИмяПользователя                             - Строка - Имя пользователя информационной базы;
//    * ПарольПользователя                          - Строка - Пароль пользователя информационной базы.
// 
// Возвращаемое значение:
//  Строка, Неопределено - строка подключения или Неопределено в случае ошибки;
//
Функция ПолучитьСтрокуСоединения(знач ПараметрыПодключения)  
    
    ФайловыйВариантРаботы = ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0;
    
    // Формирование строки соединения.
    СтрокаСоединения = "[СтрокаБазы][СтрокаАутентификации]";
    
    Если ФайловыйВариантРаботы Тогда
        СтрокаБазы = " /F""&КаталогИнформационнойБазы""";
        СтрокаБазы = СтрЗаменить(СтрокаБазы, "&КаталогИнформационнойБазы", ПараметрыПодключения.КаталогИнформационнойБазы);
    Иначе
        СтрокаБазы = " /S""&ИмяСервера1СПредприятия/&ИмяИнформационнойБазыНаСервере­1СПредприятия""";
        СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяСервера1СПредприятия",                     ПараметрыПодключения.ИмяСервера1СПредприятия);
        СтрокаБазы = СтрЗаменить(СтрокаБазы, "&ИмяИнформационнойБазыНаСервере1СПредприятия", ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия);
    КонецЕсли;
    
    Если ПараметрыПодключения.АутентификацияОперационнойСистемы Тогда
        СтрокаАутентификации = "";
    Иначе
        
        Если СтрНайти(ПараметрыПодключения.ИмяПользователя, """") Тогда
            ПараметрыПодключения.ИмяПользователя = СтрЗаменить(ПараметрыПодключения.ИмяПользователя, """", """""");
        КонецЕсли;
        
        Если СтрНайти(ПараметрыПодключения.ПарольПользователя, """") Тогда
            ПараметрыПодключения.ПарольПользователя = СтрЗаменить(ПараметрыПодключения.ПарольПользователя, """", """""");
        КонецЕсли;
        
        СтрокаАутентификации = " /N""&ИмяПользователя"" /P""&ПарольПользователя""";
        СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ИмяПользователя",    ПараметрыПодключения.ИмяПользователя);
        СтрокаАутентификации = СтрЗаменить(СтрокаАутентификации, "&ПарольПользователя", ПараметрыПодключения.ПарольПользователя);
    КонецЕсли;
    
    СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "[СтрокаБазы]", СтрокаБазы);
    СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "[СтрокаАутентификации]", СтрокаАутентификации);
    
    Возврат СтрокаСоединения;
    
КонецФункции

// Загрузка списка обновлений из файла XML
// 
// Параметры:
//  ТекущаяВерсияКонфигурации - Строка - Текущая версия конфигурации.
//
// Возвращаемое значение:
//  Массив, Неопределено - массив с параметрами версий для обновления или Неопределено в случае ошибки;
//
Функция ВыполнитьЗагрузкуСпискаОбновлений(ТекущаяВерсияКонфигурации)
    
    ФайлСпискаШаблонов = КаталогВременныхФайлов + "\v8cscdsc.xml"; 
    МассивОбновлений = Новый Массив;
    
    Попытка
        
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.ОткрытьФайл(ФайлСпискаШаблонов);
        ЧтениеXML.Прочитать(); // <?xml version="1.0" encoding="UTF-8" ?> 
        ЧтениеXML.Прочитать();
        ЧтениеXML.Прочитать();
        ЧтениеXML.Прочитать();
        
        // Читаем начало элемента Update или конец элемента UpdateList.
        Пока ЧтениеXML.Прочитать() Цикл
            Если ЧтениеXML.Имя = "v8u:updateList" Тогда
                Прервать;                    
            Иначе        
                Пока ЧтениеXML.Прочитать() Цикл
                    Если ЧтениеXML.Имя = "v8u:update" Тогда
                        Прервать;                    
                    Иначе        
                        Если ЧтениеXML.Имя = "v8u:vendor" Тогда
                            ЧтениеXML.Прочитать();
                            Поставщик = ЧтениеXML.Значение;                            
                        ИначеЕсли ЧтениеXML.Имя = "v8u:version" Тогда
                            ЧтениеXML.Прочитать();
                            Версия = ЧтениеXML.Значение;
                        ИначеЕсли ЧтениеXML.Имя = "v8u:file" Тогда
                            ЧтениеXML.Прочитать();
                            ПутьКФайлуОбновления = ЧтениеXML.Значение;
                        ИначеЕсли ЧтениеXML.Имя = "v8u:size" Тогда
                            ЧтениеXML.Прочитать();
                            РазмерФайлаОбновления = ЧтениеXML.Значение;
                        ИначеЕсли ЧтениеXML.Имя = "v8u:target" Тогда
                            ЧтениеXML.Прочитать();
                            Если ЧтениеXML.Значение = ТекущаяВерсияКонфигурации Тогда
                                ВерсияДляОбновления = Новый Структура();
                                ВерсияДляОбновления.Вставить("Поставщик",             Поставщик);
                                ВерсияДляОбновления.Вставить("Версия",                   СтрЗаменить(Версия, ".", "_"));
                                ВерсияДляОбновления.Вставить("ПутьКФайлуОбновления",  ПутьКФайлуОбновления);
                                ВерсияДляОбновления.Вставить("РазмерФайлаОбновления", РазмерФайлаОбновления);
                                МассивОбновлений.Добавить(ВерсияДляОбновления);
                            КонецЕсли;
                        КонецЕсли;
                        ЧтениеXML.Прочитать();
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
        КонецЦикла;
    Исключение
        
        СообщитьПользователю(НСтр("ru = 'Ошибка при чтении файла списка обновлений.'"));
        ЧтениеXML.Закрыть();
        
        Возврат Неопределено;
        
    КонецПопытки;
    
    ЧтениеXML.Закрыть();
    
    Возврат МассивОбновлений;
    
КонецФункции

// Скачивает из Интернета файлы обновлений.
//
// Параметры:
//  ТипКонфигурации  - Строка  - Краткое наименование конфигурации;
//  ВерсияДляОбновления - Структура - Структура с параметрами версии для обновления.
//    * Поставщик             - Строка - Поставщик;
//    * Версия                - Строка - Версия;
//    * ПутьКФайлуОбновления  - Строка - Путь к файлу обновления;
//    * РазмерФайлаОбновления - Строка - Размер файла обновления в байтах.
//
// Возвращаемое значение:
//  Булево - признак успешного получения.
//
Функция ПолучитьФайлыОбновлений(ТипКонфигурации, ВерсияДляОбновления) 
    
    СообщитьПользователю(СтрШаблон(НСтр("ru = 'Получение файлов обновления версии %1.'"), 
    ВерсияДляОбновления.Версия));
    
    КаталогФайлаОбновленияВерсии = СтрШаблон("%1\%2\%3", ПараметрыОбновления.КаталогФайловОбновления, ТипКонфигурации, ВерсияДляОбновления.Версия);
    Если НЕ ПроверитьСоздатьКаталог(КаталогФайлаОбновленияВерсии) Тогда Возврат Ложь; КонецЕсли;
    
    // Очищаем устаревшие файлы
    ZipФайлОбновления = КаталогВременныхФайлов + "\" + ПараметрыОбновления.ИмяZipФайлаОбновления; 
    Попытка
        УдалитьФайлы(ZipФайлОбновления);    
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
            |%2'"), ZipФайлОбновления, ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    
    // Получаем сам файл из Интернета.
    Попытка
        Соединение = Новый HTTPСоединение("downloads.v8.1c.ru", , НастройкаСоединения.Пользователь, НастройкаСоединения.Пароль,);
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось установить HTTP-соединение с сервером downloads.v8.1c.ru:
            |%1'"), ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    
    Попытка
        Заголовки = Новый Соответствие();
        Заголовки.Вставить("User-Agent", "1C+Enterprise/8.3");
        HTTPЗапрос = Новый HTTPЗапрос("/tmplts/" + ВерсияДляОбновления.ПутьКФайлуОбновления, Заголовки);
        Соединение.Получить(HTTPЗапрос, ZipФайлОбновления);
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось получить файл с сервера downloads.v8.1c.ru:
            |%1'"), ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    
    // Распаковываем файл
    Попытка
        ФайлZip = Новый ЧтениеZipФайла(ZipФайлОбновления); 
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось прочесть архив %1:
            |%2'"), ZipФайлОбновления, ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    ФайлZip.ИзвлечьВсе(КаталогФайлаОбновленияВерсии);
    ФайлZip.Закрыть();
    
    Попытка
        УдалитьФайлы(ZipФайлОбновления);    
    Исключение
        СообщитьПользователю(СтрШаблон(НСтр("ru = 'Не удалось удалить временный файл %1:
            |%2'"), ZipФайлОбновления, ИнформацияОбОшибке()));
        Возврат Ложь;
    КонецПопытки;
    
    СообщитьПользователю(НСтр("ru = 'Файлы обновления успешно получены.'"));
    
    Возврат Истина;
    
КонецФункции 

Если УстановитьКонстанты() Тогда
    
    // Бухгалтерия предприятия 3.0
    Если ПолучитьСпискиОбновлений("Accounting", "30") Тогда
        ПроверитьОбновлениеКонфигурации("Accounting", , "\\server\---\---\---",,,, "Администратор", "---");
    КонецЕсли;
    
    // Бухгалтерия предприятия 2.0
    Если ПолучитьСпискиОбновлений("Accounting", "20") Тогда
        ПроверитьОбновлениеКонфигурации("Accounting", , "\\server\---\---\---",,,, "Администратор", "---");
    КонецЕсли;
    
КонецЕсли;
...Показать Скрыть
10. Sergey Фамилия (sergey279) 11.07.16 10:18
(9) Drak0n,
Объединил текст из данной публикации со своим. Из основных отличий:
1. Загрузка списка обновлений 1 раз для семейства
2. Обновление через несколько релизов
3. Преимущественное обновление на уже скачанные релизы
4. Ну и по мелочи
Получилось вот что:

PS Если автор не против могу выложить отдельной темой


1. гуд. но думаю пару кбайт погоды не сделают.
2. обновление идет на максимально возможный релиз в пределах одного скачка.
далее еще не посмотрел как у вас реализовано. следущей накаткой обновлений до "победного" или все таки с запуском обработчиков в режиме "предприятия"?
3. Аналогично "//качаем новую версию, если уже не скачено"

PS ни когда не против, т.к.
а) эта публикация и так копия батника, только на другом языке.
б) если бы был против, ничего бы не смог с этим поделать. "Мне остается только стонать от бессилия или отравиться газами через выхлопную трубу!" © Лжец Лжец.
11. Алексей (Drak0n) 11.07.16 14:17
Обновление идет на максимально возможный уже скачанный релиз, если такового не найдено - на максимально возможный в пределах скачка (загружается с сайта). Такая необходимость возникла в связи с тем что была куча баз с различными релизами и вместо того чтобы качать цепочку "максимальных" релизов для каждой все релизы обновлялись на уже скачанный и далее по одной цепочке до финального.
Обработчики в режиме Предприятия не запускаются. Тут принципиальная позиция - соглашение на клиентском компьютере принимает пользователь. Через чур старых ИБ не обновляется - поэтому проблем нет).
12. Артём Гущин (TimoniArtjom) 07.08.16 19:26
А он все базы обновляет или только одну?
13. Алексей (Drak0n) 30.08.16 15:05
(12) TimoniArtjom, скрипт по очереди проходит по списку заданных информационных баз. Все базы обновляются последовательно.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа