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