1. user1345957 13.02.20 20:46 Сейчас в теме

Проверка знаний тестированием на 1С. Создание и редактирование теста.

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

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

Справочник Ответы имеет форму элемента и форму списка: пока что без кода.
Найденные решения
19. Xershi 953 22.02.20 17:31 Сейчас в теме
Остальные ответы
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
2. dandykry 5 14.02.20 09:31 Сейчас в теме
(1) Видится 2 варианты.
1) Динамически создавать элементы на форме
2) Иметь таблицу значений со всем необходимым, у заранее подготовленного набора элементов менять ПутьКДанным и видимость, если варианта нет.

Например таблица "ТаблицаВопросов" с колонками :
ТекстВопроса, КоличествоВариантов, ВариантОтвета1, ОтметкаВариантОтвета1, ВариантОтвета2, ОтметкаВариантОтвета2, ВариантОтвета3, ОтметкаВариантОтвета3, ВариантОтвета4, ОтметкаВариантОтвета4, ВариантОтвета5, ОтметкаВариантОтвета5ВариантОтвета(Максимально возможный вашей системой), НомераПравильногоОтвет

Набор элементов на форме:
ТекстВопроса. ПолеФормы, Надпись. ПутьКДанным = "ТаблицаВопросов[N].ТекстВопроса
ОтметкаВариантОтвета1. ПолеФормы, Флажек. ПутьКДанным = "ТаблицаВопросов[N].ОтметкаВариантОтвета1
ВариантОтвета1. ПолеФормы, Надпись. ПутьКДанным = "ТаблицаВопросов[N].ВариантОтвета1

.....................
N - номер текущего вопроса. При ответе или смене вопроса, у всех элементов менять путьКДанным на нужную строку.

Во время вызова Ответить проверять строку. таблицы на совпадение НомераПравильногоОтвет и значения истина ложь в ОтметкаВариантОтвета1233456. В НомераПравильногоОтвет может быть несколько ответов или 1

Ну смысл надеюсь понятен. Подготовленная таблица с вопросами и заранее подготовленные элементы формы, при смене вопроса меняется ПутьКданным в таблице и видимость некоторых элементов, в зависимости от КоличествоВариантов в строке (понимаю что вопрос может содержать разное количество ответов)
user1345957; +1 Ответить
3. user1345957 14.02.20 22:19 Сейчас в теме
(2) Извините, немного не понял. Мне нужно создать табличную часть в которой будут вопросы и ответы а свои реквизиты перенести из справочника в его табличную часть?
Я наверное зря не упомянул что пишу конфигурацию в Управляемой форме.
4. dandykry 5 17.02.20 10:05 Сейчас в теме
(3) Наверное я вас обманул. Где-то пол года назад я делал нечто похожее, но не тест. В той задаче были более динамичные смены вариантов, поэтому я создавал элементы формы в процессе перехода. Для заранее созданных в конфигураторе это вроде бы не работает (может и работает)
Сейчас соберу и скину обработку. Пол часа
5. dandykry 5 17.02.20 11:34 Сейчас в теме
(3)
Да, я вас обманул. Нельзя подменять путькданным "ТаблицаВопросов[N].ОтметкаВариантОтвета1


Когда я делал, я пересоздавал элементы. В обработке пример.
Он уже рабочий, но ограничен количеством вариантов ответов только колонками ТаблицаВопросов (Заканчивается ВариантОтвета4). Собственно если колонки тоже создавать, то ограничение уйдет и будет неограниченное количество вариантов ответов (999 если честно, но и это не проблема)

Так же можно было выкрутиться добавлением реквизитов ТекущаяОтметкаВариантаОтвета1.....N как реквизиты ТекстТекущегоВопроса, но получится снова ограничение на количество ответов на вопрос.

