HelpF.pro

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

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

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


//Параметры для подключения к серверу обновления 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","Администратор","Администратор");

Источник


Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq82/view/1809.html