Загрузка данных


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    Дата = ТекущаяДата();
    ДатаПриказа = ТекущаяДата();
    Утвержден = Ложь;

КонецПроцедуры


&НаКлиенте
Процедура ЗагрузитьАбитуриентов()

    // Загрузка рекомендованных к зачислению

    Параметры = Новый Структура;
    Параметры.Вставить("ВидПриказа", ВидПриказа);

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("ДатаПриказа", ДатаПриказа);

    Данные =
        ЗагрузитьСтудентовДляПриказаНаСервере(
            Параметры,
            ДополнительныеПараметры);

    Для Каждого СтрокаДанных Из Данные Цикл

        НоваяСтрока = СписокСтудентов.Добавить();

        НоваяСтрока.Студент =
            СтрокаДанных.Студент;

        НоваяСтрока.ГруппаНовая =
            СтрокаДанных.Группа;

        НоваяСтрока.ДатаСобытия =
            ДатаПриказа;

    КонецЦикла;

КонецПроцедуры


&НаСервере
Функция ЗагрузитьСтудентовДляПриказаНаСервере(
    Параметры,
    ДополнительныеПараметры)

    Запрос = Новый Запрос;

    Запрос.Текст =
        "ВЫБРАТЬ
        |   Абитуриенты.Студент КАК Студент,
        |   Абитуриенты.ГруппаЗачисления КАК Группа
        |ИЗ
        |   РегистрСведений.РекомендованныеКЗачислению КАК Абитуриенты
        |ГДЕ
        |   Абитуриенты.Период <= &ДатаПриказа
        |
        |УПОРЯДОЧИТЬ ПО
        |   Абитуриенты.Студент.ФИО";

    Запрос.УстановитьПараметр(
        "ДатаПриказа",
        ДополнительныеПараметры.ДатаПриказа);

    Возврат Запрос.Выполнить().Выгрузить();

КонецФункции


&НаСервере
Процедура ПередЗаписьюНаСервере(
    Отказ,
    ТекущийЭлемент,
    ПараметрыЗаписи)

    Если НЕ ЗначениеЗаполнено(Номер) Тогда

        Сообщить("Укажите номер приказа!");

        Отказ = Истина;
        Возврат;

    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(ВидПриказа) Тогда

        Сообщить("Укажите вид приказа!");

        Отказ = Истина;
        Возврат;

    КонецЕсли;

    Если СписокСтудентов.Количество() = 0 Тогда

        Сообщить("Добавьте студентов в табличную часть!");

        Отказ = Истина;
        Возврат;

    КонецЕсли;

    Для Каждого Строка Из СписокСтудентов Цикл

        Если НЕ ЗначениеЗаполнено(Строка.Студент) Тогда

            Сообщить("В табличной части есть строка без студента!");

            Отказ = Истина;
            Возврат;

        КонецЕсли;

        Если НЕ ЗначениеЗаполнено(Строка.ДатаСобытия) Тогда

            Сообщить("Укажите дату события для студента " + Строка.Студент.ФИО);

            Отказ = Истина;
            Возврат;

        КонецЕсли;

        Если ВидПриказа =
            Перечисления.ВидыПриказа.Зачисление Тогда

            Если НЕ ЗначениеЗаполнено(Строка.ГруппаНовая) Тогда

                Сообщить("Укажите новую группу для студента " + Строка.Студент.ФИО);

                Отказ = Истина;
                Возврат;

            КонецЕсли;

        ИначеЕсли ВидПриказа =
            Перечисления.ВидыПриказа.Перевод Тогда

            Если НЕ ЗначениеЗаполнено(Строка.ГруппаНовая) Тогда

                Сообщить("Укажите новую группу для студента " + Строка.Студент.ФИО);

                Отказ = Истина;
                Возврат;

            КонецЕсли;

        ИначеЕсли ВидПриказа =
            Перечисления.ВидыПриказа.Восстановление Тогда

            Если НЕ ЗначениеЗаполнено(Строка.ГруппаНовая) Тогда

                Сообщить("Укажите новую группу для студента " + Строка.Студент.ФИО);

                Отказ = Истина;
                Возврат;

            КонецЕсли;

        ИначеЕсли ВидПриказа =
            Перечисления.ВидыПриказа.Отчисление Тогда

            ПоследнееЗачисление =
                ПолучитьПоследнююДатуЗачисления(
                    Строка.Студент);

            Если ЗначениеЗаполнено(ПоследнееЗачисление) Тогда

                Если Строка.ДатаСобытия < ПоследнееЗачисление Тогда

                    Сообщить(
                        "Ошибка: дата отчисления не может быть раньше даты зачисления");

                    Отказ = Истина;
                    Возврат;

                КонецЕсли;

            КонецЕсли;

            Если ЕстьАкадемическиеЗадолженности(
                Строка.Студент) Тогда

                Сообщить(
                    "У студента "
                    + Строка.Студент.ФИО
                    + " есть академические задолженности.");

                Отказ = Истина;
                Возврат;

            КонецЕсли;

        ИначеЕсли ВидПриказа =
            Перечисления.ВидыПриказа.АкадемическийОтпуск Тогда

            ПоследнееЗачисление =
                ПолучитьПоследнююДатуЗачисления(
                    Строка.Студент);

            Если ЗначениеЗаполнено(ПоследнееЗачисление) Тогда

                Если Строка.ДатаСобытия < ПоследнееЗачисление Тогда

                    Сообщить(
                        "Ошибка: дата начала отпуска не может быть раньше даты зачисления");

                    Отказ = Истина;
                    Возврат;

                КонецЕсли;

            КонецЕсли;

            Если Строка.ДатаСобытия > ТекущаяДата() Тогда

                Сообщить(
                    "Ошибка: дата начала отпуска не может быть позже текущей даты");

                Отказ = Истина;
                Возврат;

            КонецЕсли;

        КонецЕсли;

    КонецЦикла;

