Имя: Пароль:
1C
1С v8
Функция Найти() в таблицах и запрос в цикле
0 Dmitry_333
 
02.02.19
21:49
Всем здрасьте.
Вот какие думы обуяли меня субботним вечером:)
Как я понимаю, в основе метода Найти() лежит тот же запрос. Так вот если я, допустим, перебираю элементы массива и делаю сравнение на совпадение значения элемента значению в какой-либо таблице данным методом является ли это, формально, запросом в цикле?:)
1 ДенисЧ
 
02.02.19
21:57
Нет.
Найти() работает в памяти и никак не лезет к скулю.
2 Гобсек
 
02.02.19
22:29
Выгрузить данные в таблицу и обращаться через Найти() и НайтиСтроки() в цикле - это один из способов избежать тормозов. Я не уверен, что это приветствуется методистами от фирмы 1С, но это работает.
3 nicxxx
 
02.02.19
22:31
(2) Таблицу не забыть проиндексировать
4 exwill
 
02.02.19
23:49
(0) "Вот придет запрос в цикле и съест тебя."
Сказка для маленьких одинесят.
5 youalex
 
03.02.19
00:32
(0) Формально нет. Ссылка она и есть ссылка. Но если ты будешь искать, например, наименовние, как  Найти(ссылка.Наименование) - то это будет хуже запроса в цикле.
6 Dmitry_333
 
03.02.19
01:16
Благодарю всех за разъяснения.
(1) если не затруднит, объясните, пожалуйста, что значит - "работает в памяти".
7 France
 
03.02.19
01:33
(0) не мучай себя, друг.. вот тебя от разрабов бсп. https://its.1c.ru/db/v8std
8 France
 
03.02.19
01:34
(6) не верь.. работать в памяти или на диске решает не 1С а винда..
9 France
 
03.02.19
01:34
или, иже с ним
10 Мимохожий Однако
 
03.02.19
09:46
(1) Когда много цикличных операций Найти() в цикле, то есть смысл подумать о получении нужных данных через запрос к таблицам , т.к. замеры показывают неэффективность.
11 Лефмихалыч
 
03.02.19
10:25
(0) Найти() в таблице - это не запрос к БД. Но все равно Найти() в цикле по неиндексированному полю делают только мудаки
12 exwill
 
03.02.19
11:44
(11) А если поиск идет в 4-х записях?
13 Лефмихалыч
 
03.02.19
13:33
(12) тогда таблица вообще не нужна
14 exwill
 
03.02.19
14:15
(13) Можно написать 4 "если"?
А если в 14 записях? 14 раз будете писать "если"?
15 hhhh
 
03.02.19
14:18
(14) сделать еще одно поле, как сумму 14 полей. По нему и искать. Это же элементарно.
16 NorthWind
 
03.02.19
14:19
С (11) не очень согласен. Экспериментально делал НайтиСтроки () по индексированному и неиндексированному полю в ТЗ размером примерно 20 000 - 40 000 тыс строк, и да, как раз в цикле. Выигрыша за счет индексации на таких выборках почти нет. 30 секунд и 33.
17 NorthWind
 
03.02.19
14:19
так что все очень "если"...
18 Гобсек
 
04.02.19
01:51
(16) Только что провел на файловой базе аналогичный эксперимент. Количество записей в таблицах 20-30 тыс. При использовании индекса отчет формируется быстрее всего на несколько секунд. 1 мин 30 сек против 1 мин 35 сек.
19 Гобсек
 
04.02.19
01:52
(18) + функция НайтиСтроки()
20 H A D G E H O G s
 
04.02.19
02:31
(18) Иногда проще сделать merge
21 NorthWind
 
04.02.19
22:49
(18) а какая разница, какая база? ТЗ же в памяти. И ее индексы тоже. Возможно, выигрыш будет на реально больших ТЗ в миллионы строк, где потребуется подгрузка страниц с диска, если 1С вообще это позволит сделать. Тут не знаю. Но на мелких НайтиСтроки работает хорошо и без индексации.
22 NorthWind
 
04.02.19
22:53
А так 1С очень своеобразно иногда реализует работу с ТЗ... Вот: http://catalog.mista.ru/public/617455/
23 palsergeich
 
04.02.19
22:57
(16) А индекс точно корректен?
Пол года делал: 30+ К строк - не индексировано = 30 сек, индексировано - меньше секунды.
24 NorthWind
 
04.02.19
23:09
(23) индекс даёт прирост, но несущественный. Судить о его корректности сложно, потому что там нет никаких настроек, если я верно помню. Он, индекс, либо есть по этой колонке, либо его нет. И всегда можно поэкспериментировать. Я уверен, что могут быть случаи когда он полезен.
25 NorthWind
 
04.02.19
23:11
Кстати, ещё момент - если в таблицу идёт добавление в этом же цикле, можем получить накладные расходы на перестройку индекса. И опять же итог неоднозначен.
26 palsergeich
 
04.02.19
23:12
(24) Если он был по 1 колонке то странно.
Там в теле обработки нигде неявно не могло идти получение представления?
27 palsergeich
 
04.02.19
23:13
Просто ну очнь странный результат
28 pavig
 
04.02.19
23:21
Индекс даёт существенный прирост, в разы или даже десятки раз. Проверял не раз на больших таблицах при поиске в цикле.
в (16) какая-то ошибка. Может, индекс был неправильный, или еще чего.
29 Конструктор1С
 
05.02.19
03:01
(16) тут всё очень зависит от селективности индекса и количества повторений поиска. Если ищешь пять раз по полю, записи которого заведомо уникальны, то индекс не рулит. А если ищешь значения, которые повторяются по 10-50 раз на 10000, и многократно повторяешь поиск, то индекс рулит. Сама фирма 1С рекомендует обязательно индексировать колонки ТЗ, в которых многократно выполняется поиск:
https://its.1c.ru/db/v8std#content:2149184101:hdoc
30 Конструктор1С
 
05.02.19
03:03
+(29) а если используется НайтиСтроки(), и проиндексированы поля под поиск, то выигрыш обязан быть.
31 Гобсек
 
05.02.19
04:22
(29) в статье по ссылке ответы из первых рук на все вопросы. Индексацию полагается делать. Хуже от этого не будет.
32 Гобсек
 
05.02.19
04:37
(21) в моем примере указаны размеры таблиц значений. Как я для себя сделал вывод, основная работа заключается в формировании табличных документов а не в операциях поиска.