Если сильно подумать, то ОтметкаВариантОтветаN лишние реквизиты, но как ранее написал так и сделал.
Собственно тема интересная)
Прикрепленные файлы:
ТестыВопросыДляТогоЧтобПоказать.epf
user1345957; +1 Ответить
6. user1345957 18.02.20 20:41 Сейчас в теме
(5) Спасибо, очень понятный пример. А как вы перемешиваете местами вопросы и ответы в них ? Возможно используя генератор случайных чисел с заданным диапазоном, но данный диапазон будет для каждого вопроса уникален.
Если в вопросе номер 1 - 2 ответа, то ГСЧ будет мешать только 2 ответа.
Или же, если в вопросе 4 ответа, то ГСЧ будет мешать местами только 4 ответа.
7. dandykry 5 19.02.20 08:03 Сейчас в теме
(6) Перемешивание я не делал (накидал на скорую руку). Там же нет и очистки ранее пройденных, при перелистывании назад нет отображения ранее выбранного, вычисления результата и пр. Можно думать, что это прототип.
Для перемешивания:
Думаю лучше перемешивать на этапе создания реквизитов или заполнения списка выбора. Псевдослучайности хватит. перемешивать будет очень слабо. Только если остаток от деления случайного числа будет не 0. Как не перемешивать тоже можно реализовать. Собственно творите. Если сложно с созданием элементов, то можно просто создать элементы-декорации и у них изменять заголовок (как я хотел менять путь к данным у существующий реквизитов)

	//2 Создать Элемент ТекстВопроса
		ЭлементТекстВопроса =  Форма.Элементы.Добавить("ЭлементТекстВопроса", Тип("ПолеФормы"), ГруппаВопроса);
		ЭлементТекстВопроса.Вид = ВидПоляФормы.ПолеНадписи;
		ЭлементТекстВопроса.ПутьКДанным = "ТаблицаВопросов["+ПорядковыйНомерВопроса+"].ТекстВопроса";
		
		//3. Создать 2 элемента и группу - отметка и текст варианта 
		
		МассивПозиций = Новый Массив;    //хранятся все неиспользованные варианты
		Для НомерВариантаВопроса = 1 По КоличествоВариантовОтвета Цикл
		    МассивПозиций.Добавить(НомерВариантаВопроса);
		КонецЦикла;
		
		Для Номер = 1 По КоличествоВариантовОтвета Цикл
			
			НомерВариантаВопроса = ПолучитьСлучайныйНомерВариантаОтвета(МассивПозиций);
			
----------------------------------------------------------------------

&НаСервере
Процедура ЗаполнитьОдновариантныйВопрос(ПараметрыВопроса)
	
	Элементы.ВыбранныйВариантОтвета.СписокВыбора.Очистить();
	КоличествоВариантовОтвета = ПараметрыВопроса.КоличествоВариантовОтвета;
	ТекстТекущегоВопроса =  ПараметрыВопроса.ТекстВопроса;
				
	МассивПозиций = Новый Массив;    //хранятся все неиспользованные варианты
	Для НомерВариантаВопроса = 1 По КоличествоВариантовОтвета Цикл
		МассивПозиций.Добавить(НомерВариантаВопроса);
	КонецЦикла;

	Для Номер = 1 По КоличествоВариантовОтвета Цикл
		
		НомерВариантаВопроса = ПолучитьСлучайныйНомерВариантаОтвета(МассивПозиций);
			
		НовыйВариантОтвета = Элементы.ВыбранныйВариантОтвета.СписокВыбора.Добавить();
		НовыйВариантОтвета.Значение = НомерВариантаВопроса;
		НовыйВариантОтвета.Представление = ПараметрыВопроса["ВариантОтвета" + НомерВариантаВопроса];
	КонецЦикла;

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

		
//------------------------------------	

&НаСервереБезКонтекста
Функция ПолучитьСлучайныйНомерВариантаОтвета(МассивПозиций)
	
	КоличествоИтераций = МассивПозиций.Количество();
	Генератор = Новый ГенераторСлучайныхЧисел();
	
	СлучайныйСдвиг = Секунда(ТекущаяДатаСеанса()); //0 - 59
	СлучайныйСдвигПоМинутам = Минута(ТекущаяДатаСеанса()); //0 - 59
	
	//0 - 118 
	СлучайноеЧисло = Генератор.СлучайноеЧисло(СлучайныйСдвиг, СлучайныйСдвиг + СлучайныйСдвигПоМинутам);
	СлучайнаяПозиция =  СлучайноеЧисло%КоличествоИтераций;
	
	ИндексВозврата = МассивПозиций[СлучайнаяПозиция];
	МассивПозиций.Удалить(СлучайнаяПозиция);
	
	Возврат ИндексВозврата;
	