КонецПроцедуры


&НаСервере
Процедура ОбработкаПроведения(Отказ, Режим)

    Для Каждого Строка Из СписокСтудентов Цикл

        Студент = Строка.Студент;

        ОбъектСтудента =
            Студент.ПолучитьОбъект();

        СтарыйСтатус =
            ОбъектСтудента.Статус;

        НовыйСтатус =
            СтарыйСтатус;

        НоваяГруппа =
            ОбъектСтудента.Группа;

        Если ВидПриказа =
            Перечисления.ВидыПриказа.Зачисление Тогда

            НовыйСтатус =
                Перечисления.СтатусыСтудентов.Зачислен;

            НоваяГруппа =
                Строка.ГруппаНовая;

        ИначеЕсли ВидПриказа =
            Перечисления.ВидыПриказа.Отчисление Тогда

            НовыйСтатус =
                Перечисления.СтатусыСтудентов.Отчислен;

        ИначеЕсли ВидПриказа =
            Перечисления.ВидыПриказа.Перевод Тогда

            НоваяГруппа =
                Строка.ГруппаНовая;

        ИначеЕсли ВидПриказа =
            Перечисления.ВидыПриказа.Восстановление Тогда

            НовыйСтатус =
                Перечисления.СтатусыСтудентов.Зачислен;

            НоваяГруппа =
                Строка.ГруппаНовая;

        ИначеЕсли ВидПриказа =
            Перечисления.ВидыПриказа.АкадемическийОтпуск Тогда

            НовыйСтатус =
                Перечисления.СтатусыСтудентов.АкадемическийОтпуск;

        КонецЕсли;

        ОбъектСтудента.Статус =
            НовыйСтатус;

        Если НоваяГруппа <>
            ОбъектСтудента.Группа Тогда

            ОбъектСтудента.Группа =
                НоваяГруппа;

        КонецЕсли;

        ОбъектСтудента.Записать();

        НаборЗаписей =
            РегистрыСведений.ИсторияСтатусовСтудентов.СоздатьНаборЗаписей();

        НоваяЗапись =
            НаборЗаписей.Добавить();

        НоваяЗапись.Период =
            Дата;

        НоваяЗапись.Студент =
            Студент;

        НоваяЗапись.Статус =
            НовыйСтатус;

        НоваяЗапись.Группа =
            НоваяГруппа;

        НоваяЗапись.Приказ =
            Ссылка;

        НоваяЗапись.ВидПриказа =
            ВидПриказа;

        НаборЗаписей.Записать();

    КонецЦикла;

КонецПроцедуры


&НаСервере
Функция ЕстьАкадемическиеЗадолженности(Студент)

    Запрос = Новый Запрос;

    Запрос.Текст =
        "ВЫБРАТЬ
        |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Успеваемость.Дисциплина) КАК КолДолгов
        |ИЗ
        |   РегистрНакопления.Успеваемость КАК Успеваемость
        |ГДЕ
        |   Успеваемость.Студент = &Студент
        |   И Успеваемость.Оценка = 2";

    Запрос.УстановитьПараметр(
        "Студент",
        Студент);

    Результат =
        Запрос.Выполнить().Выбрать();

    Если Результат.Следующий() Тогда

        Возврат Результат.КолДолгов > 0;

    КонецЕсли;

    Возврат Ложь;

КонецФункции


&НаСервере
Функция ПолучитьПоследнююДатуЗачисления(Студент)

    Запрос = Новый Запрос;

    Запрос.Текст =
        "ВЫБРАТЬ
        |   МАКСИМУМ(История.Период) КАК ДатаЗачисления
        |ИЗ
        |   РегистрСведений.ИсторияСтатусовСтудентов КАК История
        |ГДЕ
        |   История.Студент = &Студент
        |   И История.Статус =
        |       ЗНАЧЕНИЕ(
        |           Перечисления.СтатусыСтудентов.Зачислен
        |       )";

    Запрос.УстановитьПараметр(
        "Студент",
        Студент);

    Результат =
        Запрос.Выполнить().Выбрать();

    Если Результат.Следующий() Тогда

        Возврат Результат.ДатаЗачисления;

    КонецЕсли;

    Возврат Неопределено;

КонецФункции