private DateTime GetMinDateForCalc()
        {
            if (string.IsNullOrEmpty(cbParameters.Text) || objects == null)
            {
                return DateTime.Today;
            }
            int[] selObj = objects.Where(o => (bool)((object[])o)[2]).Select(o=> (int)((object[])o)[0]).ToArray();
            if (selObj.Length == 0)
            {
                return DateTime.Today;
            }

            formula = DataHelper.CustomFormulas.FirstOrDefault(f => f.Name == cbParameters.Text);
            if (formula == null)
            {
                return DateTime.Today;
            }

            DateTime? minDate = DataHelper.GetMinDate(selObj, formula.InitPredicates());
            return minDate == null ? new DateTime(1990, 1, 1) : minDate.Value;
        }
        private void OnRunButtonClick(object sender, EventArgs e)
        {
            if (formed && DialogResult.Yes != MessageBox.Show("Есть несохраненные данные.\r\nВы действительно хотите рассчитать форму?",
                "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question))
            {
                return;
            }

            if (cbParameters.Text == string.Empty)
            {
                MessageBox.Show("Выберите параметр измерения.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            var selectedObj = objects.Where(o => (bool)((object[])o)[2]).Select(o => (int)((object[])o)[0]).ToArray();
            if (selectedObj.Count() == 0)
            {
                MessageBox.Show("Выберите объект измерений.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            formula = DataHelper.CustomFormulas.FirstOrDefault(f => f.Name == cbParameters.Text);
            if (formula == null)
            {
                MessageBox.Show("Для параметра - '" + cbParameters.Text + "' не определено рассчетных формул",
                                "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            sourceTitles.Clear();
            itogData.Clear();
            sourceData.Clear();

            string[] predicates = formula.InitPredicates();
            object[][] selObj = objects.Where(o => (bool)((object[])o)[2]).ToArray();
            object[][] param  = null;

            using (var con = DataHelper.OpenOrCreateDb())
            {
                try
                {
                    List<object> data = new List<object>();
                    List<object> rdata = new List<object>();
                    List<object> edata = new List<object>();
                    decimal eventInterval = DataHelper.GetSettingValue("RangeSchedule");

                    for (var i = trackBar.Value; i <= trackBar.Maximum; i++)
                    {
                        DateTime d = minDate.AddDays(i);
                        data.Clear();
                        data.Add(d);
                        rdata.Clear();
                        rdata.Add(d);
                        edata.Clear();

                        for (var s = 0; s < selObj.Length; s++)
                        {
                            try
                            {
                                int entityId = (int)selObj[s][0];
                                param =  predicates.Select(p => new object[] {p, DataHelper.GetAvgMetrix(entityId, p, d, con)}).ToArray();
                                data.AddRange(param.Select(p => p[1]));

                                decimal value = formula.Calc(param);

                                rdata.Add(value);

                                if (sourceTitles.Count == s * predicates.Length)
                                {
                                    sourceTitles.AddRange(predicates.Select(p => (string)selObj[s][1] + "/" + p));
                                }

                                //обработка на событие

                                DataHelper.ClearEvent(entityId, d, con);
                                bool alreadyMarked = DataHelper.IsAlreadyMarked(entityId, d, eventInterval, con);
                                if (!alreadyMarked)
                                {
                                    foreach (object[] c in DataHelper.FindEventConditions(entityId, con))
                                    {
                                        EventChecker checker = DataHelper.EventCheckers.FirstOrDefault(ev => ev.Name == c[1].ToString());
                                        if (checker == null)
                                        {
                                            continue;
                                        }
                                        var o = checker.IsEventExists(c, d, con);
                                        if (o != null)
                                        {
                                            object[] result = (object[])o;
                                            if ((bool)result[0])
                                            {
                                                DataHelper.AddEvent(entityId, c[0], checker.Name, d, (double)result[1], (double)result[2], con);
                                                edata.Add(new object[] {
                                                    d,
                                                    (string)c[5],
                                                    (string)c[4],
                                                    checker.Name,
                                                    (double)result[1],
                                                    (double)result[2]
                                                });
                                            }
                                        }
                                    }
                                }
                            }
                            catch
                            {
                                MessageBox.Show("Ошибка обработки данных для '" + (string)selObj[s][1] + "'. Обратитесь к разработчику");
                                continue;
                            }
                        }
                        sourceData.Add(data.ToArray());
                        itogData.Add(rdata.ToArray());
                        if (edata.Count > 0)
                        {
                            foreach (object[] ed in edata)
                            {
                                eventData.Add(ed);
                            }
                        }
                    }
                }
                finally { con.Close(); }
                PrepareViews();
                formed = true;
            }
        }