Имя: Пароль:
1C
1С v8
чем заменить НайтиСтроки() ?
0 gosn1ck
 
19.06.12
09:43
всем известно что у таблицы значений метод НайтиСтроки работает очень медленно, собственно вопрос: а чем его заменить?
1 Irbis
 
19.06.12
09:44
Запросом, но вряд ли быстрее будет
2 Агент Инфостарта
 
19.06.12
09:44
1. Запросом.
2. Перебором.
3 DrShad
 
19.06.12
09:45
хрена себе очень медленно по сравнению с чем?
4 Trier
 
19.06.12
09:46
(2) Да уж, перебором очень выгодно заменять НайтиСтроки()...
5 Buster007
 
19.06.12
09:47
кому всем? и почему медленно?
6 Нуф-Нуф
 
19.06.12
09:48
и с чего это запрос будет медленее?
7 gosn1ck
 
19.06.12
09:48
операция выполняется 20тыс раз. запрос в цикле будет работать быстрее?
8 DrShad
 
19.06.12
09:49
(7) а накуя запрос в цикле? и с какого перепугу 20000 раз искать строки?
9 Нуф-Нуф
 
19.06.12
09:49
(7) фигасе подача. ты где в сабже про цикл говорил, индеец, а теперь что-то предъявляешь.
10 Buster007
 
19.06.12
09:50
(7) и много уходит на поиск? Проиндексируй ТЗ по тем полям по которым осуществляешь поиск и будет тебе счастье. У меня и на больших количествах всё летало.
11 Cube
 
19.06.12
09:51
(9) ))))))))))))))
+1
12 Нуф-Нуф
 
19.06.12
09:51
в любом случае (10) прав. запрос с индексами грамотнее НайтиСтроки, которые работают простым перебором
13 gosn1ck
 
19.06.12
09:52
окей спасибо
14 andrewks
 
19.06.12
09:52
добавить индексы ещё не предлагали?
15 Ненавижу 1С
 
гуру
19.06.12
09:52
НайтиСтроки не работает с условиями типа "Сумма>0 И НДС<>0"
16 zinch
 
19.06.12
10:36
Построитель
17 H A D G E H O G s
 
19.06.12
10:42
Индексы аутору могут и не помочь.
18 H A D G E H O G s
 
19.06.12
10:42
(12) Запрос идет ф топку.
19 H A D G E H O G s
 
19.06.12
10:44
20 тыс раз  искать - это каким смелым надо быть... Тут один лишний раз заставишь по таблице сложно искать - задумаешься.
20 Buster007
 
19.06.12
10:50
(19) такое ощущение, что цифра в 20 тыс очень большая. Может быть стоит попробовать, а потом делать выводы?
У меня максимально где-то 65 тыс раз искалось причем методом НайтиСтроки(). Замедлений не обнаружено.
21 H A D G E H O G s
 
19.06.12
10:54
(20) Если это ТЗ - кэш к примеру, и данные идут потоком, как при обмене - тогда хоть 100500 раз пусть ищется. В другом случае - надо смотреть алгоритм.

Зря так автор, зря зря зря.

p.s. Я его разозлить пытаюсь, чтобы он код выложил, а мы бы посочувствовали.
22 experimentator76
 
19.06.12
10:56
(0) давай уже рассказывай о чем цикл

найтистроки ищет в памяти, но тупой - то есть ищет по равно
запросом создает ВТ в базе, в принципе скуль оптимизирует доступ к данным и не всегда чтение идет с диска
кроме того запрос более гибкий по критериям отбора

все зависит от задачи - возможно можно разбить ТЗ на готовые варианты без постоянного поиска по ней
23 Rovan
 
гуру
19.06.12
10:57
(0) индексы + есть еще способ доп. кеширование найденных строк например в соответствие
это на случай если велика вероятность что по таким значениям поиск будет повторяться
24 H A D G E H O G s
 
19.06.12
10:59
(23) Глупость.
25 gosn1ck
 
20.06.12
14:53
мне обработка в наследство досталась, очень клёвым образом выводит отчет-шахматка. алгоритм таков: 1) выборка по колонкам (складам) 2) выборка по строкам (номенклатуре) 3) ТЧ в которой имеются данные по продажам и остаткам (по каждому складу и остаткам). после того как данные получены делается перебор 1ой выборки в этом же цикле 2ой, а затем поиск нужных данных.

Пока ВыборкаСклад.Следующий() Цикл
   Пока ВыборкаНомен.Следующий() Цикл
                   
       Отбор = Новый Структура;
       Отбор.Вставить("Номенклатура",    ВыборкаНомен.Номенклатура);
       Отбор.Вставить("Склад",        ВыборкаСклад.Склад);

       НайденнаяСтрока    = ТЗГруппа.НайтиСтроки(Отбор);
       
       // вывод данных из найденных строк

   КонецЦикла;
КонецЦикла;
26 gosn1ck
 
20.06.12
14:55
вот всё это я и пытаюсь ускорить... кстати насчет индексов я так и не понял добавить нужные поля после ключевого слова "ИНДЕКСИРОВАТЬ ПО" в запросе или воспользоваться индексами конечного ТЗ?
27 aleks-id
 
20.06.12
14:55
какой шикарный копроалгоритм. в мемориз!
переписывай обработку и делай все запросом.
28 aleks-id
 
20.06.12
14:57
кстати, на СКД такой отчет накидывается за 10 минут
29 gosn1ck
 
20.06.12
15:01
спасибо, но не всё так просто. я привел общий алгоритм как это работает.
30 DimVad
 
20.06.12
15:07
(26) Конечной ТЗ
31 H A D G E H O G s
 
20.06.12
15:10
ТЗГруппа.Индексы.Добавить("Склад");
ТЗГруппа.Индексы.Добавить("Номенклатура");
32 H A D G E H O G s
 
20.06.12
15:12
либо

Пока ВыборкаСклад.Следующий() Цикл
СтруктураПоиска=Новый Структура;
СтруктураПоиска.Вставить("Склад",ВыборкаСклад.Склад);
МассивСтрок=ТЗГруппа.НайтиСтроки(СтруктураПоиска);
ТЗГруппаПоСкладу=ТЗГруппа.Скопировать(МассивСтрок);
   Пока ВыборкаНомен.Следующий() Цикл
                   
       Отбор = Новый Структура;
       Отбор.Вставить("Номенклатура",    ВыборкаНомен.Номенклатура);
       

       НайденнаяСтрока    = ТЗГруппаПоСкладу.НайтиСтроки(Отбор);
       
       // вывод данных из найденных строк


   КонецЦикла;
КонецЦикла;