Имя: Пароль:
1C
 
Случайные цвета в 1с
0 sergqwert
 
06.12.21
21:06
Имеется справочник "случайные цвета" с реквизитом ЦветXML. Каждый элемент справочника содержит в себе цвет в RGB формате (255, 255, 255). Повторяться цвета элементов справочника не должны.
Имеется документ "случайно выбранный цвет". В нем реквизит, ссылка на справочник "случайные цвета".
Как реализовать заполнение 100 000 таких документов, в случайном порядке?
Как реализовать отчёт, который покажет абсолютное и % соотношение цветов, встречающихся в документе?
Абсолютное - просто количество считается, %: если 1000 красных документов, то это 1% от 100000 документов (1 000 / 100 000 * 100 = 1%).

Заполнение документа:
ГСЧ = Новый ГенераторСлучайныхЧисел(255);

Для Сч = 1 По 100000 Цикл
СлучайныйСимвол = ГСЧ.СлучайноеЧисло(0,1000);
Документ1 = Документы.СлучайноВыбранныйЦвет.СоздатьДокумент();
Документ1.Дата = ТекущаяДата();
Документ1.ВыбранныйЦвет = Справочники.СлучайныеЦвета.НайтиПоНаименованию("Цвет");
Документ1.Записать();
КонецЦикла;

Выдает только один цвет1, а их в справочнике 5: цвет1, цвет2. цвет3, цвет4, цвет 5.

отчет на СКД:
ВЫБРАТЬ
СлучайноВыбранныйЦвет.Ссылка КАК Ссылка,
СлучайноВыбранныйЦвет.ВыбранныйЦвет.ЦветXML КАК ВыбранныйЦвет,
СУММА(1) КАК Количество
ИЗ
Документ.СлучайноВыбранныйЦвет КАК СлучайноВыбранныйЦвет

СГРУППИРОВАТЬ ПО
СлучайноВыбранныйЦвет.Ссылка
1 Мимохожий Однако
 
06.12.21
21:57
Т.е в реквизит ВыбранныйЦвет записываешь один и тот же элемент с наименованием "Цвет"?
2 Asmody
 
06.12.21
21:57
(0) "100 000 таких документов, в случайном порядке" - заполняй последовательно, потом выбирай случайный
3 H A D G E H O G s
 
06.12.21
22:03
Мне одному это кажется бредом шизоида?
4 Смотрящий
 
06.12.21
22:07
Не один ты нормальный
5 mistеr
 
07.12.21
00:17
(3) Обычная учебная задача недалекого препода.
6 mistеr
 
07.12.21
00:22
(0) Насколько я понял, основная проблема у тебя — как преобразовать случайное число в элемент справочника. Для этого нужно пронумеровать справочник цветов последовательно и брать элемент по коду.

Если препод упрется, что нельзя менять структуру метаданных, то придется использовать запрос с ВЫБРАТЬ ПЕРВЫЕ N, где N случайное число.
7 azernot
 
07.12.21
00:24
Получить массив всех цветов мз справочника, и далее получать случайный элемент массива через случайное число от нуля, до размера массива-1
8 ИУБиПовиц
 
07.12.21
08:22
>>СлучайныйСимвол = ГСЧ.СлучайноеЧисло(0,1000);
Почему до 1000?, все цвета в эту последовательность не влезут. Нужно либо до больше либо три переменных, для RGB отдельно.

>>Документ1.ВыбранныйЦвет = Справочники.СлучайныеЦвета.НайтиПоНаименованию("Цвет");
Ну правильно:) прервый цвет и находит.
Нужно либо преобразовывать случайное число в ЦВЕт и искать по реквизиту цвет (хз в запросе можно отобрать, никогда не делал такого:))
либо преобразовывать ЦВЕТ в составляющие и по ним отбор делать . Ну как то так.
9 PLUT
 
07.12.21
10:09
+ (2)

> Как реализовать заполнение 100 000 таких документов, в случайном порядке?

заполнить последовательно документы и случайным образом установить НомерДок :)
10 PLUT
 
07.12.21
10:17
(9) невнимательно условие из (0) прочитал...

последовательно справочник случайных цветов заполняется, чтобы цвета элементов не повторялись. Код справочника числовой

а дальше простой цЫкл для создания 100 тыс документов

и внутре цЫкла можно запросом или

НовыйДокумент.ВыбранныйЦвет = Справочники.СлучайныеЦвета.НайтиПоКоду(ГСЧ.СлучайноеЧисло(0, ВсегоСлучайныхЦветов));
11 УдавВПопугаях
 
07.12.21
10:30
надо сначала пронумеровать цвета из справочника, метеадныее трогать необязательно.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номер");
ТЗ.Колонки.Добавить("Ссылка");

Н = 1;

Выборка = Справочники.Цввета.Выбрать();
Пока Выборка.Следующий() Цикл
Новая = ТЗ.Добавить();
Новая.Номер = Н;
Новая.Ссылка = Выборка.Ссылка;
Н = Н + 1;
КонецЦикла;

Для Сч = 1 По 100000 Цикл
СлучайныйЦифра = ГСЧ.СлучайноеЧисло(0, Н);
Документ1 = Документы.СлучайноВыбранныйЦвет.СоздатьДокумент();
Документ1.Дата = ТекущаяДата();
Документ1.ВыбранныйЦвет = ТЗ.Найти(СлучайныйцЦифра, "Номер").Ссылка;
Документ1.Записать();
КонецЦикла;
12 УдавВПопугаях
 
07.12.21
10:31
пронумеровать можно и запросом к справочнику с АвтономерЗаписи, но генератору нужно верхний предел передать, известен он будет в результате запроса
13 arsik
 
гуру
07.12.21
10:37
(10) Это долго. Нужно просто все цвета в массив запихнуть.
А потом
максИндексВМассиве = мЦветов.Количество()-1;
СлучайныйЦвет = мЦветов[ГСЧ.СлучайноеЧисло(0, максИндексВМассиве)];
14 УдавВПопугаях
 
07.12.21
10:40
пусть массив, непринципиально, ему код надо написать, сам врядли понимает что происходит
отчет - на скд, совсем ерунда
15 fisher
 
07.12.21
12:26
Я бы генерил псевдослучайное число в пределах 16581375, раскладывал его на RGB, искал такой в справочнике, если нет - создавал новый элемент. Отчет тоже тривиальный, не понимаю в чем затык.
16 fisher
 
07.12.21
12:34
Получившийся номер оттенка можно тупо в качестве номера элемента справочника и использовать. Искать удобно будет.
17 Kassern
 
07.12.21
12:44
(0) Имеется справочник "случайные цвета" - какое-то странное название справочника. Я понимаю, если бы там были элементы - определенные диапазоны, а цвет из диапазона уже получался бы случайным образом. В вашем же случае - цвета случайные лишь в документах, в справочнике просто перечень цветов.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.