как получить случайный элемент справочника? #599603


#0 by Балоун
собссно, делаю запрос всего, потом Результат[ГСЧ.СлучайноеЧисло(0, Результат.Количество-1)].Ссылка меня смущает то, что приходится читать всю таблицу ради одного значения. есть ли более правильные методы?
#1 by MRAK
можно по коду искать
#2 by Балоун
думал. есть (возможны) разрывы из-за удалённых/помеченных
#3 by Птица
ну если справочник очень большой, то можно сначала запросом выяснить количество, потом получить случайное число N, ну а потом уже - выбрать первые N в подзапросе, упорядочив покоду по возрастанию а в запросе - выбрать первые 1, упорядочив по коду по убыванию. но в принципе из-за сотни другой элементов можно так не заморачиваться
#4 by Балоун
сейчас там где-то 2.7 КЭлементов. тормозов не ощущаю, всё работает. вопрос скорее познавательного характера.. выбрать первые N - это ж тоже в наихудшем случае чтение всей таблицы плюс запрос на выяснение количества ;)
#5 by MRAK
если только в этом проблема, то можно вызывать функцию рекурсивно, проверяя, существует ли данный элемент и не помечен ли он на удаление
#6 by Балоун
при чём тут рекурсия? да, можно генерить случайный код, до тех пор, пока не попадётся "правильный" элемент. наверное, даже быстрее будет..
#7 by Ненавижу 1С
если нужны данные 1244-го элемента, то достаточно получить ТОЛЬКО 1244 ссылки и взять максимальную, а у нее уже получить все ЕЕ данные
#8 by andrewks
можно генерить два случайных кода с некоторым разбегом, обеспечивающим вероятностью наличия в этом диапазоне эл-та близкой к 1, и потом select top 1 from... where Code between &LeftBound and &RightBound
#9 by Балоун
выбрать первые ГСЧ? опять в худшем случае буду читать всё ;)
#10 by Балоун
интересно, спасибо. но в самом общем случае непригодно ж
#11 by Балоун
повторюсь: вопрос носит познавательный характер. я так люблю бороться за миллисекунды и количество строк кода ;)
#12 by andrewks
это почему? имеешь в виду, если нет кода? ну, можно и через наименование, и т.п. сделать
#13 by Балоун
если у нас в коде всякая белиберда типа 001 280 300, то между 500 и 600 ничего не найдёт
#14 by experimentator76
ориентироваться на код нельзя ни в коем случае
#15 by experimentator76
придется запросом выбрать непомеченные на удаление и не группы и потом уже из ТЗ забирать случайные ссылки элементов
#16 by Мигрень
Просишь пользователя загадать случайное слово. Далее - полнотекстовый поиск в справочнике по этому слову. Рекурсивно ищем, пока не найдем самое близкое по смыслу. Мне кажется это будет оптимально, с точки зрения борьбы за миллилитры.
#17 by Балоун
дык так и есть, обрати внимание на . интересуюсь, можно ли сделать красивше
#18 by experimentator76
аха - увидел :)
#19 by experimentator76
нужно оптимизировать сам справочник то есть источник данных добавить реквизит Порядок 1,2,3,..,n и константу в которой будет содержаться n далее все элементарно
#20 by Балоун
код оракл? это уже было ;)
#21 by experimentator76
я еще маленький :) всю мисту не читал само родилось щас еще мысль есть...
#22 by experimentator76
платформа 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 by experimentator76
IDRRef по умолчанию подтягивается в ВИД как тип УникальныйИдентификатор но можно перевыбрать тип на Строка для своего источника данных и сравнивать с ним строку
#24 by Балоун
прикольно, спасибо, с первого прочтения не дошло, вернусь ещё
#25 by experimentator76
забыл добавить что курить надо Внешние источники данных
#26 by Ns33
ИМХО: Если такое делать часто, то как в , если редко, то в . А если как в , то нужно помнить, что элемент может быть удален и сгенерированная ссылка будет несуществующей.
#27 by experimentator76
эти три варианта наверное окончательные просто и не требует доработок быстро, требует доработок конфы быстро, требует доработок конфы в случае обращения через ВИД не требует если обращаться напрямую не через 1С ну и требуется разобраться как формируется IDRRef когда то читал по 1С7.7 а вот по восьмере не помню вижу что у элементов последние две части похожи на последние две части родителя
#28 by andrewks
это примерно то же самое, что и ориентироваться на код. ибо  могут быть как "пришлые" УИД, так и сгенерированные 1С-кодом
#29 by experimentator76
вот ребята с IDRRef разбирались
#30 by experimentator76
пришлые это как? вроде как адинэсина гуиды формирует
#31 by andrewks
нужно в начале "проинициализировать" алгоритм, узнать общее кол-во элементов, самый маленький и самый большой код. далее можно поступать так: генерить случайны код из диапазона и брать за левую границу, за правую границу всегда брать самый большой код.
#32 by experimentator76
слушай так может вот зачем это надо было :))))
#33 by andrewks
обмены, "ручная" генерация УИД в коде, и т.п.
#34 by МихаилМ
если генерировать случайное число из из диапозона  min  max IDRRef то нужно учитываить распределение элементов. например если приначале работы был загружен большой справочник то будут созданы элементы с случайным IDRRef  с +1 до n   и сответственно в дальнейшем учитывать плотность создания элементов за сессию.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям