Имя: Пароль:
1C
1С v8
как получить случайный элемент справочника?
0 Балоун
 
10.03.12
09:02
собссно, делаю запрос всего, потом
Результат[ГСЧ.СлучайноеЧисло(0, Результат.Количество()-1)].Ссылка
меня смущает то, что приходится читать всю таблицу ради одного значения. есть ли более правильные методы?
1 MRAK
 
10.03.12
09:04
(0) можно по коду искать
2 Балоун
 
10.03.12
09:05
(1) думал. есть (возможны) разрывы из-за удалённых/помеченных
3 Птица
 
10.03.12
09:13
(0) ну если справочник очень большой, то можно сначала запросом выяснить количество, потом получить случайное число N, ну а потом уже - выбрать первые N в подзапросе, упорядочив покоду по возрастанию
а в запросе - выбрать первые 1, упорядочив по коду по убыванию.
но в принципе из-за сотни другой элементов можно так не заморачиваться
4 Балоун
 
10.03.12
09:19
(3) сейчас там где-то 2.7 КЭлементов. тормозов не ощущаю, всё работает. вопрос скорее познавательного характера.. выбрать первые N - это ж тоже в наихудшем случае чтение всей таблицы плюс запрос на выяснение количества ;)
5 MRAK
 
10.03.12
09:36
(2) если только в этом проблема, то можно вызывать функцию рекурсивно, проверяя, существует ли данный элемент и не помечен ли он на удаление
6 Балоун
 
10.03.12
09:40
(5) при чём тут рекурсия? да, можно генерить случайный код, до тех пор, пока не попадётся "правильный" элемент. наверное, даже быстрее будет..
7 Ненавижу 1С
 
гуру
10.03.12
09:43
если нужны данные 1244-го элемента, то достаточно получить ТОЛЬКО 1244 ссылки и взять максимальную, а у нее уже получить все ЕЕ данные
8 andrewks
 
10.03.12
09:44
можно генерить два случайных кода с некоторым разбегом, обеспечивающим вероятностью наличия в этом диапазоне эл-та близкой к 1, и потом
select top 1 from... where Code between &LeftBound and &RightBound
9 Балоун
 
10.03.12
09:45
(7) выбрать первые ГСЧ? опять в худшем случае буду читать всё ;)
10 Балоун
 
10.03.12
09:46
(8) интересно, спасибо. но в самом общем случае непригодно ж
11 Балоун
 
10.03.12
09:47
повторюсь: вопрос носит познавательный характер. я так люблю бороться за миллисекунды и количество строк кода ;)
12 andrewks
 
10.03.12
09:48
(10) это почему? имеешь в виду, если нет кода? ну, можно и через наименование, и т.п. сделать
13 Балоун
 
10.03.12
09:57
(12) если у нас в коде всякая белиберда типа 001 280 300, то между 500 и 600 ничего не найдёт
14 experimentator76
 
10.03.12
10:01
ориентироваться на код нельзя ни в коем случае
15 experimentator76
 
10.03.12
10:06
придется запросом выбрать непомеченные на удаление и не группы
и потом уже из ТЗ забирать случайные ссылки элементов
16 Мигрень
 
10.03.12
10:07
(11) Просишь пользователя загадать случайное слово. Далее - полнотекстовый поиск в справочнике по этому слову. Рекурсивно ищем, пока не найдем самое близкое по смыслу.

Мне кажется это будет оптимально, с точки зрения борьбы за миллилитры.
17 Балоун
 
10.03.12
10:07
(15) дык так и есть, обрати внимание на (0). интересуюсь, можно ли сделать красивше
18 experimentator76
 
10.03.12
10:08
(17) аха - увидел :)
19 experimentator76
 
10.03.12
10:12
(0)
нужно оптимизировать сам справочник то есть источник данных
добавить реквизит Порядок
1,2,3,..,n
и константу в которой будет содержаться n
далее все элементарно
20 Балоун
 
