示例#1
0
文件: _1Cv8.cs 项目: ITmind/SA1C
        /// <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);             //Точно дождемся :)
        }
示例#2
0
文件: _1Cv8.cs 项目: ITmind/SA1C
        /// <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);
        }