PDA

Просмотр полной версии : Разработка конфигурации Тест.



Reraru
13.02.2020, 22:49
Есть справочник Вопросы содержащий реквизит ТекстВопроса (тип строка) и справочник Ответы с реквизитом правильный ответ (булево). Вместе, эти 2 справочника нужны чтобы пользователь мог составить тест тому кого собирается тестировать: вводится текст вопроса в реквизит ТекстВопроса :)
1 Перемешивание вопросов и ответов которые заданы к вопросу.
Какую задать команду или обработчик чтобы порядок реквизитов каждый раз был бы случайным?
Пользователь при нажатии на кнопку перемешает созданный порядок вопросов и ответов к ним, причём изменяются только номер вопроса и положение реквизитов в созданном вопросе.
Возможный вариант: прикрутить ГСЧ к их именам, но я пока не знаю как именно это нужно сделать. :confused:
Второй вариант: код справочника рандомно прописывается по нажатию кнопки. И выводи вопросы отсортированные по коду. Но здесь следует учесть что код будет в пределах заданных ответов отдельно к каждому вопросу: в одном вопросе может быть разное число ответов.
2 Выбор нескольких вариантов правильных ответов проходящим тест и их засчитывание как верное, если пользователь при создании вопроса задал несколько правильных ответов. Пока что я не знаю как это реализовать, у меня получилось сделать пока что только так: 1 вопрос - 1 верный ответ.
3 Как уместить несколько вопросов с ответами на одной странице, и кнопкам: назад и вперед задать горячие клавиши на лево и право (я про кнопки в виде стрелок) ? :confused:

https://sun9-20.userapi.com/c200824/v200824796/675c4/UcloaaLCFkQ.jpg

1. Код формы Главная: эта страница по которой пользователь после авторизации или регистрации, в случае если он гость, попадает на страницу где по нажатию кнопки Начать тест он проходит тест.


&НаКлиенте
Процедура НачатьТест(Команда)
ТестВПроцессе=Истина;
ЗапВопросыОтветы();
Если ВопросыОтветы.Количество()= 0 Тогда
Предупреждение ("Тест не найден. Обратитесь к администратору");
Возврат;
КонецЕсли;
Элементы.Начало.Видимость=� �ожь;
Элементы.Тест.Видимость=Ис� �ина;
НомерТекущегоВопроса=1;
ЗапОтветы();
КонецПроцедуры


&НаКлиенте
Процедура УстановитьВидимость()
Если НомерТекущегоВопроса=1 Тогда
Элементы.Назад.Видимость=Л� �жь;
Элементы.ЗавершитьТест.Вид имость=Ложь;
ИначеЕсли ВопросыОтветы.Количество()= НомерТекущегоВопроса Тогда
Элементы.Вперед.Видимость=� �ожь;
Элементы.ЗавершитьТест.Вид имость=Истина;
Иначе
Элементы.Назад.Видимость=И� �тина;
Элементы.Вперед.Видимость=� �стина;
Элементы.ЗавершитьТест.Вид имость=Ложь;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Вперед(Команда)
НомерТекущегоВопроса=Номе� �ТекущегоВопроса+1;
ЗапОтветы();
КонецПроцедуры

&НаКлиенте
Процедура Назад(Команда)
НомерТекущегоВопроса=Номе� �ТекущегоВопроса-1;
ЗапОтветы();
КонецПроцедуры

&НаКлиенте
Процедура ЗапОтветы()
УстановитьВидимость();
ЗапОтветыНаСервере();
КонецПроцедуры

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

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

&НаСервере
Функция ПроверкаОтветаНаВсеВопрос ы(КолПО)
фл=Истина;
Для Каждого Стр Из ВопросыОтветы Цикл
Если Стр.Ответ.Пустая() Тогда
фл=Ложь;
Сообщить("Вы не ответили на "+Стр.Вопрос.Наименование);
КонецЕсли;
Если Стр.Ответ.ПравильныйОтвет Тогда КолПО=КолПО+1; КонецЕсли;
КонецЦикла;
Возврат фл;
КонецФункции

&НаКлиенте
Процедура ЗавершитьТест(Команда)
ОтветНаВопрос=Вопрос("Вы действительно хотите закончить тест?",РежимДиалогаВопрос.ДаНет);
Если ОтветНаВопрос=КодВозврата� �иалога.Нет Тогда Возврат КонецЕсли;
КолПО=0;
Если НЕ ПроверкаОтветаНаВсеВопрос ы(КолПО) Тогда Возврат КонецЕсли;
ТестВПроцессе=Ложь;
Элементы.Тест.Видимость=Ло� �ь;
Элементы.РезультатТекст.За головок="Вы ответили правильно на "+КолПО+" вопросов из "+ВопросыОтветы.Количество() ;
Элементы.РезультатТекст.Ви димость=Истина;


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


&НаКлиенте
Процедура ВариантОтветаПометкаПриИз менении(Элемент)
Стр=Элементы.ВариантОтвета .ТекущиеДанные;
Если Стр.Пометка Тогда
Для Каждого Зн Из ВариантОтвета Цикл
Если Стр.Значение=Зн.Значение Тогда Продолжить КонецЕсли;
Зн.Пометка=Ложь;
КонецЦикла;
Зн=ВопросыОтветы.Получить(� �омерТекущегоВопроса-1);
Зн.Ответ=Стр.Значение;
Иначе
Зн=ВопросыОтветы.Получить(� �омерТекущегоВопроса-1);
Зн.Ответ=NULL;
КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ТестВПроцессе=Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
Отказ=ТестВПроцессе;
КонецПроцедуры

&НаКлиенте
Процедура Войти(Команда)
ОткрытьФорму("ОбщаяФорма.Авторизация");
КонецПроцедуры



2. Код формы элемента и формы списка справочника Вопросы.
https://sun9-71.userapi.com/c200824/v200824796/6751e/trJMoFANru0.jpg
https://sun9-16.userapi.com/c200824/v200824796/6753f/3bO_72OuoAY.jpg

Справочник Ответы имеет форму элемента и форму списка: пока что без кода.

Reraru
14.02.2020, 08:14
Я жду ответы, консультации и помощи с примерным кодом.