private void CreateDoctorEventAction_CustomizePopupWindowParams(object sender, CustomizePopupWindowParamsEventArgs e)
        {
            IObjectSpace                objectSpace = Application.CreateObjectSpace();
            TimeIntervalCollection      intervalCol = activeView.GetVisibleIntervals();
            CreateDoctorEventParameters parameters  = new CreateDoctorEventParameters(intervalCol.Start);

            e.View = Application.CreateDetailView(objectSpace, parameters, true);
        }
        private void CreateDoctorEventAction_Execute(object sender, PopupWindowShowActionExecuteEventArgs e)
        {
            Doctor doctor = FilterDoctorEventAction.SelectedItem.Data as Doctor;
            // Форма параметров
            CreateDoctorEventParameters parameters = (CreateDoctorEventParameters)e.PopupWindowViewCurrentObject;

            using (IObjectSpace os = Application.CreateObjectSpace())
            {
                DateTime start = parameters.DateIn;
                DateTime end   = parameters.DateIn.AddDays(7 * parameters.WeeksCount);

                while (start < end)
                {
                    if ((start.DayOfWeek == DayOfWeek.Monday && parameters.Monday) ||
                        (start.DayOfWeek == DayOfWeek.Tuesday && parameters.Tuesday) ||
                        (start.DayOfWeek == DayOfWeek.Wednesday && parameters.Wednesday) ||
                        (start.DayOfWeek == DayOfWeek.Thursday && parameters.Thursday) ||
                        (start.DayOfWeek == DayOfWeek.Friday && parameters.Friday) ||
                        (start.DayOfWeek == DayOfWeek.Saturday && parameters.Saturday) ||
                        (start.DayOfWeek == DayOfWeek.Sunday && parameters.Sunday))
                    {
                        DateTime timeStart = start.AddHours(parameters.TimeIn.Hour).AddMinutes(parameters.TimeIn.Minute);
                        DateTime timeEnd   = start.AddHours(parameters.TimeOut.Hour).AddMinutes(parameters.TimeOut.Minute);

                        List <DoctorEvent> oldEvents         = new List <DoctorEvent>();
                        GroupOperator      oldEventsCriteria = new GroupOperator();
                        // Удаляем пересекающееся старое расписание
                        if (timeStart == timeStart.Date && timeEnd == timeEnd.Date)
                        {
                            // Если указано пустое расписание, то удаляем старое расписание полностью за день
                            oldEventsCriteria.Operands.Add(DoctorEvent.Fields.AssignedTo == os.GetObject(doctor) &
                                                           new FunctionOperator(FunctionOperatorType.GetDate, DoctorEvent.Fields.StartOn) >= timeStart.Date &
                                                           new FunctionOperator(FunctionOperatorType.GetDate, DoctorEvent.Fields.EndOn) < timeStart.Date.AddDays(1));
                        }
                        else
                        {
                            // Ищем пересекающиеся с указанным временем расписания
                            oldEventsCriteria.Operands.Add(DoctorEvent.Fields.AssignedTo == os.GetObject(doctor) & (
                                                               DoctorEvent.Fields.StartOn <timeStart& DoctorEvent.Fields.EndOn> timeStart |
                                                               DoctorEvent.Fields.StartOn >= timeStart & DoctorEvent.Fields.EndOn <= timeEnd |
                                                               DoctorEvent.Fields.StartOn <timeEnd& DoctorEvent.Fields.EndOn> timeEnd));
                        }

                        oldEvents.AddRange(os.GetObjects <DoctorEvent>(oldEventsCriteria));
                        os.Delete(oldEvents);

                        // Цикл по времени
                        while (timeStart < timeEnd)
                        {
                            var doctorEvent = os.CreateObject <DoctorEvent>();
                            doctorEvent.AssignedTo = os.GetObject(doctor);
                            doctorEvent.StartOn    = timeStart;
                            doctorEvent.EndOn      = timeStart.Add(parameters.Norm);
                            doctorEvent.Label      = parameters.Label;
                            timeStart = timeStart.Add(parameters.Norm);
                        }
                    }
                    start = start.AddDays(1);
                }

                // Отключение аудита
                Session session = ((XPObjectSpace)os).Session;
                AuditTrailService.Instance.EndSessionAudit(session);
                os.CommitChanges();
            }

            // Обновление списочного представления
            if (rootListView != null && rootListView.ObjectSpace != null && rootListView.CollectionSource != null)
            {
                rootListView.CollectionSource.Reload();
            }
        }