Имя: Пароль:
1C
 
Как перемешать реквизиты в справочнике?
🠗 (Волшебник 13.02.2020 14:34)
,
0 Reraru
 
13.02.20
14:16
Имеется справочник с реквизитами одного типа - строка, в которых есть записи. Какую задать команду или обработчик чтобы порядок реквизитов каждый раз был бы случайным?
1 ДенисЧ
 
13.02.20
14:17
ЯНХНП.
2 unbred
 
13.02.20
14:32
создавать реквизиты программно. прикрутить ГСЧ к их именам.
3 Reraru
 
13.02.20
14:32
(1) ЯНХНП ?
4 piter3
 
13.02.20
14:34
(3) Ты не можешь нормально описать проблему
5 Волшебник
 
модератор
13.02.20
14:34
Порядок реквизитов в справочнике всегда фиксированный.
Выводить куда-то их можете в любом порядке.
6 Reraru
 
13.02.20
14:35
(2) реквизиты справочника задаются так как есть - созданием элемента. Их может быть сколько угодно.
Моя цель при создании теста и ответа к нему, чтобы пользователь мог перемешать местами вопросы, а в вопросах заданные ответы
7 AlexPR111
 
13.02.20
14:36
(0) А зачем? Что за задача? Система защиты нетленки?
8 Fish
 
13.02.20
14:38
(6) "перемешать местами вопросы" - ты хотел сказать перемеЩать или именно перемеШать?
9 Reraru
 
13.02.20
14:38
(7) тест, при создании которого порядок фиксированный. А пользователю необходимо этот порядок нажатием кнопки изменить.
10 Fish
 
13.02.20
14:41
(9) А ты (5) внимательно прочитал?
11 IOANNscrp
 
13.02.20
14:41
(9) Код справочника рандомно прописывай по нажатию кнопки. И выводи вопросы отсортированные по коду
12 Reraru
 
13.02.20
14:42
(8) вопросов может быть сколько угодно, ответов в вопросе обычно 4 и более.
Ответы из другого вопроса должны перемешиваться так чтобы они оставались привязанными к созданному вопросу.

Например: Вопрос: сколько будет 2+2 = ?
а 1
б 2
в 4
г 5

Пользователь нажал перемешать ответы в вопросе и они поменялись

например:  Вопрос: сколько будет 2+2 = ?

а 2
б 1
в 5
г 4
13 Reraru
 
13.02.20
14:44
А с вопросами немного проще, допустим вопрос 2+2 был с номером 1, а вопрос кто полетел первым на луну 5. После перемешивания у вопросов стали другие номера, например 2+2 стал с номером 10, а вопрос кто полетел первым на луну 10.
Рандомно.
14 Reraru
 
13.02.20
14:45
(11) Не совсем понимаю. Объясните пожалуйста мне то что имеете ввиду на примере.
15 Reraru
 
13.02.20
14:46
(13) Опечатка: вопрос кто полетел первым на луну 16.
16 IOANNscrp
 
13.02.20
14:48
Ответы где храните?)
17 Reraru
 
13.02.20
14:48
(5) Каким образом? Например?
18 Reraru
 
13.02.20
14:49
(16) Вопросы в справочнике вопросов, а ответы в справочнике ответов.
19 FIXXXL
 
13.02.20
14:49
(15) Вопросы - справочник? Собери элементы в таблицу и мешай как хочешь. Выдача вопросов - цикл по ТЗ
20 IOANNscrp
 
13.02.20
14:50
В справочнике ответов изменять код элемента рандомно по нажатию или добавить реквизит сортировка и изменять его рандомно. При выводе вопросов сортировать ответы по этому реквизиту(коду)
21 FIXXXL
 
13.02.20
14:51
(19) + в ТЗ поле - НомерВопроса, заполняешь рандомно, сортируешь - ПРОФИТ!
22 FIXXXL
 
13.02.20
14:51
да не трогайте вы справочник. ему интерфейс рандомно надо сделать
23 Reraru
 
13.02.20
14:52
24 Reraru
 
13.02.20
14:55
(19) Вы имеете ввиду табличную часть ? Я присваиваю реквизиту вопроса - вопрос, а реквизиту ответа - ответ без табличной части
25 Reraru
 
13.02.20
14:56
(21) нет, пользователь не должен вручную менять номера (код) реквизиты местами.
26 Reraru
 
13.02.20
14:56
(20) реквизит сортировка ? Я с ним не знаком.
27 IOANNscrp
 
13.02.20
15:03
(26) В справочник "Ответы" добавляете реквизит "ПорядокНомер" по умолчанию заполняете 1,2...n соответственно. Там где будете выводить вопрос и к нему ответы, ответы сортировать по реквизиту "ПорядокНомер" и выводить отсортированные. По нажатию на кнопку меняйте этот реквизит "ПорядокНомер" рандомно через генератор случайных чисел, например.
28 Reraru
 
13.02.20
15:06
(22) https://sun9-20.userapi.com/c200824/v200824357/65c8d/3vEn65r5JNM.jpg
Поначалу смысл был в замене: содержимое с реквизитом кода 4 переносится в содержимое с реквизитом кода 2, но это будет происходить ограничено так как число ответов в вопросе тоже ограничено и если ответу присвоится код 5, а ответов в вопросе допустим 4 то это будет неправильно.
29 FIXXXL
 
13.02.20
15:06
(27) не надо переписывать справочник по каждому чЁху.
одновременно может отвечать куча народа
каждому - свою таблицу или табличную часть обработки, сортированную локально для пользователя
30 FIXXXL
 
13.02.20
15:07
(28) нарисуй таблицу Вопрос - Номер, заполни запросом Вопросы и в цикле Номера рандомно, отсортируй по Номер
31 FIXXXL
 
13.02.20
15:09
(30) таблица - не видна пользователю, по нажатию Далее на форме - перезаполняешь реквизит формы Вопрос следующей строкой таблицы Вопрос-Номер
32 IOANNscrp
 
13.02.20
15:09
(29) думаете серверная?)
33 Reraru
 
13.02.20
15:10
(29) над этим я тоже думаю, так как возможность перемешивать вопросы и ответы будет по идее только у создателя теста, а у проходящего этой возможности не будет, вместо этого я думаю над тем как реализовать переход от одного вопроса к любому другому который хочет пользователь
34 Reraru
 
13.02.20
15:10
(32) пока что нет
35 Reraru
 
13.02.20
15:15
(27) получается мне сначала нужно программно узнать код  каждого реквизита?
36 Reraru
 
13.02.20
15:16
(27) с проверкой на то имеются ли новые реквизиты
37 FIXXXL
 
13.02.20
15:18
(33) зачем только у создателя? создатель задает список вопросов. порядок РАНДОМНЫЙ - для каждого пользователя опросника.
38 IOANNscrp
 
13.02.20
15:19
(35) не понятны ваши амбиции), по правильному и с умом это как описал  FIXXXL.
39 Reraru
 
13.02.20
15:23
(38) достаточно когда создатель теста задал рандомный порядок ответов в вопросах каждому отвечающему. Если же отвечающий будет снова перемешивать вопросы то в первую очередь запутает сам себя.
40 FIXXXL
 
13.02.20
15:23
(35) лови

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    массивВопросов = Новый Массив;
    массивВопросов.Добавить("Что");
    массивВопросов.Добавить("Кто");
    массивВопросов.Добавить("Где");
    массивВопросов.Добавить("Зачем");
    
    НЧ = 0;
    Для Каждого Вопрос Из массивВопросов Цикл
        НоваяСтрока = ТаблицаВопросов.Добавить();
        НоваяСтрока.Вопрос = Вопрос;
        ГСЧ = Новый ГенераторСлучайныхЧисел(НЧ);
        НоваяСтрока.НомерДалее = ГСЧ.СлучайноеЧисло(0, 1000);
        НЧ = НоваяСтрока.НомерДалее;
    КонецЦикла;
    
    ТаблицаВопросов.Сортировать("НомерДалее");
    
КонецПроцедуры
41 FIXXXL
 
13.02.20
15:24
(39) Не надо этого. Открыл вопросник - получил сортировку.
42 Reraru
 
