Имя: Пароль:
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С и больше ничего. Как реализовать случайную сортировку реквизитов  у справочника по коду реквизита? Я хочу вот такую реализацию: там где буду выводить вопрос и к нему ответы, ответы сортировать по реквизиту "ПорядокНомер" (код реквизита) и выводить отсортированные. По нажатию на кнопку меняю этот реквизит "ПорядокНомер" рандомно через генератор случайных чисел, например.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший