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


&НаСервереБезКонтекста
Функция ПолучитьСтудентовВыбраннойГруппы(ВыбраннаяГруппа)
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Студенты.Ссылка КАК СсылкаСтудента
		|ИЗ
		|	Справочник.Студенты КАК Студенты
		|ГДЕ
		|	Студенты.Группа = &Группа
		|	И Студенты.Активен = ИСТИНА";
	
	Запрос.УстановитьПараметр("Группа", ВыбраннаяГруппа);
	
	РезультатЗапроса = Запрос.Visual() // Внутренний метод выполнения;
	РезультатЗапроса = Запрос.Выполнить();
	МассивСтудентов = Новый Массив;
	
	Если Не РезультатЗапроса.Пустой() Тогда
		Выборка = РезультатЗапроса.Выбрать();
		Пока Выборка.Следующий() Цикл
			МассивСтудентов.Добавить(Выборка.СсылкаСтудента);
		КонецЦикла;
	КонецЕсли;
	
	Возврат МассивСтудентов;
	
КонецФункции

&НаКлиенте
Процедура ЗаполнитьСтудентов(Команда)
	
	// Проверяем, заполнена ли группа в шапке документа
	Если Не ЗначениеЗаполнено(Объект.Группа) Тогда
		ПоказатьПредупреждение(, "Сначала выберите группу в шапке ведомости!");
		Возврат;
	КонецЕсли;
	
	// Получаем массив чистых ссылок на студентов с сервера
	МассивСтудентов = ПолучитьСтудентовВыбраннойГруппы(Объект.Группа);
	
	// Очищаем старые строки в таблице документа
	Объект.СписокСтудентов.Очистить();
	
	// Заполняем таблицу новыми данными
	Для Каждого ТекущийСтудент Из МассивСтудентов Цикл
		НоваяСтрока = Объект.СписокСтудентов.Добавить();
		НоваяСтрока.Студент = ТекущийСтудент;
		
		// По умолчанию ставим, что студент пришел
		НоваяСтрока.Посещаемость = ПредопределенноеЗначение("Перечисление.ВидыПосещаемости.Присутствовал");
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокСтудентовИтоговаяОценкаПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.СписокСтудентов.ТекущиеДанные;
	
	Если ТекущаяСтрока <> Неопределено Тогда
		
		// Переводим ввод в нижний регистр и убираем лишние пробелы
		ЗначениеОценки = НРег(СокрЛП(ТекущаяСтрока.ИтоговаяОценка));
		
		// Автозамена "ё" на "е", чтобы код понимал оба варианта
		ЗначениеОценки = СтрЗаменить(ЗначениеОценки, "ё", "е");
		
		// Подстраховка: если студент отсутствовал, не даем ставить оценку
		Если ТекущаяСтрока.Посещаемость = ПредопределенноеЗначение("Перечисление.ВидыПосещаемости.Отсутствовал") И ЗначениеЗаполнено(ЗначениеОценки) Тогда
			ТекущаяСтрока.ИтоговаяОценка = "";
			ПоказатьПредупреждение(, "Нельзя поставить оценку студенту, который отсутствовал на экзамене!");
			Возврат;
		КонецЕсли;
		
		// Если поле не пустое, проверяем корректность ввода
		Если ЗначениеЗаполнено(ЗначениеОценки) Тогда
			Если ЗначениеОценки <> "зачет" И ЗначениеОценки <> "незачет" Тогда
				
				ЧисловаяОценка = 0; 
				Попытка
					ЧисловаяОценка = Число(ЗначениеОценки);
				Исключение
					ЧисловаяОценка = 0;
				КонецПопытки;
				
				// Проверяем вхождение в рамки оценок от 1 до 5
				Если ЧисловаяОценка < 1 Или ЧисловаяОценка > 5 Тогда
					ТекущаяСтрока.ИтоговаяОценка = "";
					ПоказатьПредупреждение(, "Допустимые значения: цифры от 1 до 5, либо слова 'Зачет', 'Незачет'!");
				КонецЕсли;
				
			КонецЕсли;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокСтудентовПосещаемостьПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.СписокСтудентов.ТекущиеДанные;
	
	Если ТекущаяСтрока <> Неопределено Тогда
		// Если переключили на "Отсутствовал" — сбрасываем оценку
		Если ТекущаяСтрока.Посещаемость = ПредопределенноеЗначение("Перечисление.ВидыПосещаемости.Отсутствовал") Тогда
			Если ЗначениеЗаполнено(ТекущаяСтрока.ИтоговаяОценка) Тогда
				ТекущаяСтрока.ИтоговаяОценка = "";
				ПоказатьОповещениеПользователя("Внимание", , "Оценка сброшена, так как студент отсутствовал на экзамене!");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры