public void Base_test()
        {
            var report = new GeneralReport();

            session.Save(report);
            var helper = new ScheduleHelper();

            helper.GetTaskOrCreate(report.Id);
            ScheduleHelper.SetTaskAction(report.Id, String.Format("/gr:{0} /manual:true", report.Id));

            session.CreateSQLQuery("delete from `logs`.reportexecutelogs; update  reports.general_reports set allow = 0;").ExecuteUpdate();
            session.Transaction.Commit();
            Program.Main(new[] { String.Format("/gr:{0}", report.Id) });
            var reportLogCount = session.Query <ReportExecuteLog>().Count();

            Assert.AreEqual(reportLogCount, 1);

            var currentTask = helper.FindTask(report.Id);

            Assert.That(((ExecAction)currentTask.Definition.Actions[0]).Arguments, Does.Contain("manual:true"));
        }
    protected void btnExecute_Click(object sender, EventArgs e)
    {
        var runed = false;

        if (IsValid && (currentTask.State != TaskState.Running))
        {
            ScheduleHelper.SetTaskEnableStatus(_generalReport.Id, true, "GR");
            ScheduleHelper.SetTaskAction(_generalReport.Id, string.Format("/gr:{0} /manual:true", _generalReport.Id));
            currentTask.Run();
            Thread.Sleep(500);
            btnExecute.Enabled = false;
            btnExecute.Text    = StatusNotRunning;
            runed = true;
        }

        CloseTaskService();
        Thread.Sleep(500);
        if (runed)
        {
            Response.Redirect("Schedule.aspx?r=" + _generalReport.Id);
        }
    }
        public static bool ProcessReport(int generalReportId, bool manual, bool interval, DateTime dtFrom, DateTime dtTo)
        {
            var           result    = false;
            var           reportLog = new ReportExecuteLog();
            GeneralReport report    = null;

            using (var session = GeneralReport.Factory.OpenSession())
                using (var mc = new MySqlConnection(ConnectionHelper.GetConnectionString())) {
                    mc.Open();
                    try {
                        var timeout = ConfigurationManager.AppSettings["MySqlTimeout"];
                        if (!String.IsNullOrEmpty(timeout))
                        {
                            mc.Execute($"set interactive_timeout={timeout};set wait_timeout={timeout};");
                        }
                        using (var trx = session.BeginTransaction()) {
                            reportLog.GeneralReportCode = generalReportId;
                            reportLog.StartTime         = DateTime.Now;
                            session.Save(reportLog);
                            trx.Commit();
                        }

                        report = session.Get <GeneralReport>((uint)generalReportId);
                        if (report == null)
                        {
                            throw new Exception($"Отчет с кодом {generalReportId} не существует.");
                        }
                        if (!report.Enabled && !manual)
                        {
                            throw new ReportException("Невозможно выполнить отчет, т.к. отчет выключен.");
                        }

                        _log.DebugFormat("Запуск отчета {0}", report.Id);
                        report.ProcessReports(reportLog, mc, interval, dtFrom, dtTo);
                        _log.DebugFormat("Отчет {0} выполнился успешно", report.Id);

                        using (var trx = session.BeginTransaction()) {
                            reportLog.EndTime = DateTime.Now;
                            trx.Commit();
                        }
                        result = true;
                    }
                    catch (Exception e) {
                        if (e is ReportException)
                        {
                            _log.Warn($"Ошибка при выполнении отчета {report}", e);
                        }
                        else
                        {
                            _log.Error($"Ошибка при выполнении отчета {report}", e);
                        }

                        try {
                            using (var trx = session.BeginTransaction()) {
                                reportLog.EndError = true;
                                session.Save(reportLog);
                                trx.Commit();
                            }
                        }
                        catch (Exception ex) {
                            _log.Error("Не удалось запротоколировать ошибку", ex);
                        }

                        var reportEx = e as ReportException;
                        if (reportEx != null)
                        {
                            Mailer.MailReportErr(reportEx.ToString(), reportEx.Payer, report.Id, reportEx.SubreportCode, reportEx.ReportCaption);
                            result = true;
                        }
                        else
                        {
                            Mailer.MailGeneralReportErr(report, e);
                        }
                    } finally {
                        //не уверен почему так но восстанавливаем состояние задачи только если отчет не выключен
                        //этого требует тест ProgramTest но логика мне не понятна
                        //подозрительно тк раньше это работало тк переменная была null и блок валился с исключением
                        if (report != null && report.Enabled)
                        {
                            ScheduleHelper.SetTaskAction(report.Id, "/gr:" + report.Id);
                            ScheduleHelper.SetTaskEnableStatus(report.Id, report.Enabled, "GR");
                            var taskService   = ScheduleHelper.GetService();
                            var reportsFolder = ScheduleHelper.GetReportsFolder(taskService);
                            ScheduleHelper.DeleteTask(reportsFolder, report.Id, "temp_");
                        }
                    }
                    return(result);
                }
        }