/// <summary> /// Запустить 1С с параметром /С /// </summary> /// <param name="Mode"></param> /// <param name="Prarm"></param> /// <param name="BlockPassword"></param> public void Start1C(string mode, string param = "", string blockPassword = "") { Logger logger = LogManager.GetCurrentClassLogger(); StringBuilder arguments = new StringBuilder(); arguments.Append(mode); arguments.Append(baseInfo.ConnectionStringConsole); if (param != String.Empty) { arguments.Append(@" /C" + param); } if (blockPassword != String.Empty) { arguments.Append(@" /UC" + blockPassword); } arguments.Append(@" /DisableStartupMessages"); 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(); } catch (Win32Exception e) { //TODO: Убрать вывод в лог logger.Error("Ошибка запуска 1С " + e.Message); } Thread.Sleep(1000); //Точно дождемся :) }
/// <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); }