13.02.20
15:25
(41) а как будет код проверять уже существующие вопросы?
43 Reraru
 
13.02.20
15:26
(41) Вопросы и ответы задаются ведь в уже запущенном приложении 1С Предприятие
44 Reraru
 
13.02.20
15:29
(41) Я так понимаю, цикл не сможет работать с реквизитом ТекстВопроса справочника Вопросы ?
45 IOANNscrp
 
13.02.20
15:29
(42) код ничего создавать не будет, он будет брать уже существующие вопросы и рандомно каждый раз сортировать их при открытии пользователем
46 FIXXXL
 
13.02.20
15:36
(45) именно
или ТС чего-то скрывает :)
47 FIXXXL
 
13.02.20
15:37
(42) где существующие?
48 FIXXXL
 
13.02.20
15:37
(44) цикл только строки перебирает, он ни с чем не работает
49 IOANNscrp
 
13.02.20
15:41
(48) все это, конечно, хорошо, но ТС на рабочий стол вывел списки справочников, создал вопросы и ответы, и хочет их менять каждый раз, а это уже совсем другая история
50 Reraru
 
13.02.20
15:56
(40) (45) Я вижу созданный массив, но в данном случае он не нужен. Ведь созданные вопросы, вначале создаются пользователем в запущенном 1С, а затем записываются в реквизит ТекстВопросы - строка.
Думаю стоит показать взаимосвязь справочников:
https://vk.com/im?peers=c5_566449785_182236528_92638771&sel=548338439&tab=all

Но одну проблему я пока так и недоагадался как решить: Создатель теста может задать вопрос, а к вопросу несколько правильных ответов. Но у меня пока что может засчитывать 1 правильный ответ в вопросе, а как сделать чтобы могло засчитываться несколько  правильных ответов?.
51 Reraru
 
13.02.20
15:58
&НаКлиенте
Процедура НачатьТест(Команда)
    ТестВПроцессе=Истина;
    ЗапВопросыОтветы();
    Если ВопросыОтветы.Количество()=0 Тогда
        Предупреждение ("Тест не найден. Обратитесь к администратору");
        Возврат;
    КонецЕсли;    
    Элементы.Начало.Видимость=Ложь;
    Элементы.Тест.Видимость=Истина;
    НомерТекущегоВопроса=1;
    ЗапОтветы();
КонецПроцедуры


//ОткрытьФорму("ОбщаяФорма.Авторизация");


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

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

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

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

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

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

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

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


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

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

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

&НаКлиенте
Процедура Войти(Команда)
    ОткрытьФорму("ОбщаяФорма.Авторизация");
КонецПроцедуры
52 Reraru
 
13.02.20
16:07
(45) да, так оно и есть. Этого я и хочу.
53 Reraru
 
13.02.20
16:08
(48) но он же как я понял перебирает строки заданного массива, а не реквизиты справочника.
54 Reraru
 
13.02.20
16:25
проблема не решена
55 Reraru
 
13.02.20
16:36
(40) пытаюсь переделать под справочники - не работает.
56 Reraru
 
13.02.20
16:45
(40) а возможно ли чтобы значение реквизита при записи справочника записывалось бы в массив ?
57 Reraru
 
13.02.20
17:41
ни у кого больше нет идей?
58 unbred
 
13.02.20
22:22
забахай ты свою нетленку на JS , на сях, или ещё на чём. нафик тебе эти извращения? идей миллион, а инструмент выбрал для создания костылей.
59 Reraru
 
13.02.20
22:26
(58) это реализация под 1С
60 Reraru
 
13.02.20
23:29
(40) какие ещё существуют под мой случай сортировки, но чтобы данные читались из реквизита ТекстВопроса ?
61 Reraru
 
14.02.20
00:28
(58) у меня ограниченный инструмент: только 1С и больше ничего. Как реализовать случайную сортировку реквизитов  у справочника по коду реквизита? Я хочу вот такую реализацию: там где буду выводить вопрос и к нему ответы, ответы сортировать по реквизиту "ПорядокНомер" (код реквизита) и выводить отсортированные. По нажатию на кнопку меняю этот реквизит "ПорядокНомер" рандомно через генератор случайных чисел, например.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший