/// <summary> /// Включить пользователей /// </summary> public void EnableUser(TypeKillUsers typeKill) { switch (typeKill) { case TypeKillUsers.Kill: break; case TypeKillUsers.StandartParam: Start1C("ENTERPRISE", "РазрешитьРаботуПользователей", "ПакетноеОбновлениеКонфигурацииИБ"); break; case TypeKillUsers.UserProc: this.Connect(); try{ InvokeMethod(object1c, "ВключитьПользователей", ""); } catch { } this.Disconnect(); break; case TypeKillUsers.None: break; default: throw new Exception("Invalid value for TypeKillUsers"); } }
/// <summary> /// Отключить пользователей /// </summary> public void DisableUser(TypeKillUsers typeKill) { Logger logger = LogManager.GetCurrentClassLogger(); switch (typeKill) { case TypeKillUsers.Kill: KillUsers(); break; case TypeKillUsers.StandartParam: Start1C("ENTERPRISE", "ЗавершитьРаботуПользователей", "ПакетноеОбновлениеКонфигурацииИБ"); break; case TypeKillUsers.UserProc: this.Connect(); try{ logger.Debug("Вызов процедуры ОтключитьПользователей"); //InvokeMethod(object1c, "ОтключитьПользователей", ""); object1c.ОтключитьПользователей(); } catch (Exception e) { if (e.InnerException != null) { logger.Error(e.InnerException.Message); } else { logger.Error(e.Message); } } this.Disconnect(); break; case TypeKillUsers.None: break; default: throw new Exception("Invalid value for TypeKillUsers"); } }
/// <summary> /// Обновление конфигурации БД /// </summary> /// <param name="dinamyc">обновлять динамически</param> public string UpdateDB(bool dinamyc, TypeKillUsers typeKill = TypeKillUsers.Kill, string blockPassword = "") { Logger logger = LogManager.GetCurrentClassLogger(); string isUpdate = "ok"; bool isBlock = false; //выкинем пользователей if (!dinamyc) { if (UserPresent()) { DisableUser(typeKill); //Thread.Sleep(1000); //подождем выхода пользователей if (typeKill == TypeKillUsers.UserProc) { logger.Debug("Ждем 1.5 минуты"); //подождем 1,5 минуты пока пользователи отключатся. Thread.Sleep(90000); } else if (typeKill == TypeKillUsers.StandartParam) { //подождем 10 секунд Thread.Sleep(9000); } else if (typeKill == TypeKillUsers.None) { //подождем 1 секунд //Thread.Sleep(1000); } } //если не получилось отключить пользователей то выходим if (UserPresent()) { logger.Error("Ошибка выполнения обновления: в базе присутствуют пользователи"); return("Ошибка выполнения обновления. В базе присутствуют пользователи. Необходимо закрыть все запущенные сеансы 1С и заново повторить обмен"); } } StringBuilder arguments = new StringBuilder(); arguments.Append(@"CONFIG "); arguments.Append(baseInfo.ConnectionStringConsole); arguments.Append(@" /UpdateDBCfg"); // -force"); //if (dinamyc){ //динмачиское //arguments.Append(@" /UpdateDBCfg");// -force"); //} //else{ // arguments.Append(@" /UpdateDBCfg -WarningsAsErrors"); //} arguments.Append(@" /Out"); arguments.Append(@""""); arguments.Append(Path.GetTempPath() + @"SA1C\log"); arguments.Append(@""""); if (blockPassword != String.Empty) { arguments.Append(@" /UC" + blockPassword); } Process p = new Process(); if (baseInfo.PathToExe != null && baseInfo.PathToExe != String.Empty) { p.StartInfo.FileName = baseInfo.PathToExe; } else { p.StartInfo.FileName = Helper1C.GetPathExe(baseInfo.Version1C); } p.StartInfo.Arguments = arguments.ToString(); try{ p.Start(); p.WaitForExit(); isUpdate = "ok"; } catch (Win32Exception e) { logger.Error("Ошибка выполнения обновления " + e.Message + ". " + p.StartInfo.FileName); isUpdate = "Ошибка выполнения обновления. " + e.Message + ". " + p.StartInfo.FileName; return(isUpdate); } Thread.Sleep(3000); // Почемуто сразу не завершается p.Dispose(); if (!dinamyc) { EnableUser(typeKill); } //проверим, были ли ошибки при обновлении //для этого посмотрим лог файл //проверим, есть ли доступ к файлу и если нет //ждем пока файл освободит другой процесс int numError = 0; while (true) { try { FileStream fs = File.Open(Path.GetTempPath() + @"SA1C\log", FileMode.Open, FileAccess.Read, FileShare.Read); fs.Close(); break; //выходим из бесконечного цикла } catch { Thread.Sleep(1000); logger.Error("Файл" + Path.GetTempPath() + @"SA1C\log" + " заблокирован"); numError++; if (numError > 40) //по попыток, 10-мало { isUpdate = "Файл" + Path.GetTempPath() + @"SA1C\log" + " заблокирован"; return(isUpdate); } //TODO: ОШИБКА нельзя ждать вечно } } using (StreamReader log = File.OpenText(Path.GetTempPath() + @"SA1C\log")){ string str = log.ReadLine(); while (str != null) { if (str.Contains("Ошибка")) { logger.Error("Ошибка выполнения обновления: " + str + ". Подробности в файле " + Path.GetTempPath() + @"SA1C\log"); isUpdate = "Ошибка выполнения обновления: " + str + ". Подробности в файле " + Path.GetTempPath() + @"SA1C\log"; } if (str.Contains("блокировки")) { isBlock = true; } str = log.ReadLine(); } } //если не получилось обновить динамически то попробуем обновить не динамически if (isBlock && dinamyc) { isUpdate = UpdateDB(false, typeKill, blockPassword); } return(isUpdate); }