КонецФункции
Показать
user1345957; +1 Ответить
9. user1345957 19.02.20 15:31 Сейчас в теме
(7) Спасибо, а возможно ли сделать такое же перемешивание только не к созданной таблице, а к справочникам.
К тому же у меня в любом случае идёт разделение ролей: админ, пользователь (задающий тест, в моём случае это преподователь) и пользователь (проходящий тест).
Прилагаю ИБ: в ней реализовано то что вы описали, но не реализовали.
Мне же не хватало только перемешивания и возможность засчитать 2 правильных ответа, если задано в вопросе 2 правильных ответа.
В заголовке вопроса у меня присваивается код к номеру вопросу. Например: созданный элемент с кодом 23, значит его номер вопроса будет 23.
Прикрепленные файлы:
Тест.rar
13. dandykry 5 19.02.20 20:44 Сейчас в теме
(9) Предлагаете мне сделать в вашей базе все?) Я посмотрю как будет время
17. user1345957 20.02.20 14:06 Сейчас в теме
(13) хорошо, спасибо, буду ждать. Тот вариант теста который вы мне предложили вместе с обработкой, я попытаюсь переделать как вариант прохождения экзамена.
8. dandykry 5 19.02.20 15:30 Сейчас в теме
(6) Короче вот. Все остальное за вами
Прикрепленные файлы:
ТестыВопросыДляТогоЧтобПоказать.epf
11. user1345957 19.02.20 17:18 Сейчас в теме
(8) блин. Я не понимаю для чего делать таблицу значений. С ней труднее будет права настраивать. А через справочники создать проще. К тому же по замыслу табличная часть должна только отображать результаты в виде таблицы с правильными ответами.
12. dandykry 5 19.02.20 20:42 Сейчас в теме
(11) сложно в обработку уложить целую конфигурацию. Таблица нужна, чтобы отображать вопросы. (В тесте же не 1 вопрос) В эту таблицу нужно загружать данные из ваших справочников. (Или эксел файл, или откуда душе или заказчику разработки угодно)
Предполагалось: справочник "Тесты" с табличной частью в которой составитель настраивает тесты(разные тесты с разным составом вопросов). Пишет в тч тексты вопроса и варианты ответа. Помечает какие верные. (Можно отдельно справочник "вопросы" с подготовленными вопросами, чтобы одни и те же вопросы выбирать в разные тесты).
Обработка - загружает в тч подготовленный тест и показывает испытуемому варианты ответов. Позже подсчитывает результат. (Можно печатную форму сделать) Возможно куда то сохраняет.
Какие права и на что нужно настраивать я не понимаю. Не понимаю зачем к чему отдельный справочник на ответы.
Справочник Вопросы с реквизитами : текст вопроса, варианты ответов, пометка, что вопрос содержит несколько ответов, номер правильного ответа.
Справочник Тесты, который содержит перечень элементов первого справочника.
Обработка чтобы в ее таблицу все это загрузить.
14. user1345957 19.02.20 22:45 Сейчас в теме
(12) Да не нужно всё укладывать в одну обработку. Нужно всё уложить в конфигурацию. Проблем с импортом из экселя в справочник у меня слава богу нет, я пока что не включил возможность импорта как в другой своей конфигурации.
Вы возможно заметили что я для упрощения всё разложил на 2 справочника: вопросы и ответы, а уже потом на главной форме я собираю воедино и вопросы и ответы и прохождение теста.
Человек не задаёт в таблицу вопросы и ответы, взамен этому я хотел дать возможность самому пользователю решать сколько вопросов и ответов он захочет разместить на одной странице.
Минимум 2 в зависимости от величины получившегося вопроса с вариантами ответа.
Как вы возможно догадались, один пользователь это преподователь: он задаёт тест с вопросами и сразу же отмечает для себя правильные ответы. При этом он это видит.
Второй пользователь, который является студентом (с учётом его личных данных и главное группы) проходит созданный преподователем тест.
Ни один вопрос и ответ не должны задаваться программно, иначе мы просто лишим смысла работы преподователя, а уж в код он точно не будет лезть разбираться.

Поэтому я миную таблицу, для создания теста она не нужна. Максимум нужна только одна таблица: 1 колонка номер вопроса, вторая номер ответа, и над таблицей исходя из числа правильных ответов оценка. Это для того чтобы прошедший студент тест увидел номера правильных ответов, заданных изначально.
16. dandykry 5 20.02.20 07:16 Сейчас в теме
(14) Хорошо. У нас разные взгляды. Вам виднее

http://prntscr.com/r4xesq
18. user1345957 22.02.20 12:52 Сейчас в теме
(16)
Предлагаете мне сделать в вашей базе все?) Я посмотрю как будет время
.хорошо, спасибо, буду ждать. Тот вариант теста который вы мне предложили вместе с обработкой, я попытаюсь переделать как вариант прохождения экзамена.
19. Xershi 953 22.02.20 17:31 Сейчас в теме
10. user1345957 19.02.20 15:51 Сейчас в теме
15. user1345957 19.02.20 22:56 Сейчас в теме
Я подчёркиваю то почему делаю тест именно на справочниках и общей форме: всё наглядно и просто, обычному пользователю. Уж поверьте, я показывал свою первую наработку учителю физ-ры, показал всего 2 раза куда что записать и где нажать и он запомнил это. А значит и усилия будущего интерфейса оценены по достоинству. Я предлагал в виде таблице, сначала как и вы, мне была интересна реакция, исходя из которой я решил перестроить тест похожий на вашу обработку в справочниках.
Также, я хочу в будущем добавить возможность загружать картинку и по выбору пользователя отображать.
Паролей на информационную базу пока нет, так как грубо говоря, она ещё неготова.
Прикрепленные файлы:
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Специалист 1 категории (Методист-аналитик 1С)
Фрязино
зарплата от 100 000 руб.
Полный день

Главный архитектор 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (Оперативный учет)
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист по 1С:ЗУП
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день

Программист по 1С:Бухгалтерии
Санкт-Петербург
зарплата от 120 000 руб. до 150 000 руб.
Полный день