10.03.12
10:14
(19) код оракл? это уже было ;)
v8: Автонумерация строки справочника
21 experimentator76
 
10.03.12
10:15
(20) я еще маленький :) всю мисту не читал
само родилось
щас еще мысль есть...
22 experimentator76
 
10.03.12
10:26
платформа 8.2 предоставила возможность делать запросы штатными средствами к таблицам баз данных
значит мы можем подцепить "свою" же таблицу для работы с ней
вот я вытащил первые 10 из С.Номенклатура

IDRRef
6094a609-008e-11e1-be70-00151762fcc8
c2434ae5-0102-11e0-b989-00151762fcc8
c2434ae7-0102-11e0-b989-00151762fcc8
c2434ae9-0102-11e0-b989-00151762fcc8
34bb54e0-0108-11e0-b989-00151762fcc8
d680fe2a-011e-11e0-b989-00151762fcc8
e97a2cfa-0391-11e1-9433-00151762fcc8
e536dd37-0412-11de-b72b-00151762fcc8
e536dd39-0412-11de-b72b-00151762fcc8
e536dd3b-0412-11de-b72b-00151762fcc8

отсортировано по IDRRef то есть по ссылке элементов
видно что наблюдается закономерность формирования ссылок
изучив эту закономерность и переведя случайное число в шестнадцатиричное
можно спозиционироваться на нужную ссылку запросом к примеру
ГДЕ IDRRef = "e536dd3b-0412-11de-b72b-00151762fcc8"
23 experimentator76
 
10.03.12
10:28
IDRRef по умолчанию подтягивается в ВИД как тип УникальныйИдентификатор
но можно перевыбрать тип на Строка для своего источника данных и сравнивать с ним строку
24 Балоун
 
10.03.12
10:31
(22) прикольно, спасибо, с первого прочтения не дошло, вернусь ещё
25 experimentator76
 
10.03.12
10:33
(24) забыл добавить что курить надо Внешние источники данных
26 Ns33
 
10.03.12
10:44
ИМХО:
Если такое делать часто, то как в (19), если редко, то в (0).
А если как в (22), то нужно помнить, что элемент может быть удален и сгенерированная ссылка будет несуществующей.
27 experimentator76
 
10.03.12
10:50
(26) эти три варианта наверное окончательные
(0) просто и не требует доработок
(19) быстро, требует доработок конфы
(22) быстро, требует доработок конфы в случае обращения через ВИД
не требует если обращаться напрямую не через 1С
ну и требуется разобраться как формируется IDRRef
когда то читал по 1С7.7 а вот по восьмере не помню
вижу что у элементов последние две части похожи на последние две части родителя
28 andrewks
 
10.03.12
10:54
(22) это примерно то же самое, что и ориентироваться на код. ибо  могут быть как "пришлые" УИД, так и сгенерированные 1С-кодом
29 experimentator76
 
10.03.12
11:01
30 experimentator76
 
10.03.12
11:02
(28) пришлые это как? вроде как адинэсина гуиды формирует
31 andrewks
 
10.03.12
11:03
(13) нужно в начале "проинициализировать" алгоритм, узнать общее кол-во элементов, самый маленький и самый большой код. далее можно поступать так: генерить случайны код из диапазона и брать за левую границу, за правую границу всегда брать самый большой код.
32 experimentator76
 
10.03.12
11:03
(20) слушай так может вот зачем это надо было :))))
33 andrewks
 
10.03.12
11:03
(30) обмены, "ручная" генерация УИД в коде, и т.п.
34 МихаилМ
 
10.03.12
11:04
если генерировать случайное число из

из диапозона  min  max IDRRef

то нужно учитываить распределение элементов.

например если приначале работы был загружен большой справочник то
будут созданы элементы с случайным IDRRef  с +1 до n  

и сответственно в дальнейшем учитывать плотность создания элементов за сессию.
Ошибка? Это не ошибка, это системная функция.