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


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

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

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


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

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

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

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

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

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

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

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

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

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

    КонецЦикла;

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


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

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

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

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

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

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


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

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

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

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

    КонецЕсли;

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

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

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

    КонецЕсли;

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

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

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

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

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

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

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

                КонецЕсли;

            КонецЕсли;

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

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

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

            КонецЕсли;

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

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

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

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

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

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

                КонецЕсли;

            КонецЕсли;

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

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

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

            КонецЕсли;

        КонецЕсли;

    КонецЦикла;

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        КонецЕсли;

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

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

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

        КонецЕсли;

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

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

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

        НоваяЗапись.Период = Дата;
        НоваяЗапись.Студент = Студент;
        НоваяЗапись.Статус = НовыйСтатус;
        НоваяЗапись.Группа = НоваяГруппа;
        НоваяЗапись.Приказ = Ссылка;
        НоваяЗапись.ВидПриказа = ВидПриказа;

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

    КонецЦикла;

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


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

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

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

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

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

    Результат.Следующий();

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

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


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

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

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

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

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

    Результат.Следующий();

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

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