Загрузка данных
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Дата = ТекущаяДата();
ДатаПриказа = ТекущаяДата();
Утвержден = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьАбитуриентов()
// Загрузка рекомендованных к зачислению
Параметры = Новый Структура;
Параметры.Вставить("ВидПриказа", ВидПриказа);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ДатаПриказа", ДатаПриказа);
Данные =
ЗагрузитьСтудентовДляПриказаНаСервере(
Параметры,
ДополнительныеПараметры);
Для Каждого СтрокаДанных Из Данные Цикл
НоваяСтрока = СписокСтудентов.Добавить();
НоваяСтрока.Студент =
СтрокаДанных.Студент;
НоваяСтрока.ГруппаНовая =
СтрокаДанных.Группа;
НоваяСтрока.ДатаСобытия =
ДатаПриказа;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЗагрузитьСтудентовДляПриказаНаСервере(
Параметры,
ДополнительныеПараметры)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Абитуриенты.Студент КАК Студент,
| Абитуриенты.ГруппаЗачисления КАК Группа
|ИЗ
| РегистрСведений.РекомендованныеКЗачислению КАК Абитуриенты
|ГДЕ
| Абитуриенты.Период <= &ДатаПриказа
|
|УПОРЯДОЧИТЬ ПО
| Абитуриенты.Студент.ФИО";
Запрос.УстановитьПараметр(
"ДатаПриказа",
ДополнительныеПараметры.ДатаПриказа);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
&НаСервере
Процедура ПередЗаписьюНаСервере(
Отказ,
ТекущийЭлемент,
ПараметрыЗаписи)
Если НЕ ЗначениеЗаполнено(Номер) Тогда
Сообщить("Укажите номер приказа!");
Отказ = Истина;
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ВидПриказа) Тогда
Сообщить("Укажите вид приказа!");
Отказ = Истина;
Возврат;
КонецЕсли;
Если СписокСтудентов.Количество() = 0 Тогда
Сообщить("Добавьте студентов в табличную часть!");
Отказ = Истина;
Возврат;
КонецЕсли;
Для Каждого Строка Из СписокСтудентов Цикл
Если НЕ ЗначениеЗаполнено(Строка.Студент) Тогда
Сообщить("В табличной части есть строка без студента!");
Отказ = Истина;
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Строка.ДатаСобытия) Тогда
Сообщить("Укажите дату события для студента " + Строка.Студент.ФИО);
Отказ = Истина;
Возврат;
КонецЕсли;
Если ВидПриказа =
Перечисления.ВидыПриказа.Зачисление Тогда
Если НЕ ЗначениеЗаполнено(Строка.ГруппаНовая) Тогда
Сообщить("Укажите новую группу для студента " + Строка.Студент.ФИО);
Отказ = Истина;
Возврат;
КонецЕсли;
ИначеЕсли ВидПриказа =
Перечисления.ВидыПриказа.Перевод Тогда
Если НЕ ЗначениеЗаполнено(Строка.ГруппаНовая) Тогда
Сообщить("Укажите новую группу для студента " + Строка.Студент.ФИО);
Отказ = Истина;
Возврат;
КонецЕсли;
ИначеЕсли ВидПриказа =
Перечисления.ВидыПриказа.Восстановление Тогда
Если НЕ ЗначениеЗаполнено(Строка.ГруппаНовая) Тогда
Сообщить("Укажите новую группу для студента " + Строка.Студент.ФИО);
Отказ = Истина;
Возврат;
КонецЕсли;
ИначеЕсли ВидПриказа =
Перечисления.ВидыПриказа.Отчисление Тогда
ПоследнееЗачисление =
ПолучитьПоследнююДатуЗачисления(
Строка.Студент);
Если ЗначениеЗаполнено(ПоследнееЗачисление) Тогда
Если Строка.ДатаСобытия < ПоследнееЗачисление Тогда
Сообщить(
"Ошибка: дата отчисления не может быть раньше даты зачисления");
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Если ЕстьАкадемическиеЗадолженности(
Строка.Студент) Тогда
Сообщить(
"У студента "
+ Строка.Студент.ФИО
+ " есть академические задолженности.");
Отказ = Истина;
Возврат;
КонецЕсли;
ИначеЕсли ВидПриказа =
Перечисления.ВидыПриказа.АкадемическийОтпуск Тогда
ПоследнееЗачисление =
ПолучитьПоследнююДатуЗачисления(
Строка.Студент);
Если ЗначениеЗаполнено(ПоследнееЗачисление) Тогда
Если Строка.ДатаСобытия < ПоследнееЗачисление Тогда
Сообщить(
"Ошибка: дата начала отпуска не может быть раньше даты зачисления");
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
Если Строка.ДатаСобытия > ТекущаяДата() Тогда
Сообщить(
"Ошибка: дата начала отпуска не может быть позже текущей даты");
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроведения(Отказ, Режим)
Для Каждого Строка Из СписокСтудентов Цикл
Студент = Строка.Студент;
ОбъектСтудента =
Студент.ПолучитьОбъект();
СтарыйСтатус =
ОбъектСтудента.Статус;
НовыйСтатус =
СтарыйСтатус;
НоваяГруппа =
ОбъектСтудента.Группа;
Если ВидПриказа =
Перечисления.ВидыПриказа.Зачисление Тогда
НовыйСтатус =
Перечисления.СтатусыСтудентов.Зачислен;
НоваяГруппа =
Строка.ГруппаНовая;
ИначеЕсли ВидПриказа =
Перечисления.ВидыПриказа.Отчисление Тогда
НовыйСтатус =
Перечисления.СтатусыСтудентов.Отчислен;
ИначеЕсли ВидПриказа =
Перечисления.ВидыПриказа.Перевод Тогда
НоваяГруппа =
Строка.ГруппаНовая;
ИначеЕсли ВидПриказа =
Перечисления.ВидыПриказа.Восстановление Тогда
НовыйСтатус =
Перечисления.СтатусыСтудентов.Зачислен;
НоваяГруппа =
Строка.ГруппаНовая;
ИначеЕсли ВидПриказа =
Перечисления.ВидыПриказа.АкадемическийОтпуск Тогда
НовыйСтатус =
Перечисления.СтатусыСтудентов.АкадемическийОтпуск;
КонецЕсли;
ОбъектСтудента.Статус =
НовыйСтатус;
Если НоваяГруппа <>
ОбъектСтудента.Группа Тогда
ОбъектСтудента.Группа =
НоваяГруппа;
КонецЕсли;
ОбъектСтудента.Записать();
НаборЗаписей =
РегистрыСведений.ИсторияСтатусовСтудентов.СоздатьНаборЗаписей();
НоваяЗапись =
НаборЗаписей.Добавить();
НоваяЗапись.Период =
Дата;
НоваяЗапись.Студент =
Студент;
НоваяЗапись.Статус =
НовыйСтатус;
НоваяЗапись.Группа =
НоваяГруппа;
НоваяЗапись.Приказ =
Ссылка;
НоваяЗапись.ВидПриказа =
ВидПриказа;
НаборЗаписей.Записать();
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ЕстьАкадемическиеЗадолженности(Студент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Успеваемость.Дисциплина) КАК КолДолгов
|ИЗ
| РегистрНакопления.Успеваемость КАК Успеваемость
|ГДЕ
| Успеваемость.Студент = &Студент
| И Успеваемость.Оценка = 2";
Запрос.УстановитьПараметр(
"Студент",
Студент);
Результат =
Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Возврат Результат.КолДолгов > 0;
КонецЕсли;
Возврат Ложь;
КонецФункции
&НаСервере
Функция ПолучитьПоследнююДатуЗачисления(Студент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(История.Период) КАК ДатаЗачисления
|ИЗ
| РегистрСведений.ИсторияСтатусовСтудентов КАК История
|ГДЕ
| История.Студент = &Студент
| И История.Статус =
| ЗНАЧЕНИЕ(
| Перечисления.СтатусыСтудентов.Зачислен
| )";
Запрос.УстановитьПараметр(
"Студент",
Студент);
Результат =
Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Возврат Результат.ДатаЗачисления;
КонецЕсли;
Возврат Неопределено;
КонецФункции