/// <summary>
        /// Инициализация привязок
        /// </summary>
        private void InitBindings(ServiceIdle serviceIdle)
        {
            serviceIdleBindingSource.DataSource = serviceIdle;
            serviceIdleBindingSource.ResumeBinding();

            // длительность простоя
            _duration = (serviceIdle.EndPeriod - serviceIdle.BeginPeriod).TotalMinutes;
            // количество пользователей, отключенных при этом
            _disabledUsersCount = serviceIdle.Service.User.Count;
            // количество администраторов, задействованных для этого
            _usedAdminsCount = serviceIdle.User.Count;

            // Годовой доход компанни
            CostIdleParams idleParams = null;

            try
            {
                // Попытка загрузки из файла
                idleParams = CostIdleParams.Load();
                // При отсутсвтсвии файла данные берутся из БД
                if (idleParams == null)
                {
                    idleParams = _ctx.GetIdleParamsFormDatabase();
                }
            }
            catch
            {
                // в случае ошибки данные берутся из БД
                idleParams = _ctx.GetIdleParamsFormDatabase();
            }
            finally
            {
                costIdleParamsBindingSource.DataSource = idleParams;
                costIdleParamsBindingSource.ResumeBinding();
            }

            CalcIdleCost();
        }
        /// <summary>
        /// Обработчик события нажатия клавиши мыши на кнопку,
        /// который осуществляет сохранение изменений в параметрах простоя
        /// </summary>
        private void btn_OK_Click(object sender, EventArgs e)
        {
            var costIdleParams = costIdleParamsBindingSource.DataSource as CostIdleParams;

            if (costIdleParams == null)
            {
                MessageBox.Show("Не удалось получить параметры для расчета простоя!", "Ошибка", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return;
            }

            if (costIdleParams.YearIncome <= 0)
            {
                MessageBox.Show("Введите годовой валовой доход компании для расчета стоимости простоя!", "Предупреждение", MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }

            if (costIdleParams.TotalEmployeeCount <= 0)
            {
                MessageBox.Show("Введите общее число сотрудников для расчета стоимости простоя!", "Предупреждение", MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }

            if (costIdleParams.TotalEmployeeCount < (_disabledUsersCount + _usedAdminsCount))
            {
                MessageBox.Show("Общее число сотрудников должно быть больше количества отключенных и задействованных!", "Предупреждение", MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }

            if (costIdleParams.AvgAdminSalary <= 0)
            {
                MessageBox.Show("Введите размер средней часовой оплаты труда администратора для расчета стоимости простоя!", "Предупреждение", MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }

            if (costIdleParams.AvgEmployeeSalary <= 0)
            {
                MessageBox.Show("Введите размер средней часовой оплаты труда работника для расчета стоимости простоя!", "Предупреждение", MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }

            if (_total <= 0)
            {
                MessageBox.Show("Не расчитана итоговая стоимость простоя!", "Предупреждение", MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }

            var result = MessageBox.Show("Полученная стоимость будет сохранена! Продолжить?", "Сохранение изменений",
                                         MessageBoxButtons.YesNo, MessageBoxIcon.Information);

            if (result == DialogResult.No)
            {
                return;
            }

            try
            {
                CostIdleParams.Save(costIdleParams);
            }
            catch
            {
                result = MessageBox.Show("Не удалось сохранить параметры для расчета! " +
                                         "\nПри новом расчете простоя придется снова ввести одовой валовой доход компании!" +
                                         "\nПродолжить сохранение?", "Ошибка", MessageBoxButtons.YesNo,
                                         MessageBoxIcon.Error);
                if (result == DialogResult.No)
                {
                    return;
                }
            }

            try
            {
                _serviceIdle.Cost = _total;
                _ctx.UpdateServiceIdle(_serviceIdle);
                DialogResult = DialogResult.OK;
                MessageBox.Show("Полученный расчет простоя успешно сохранен!", "Информация", MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                Close();
            }
            catch
            {
                MessageBox.Show("Не удалось сохранить полученные расчеты!", "Ошибка", MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
            }
        }