|
Для Каждого Стр из Запрос.Выполнить().Выгрузить() ... | ☑ | ||
---|---|---|---|---|
0
buhalter
01.02.13
✎
11:50
|
Наткнулся в одной самописной конфигурации на конструкцию
Для Каждого Стр из Запрос.Выполнить().Выгрузить() Цикл ... КонецЦикла; Как по-Вашему будет работать данный фрагмент? ЗЫ. Сначала долго смеялся, потом проверил код на работоспособность. Был удивлен. |
|||
2
Fragster
гуру
01.02.13
✎
11:52
|
почитай, как работают итераторы во взрослых языках
|
|||
3
Галахад
гуру
01.02.13
✎
11:53
|
А чо такого? Перебор строк таблицы.
|
|||
4
Идентификатор
01.02.13
✎
11:53
|
а почему нет? то же самое если б было
тз = Запрос.выполнить().выгрузить(); для каждого стр из тз цикл КонецЦикла |
|||
5
Maxus43
01.02.13
✎
11:54
|
тоже самое, просто менее читабельно
|
|||
6
Fish
01.02.13
✎
11:56
|
(0) А что в тебе вызвало смех?
|
|||
7
Идентификатор
01.02.13
✎
11:57
|
/ Юмор ....... хД
|
|||
8
ЧеловекДуши
01.02.13
✎
11:57
|
(0)Интересное наблюдение... Но как правило, код до первой ошибки :)
|
|||
9
EasyRider
01.02.13
✎
11:58
|
Пятница просто )
|
|||
10
Rovan
гуру
01.02.13
✎
12:02
|
(0) рабочий, но я так не делаю, т.к. тяжело потом отладчиком смотреть что где
|
|||
11
PiterPrg
01.02.13
✎
12:03
|
(5) Почему менее читабельно?
Я сам так и пишу.... РезультатЗапроса = Запрос.выполнить(); МояСуперТаблица = РезультатЗапроса.Выгрузить(); Для каждого Строка Из Моя СуперТаблица Цикл Так что-ли читабельно? Особенно если между Присвоением МояСуперТаблица и циклом 50 строк текста. Хотя... это дело вкуса ИМХО |
|||
12
Maxus43
01.02.13
✎
12:06
|
(11) менее читабельно (0) имею ввиду
|
|||
13
MaxisUssr
01.02.13
✎
12:06
|
(0)
Я сам так делаю часто. Что изменится? Еще делаю так: Для Каждого СтрокаНезакрытая из Запрос.Выполнить().Выгрузить().НайтиСтроки(новый Структура("НезакрытаяСумма", Истина)) Цикл ... КонецЦикла; |
|||
14
Classic
01.02.13
✎
12:09
|
(0)
Ты считал, что запрос будет выполняться при каждой итерации? |
|||
15
Fragster
гуру
01.02.13
✎
12:10
|
а нафига вообще Выгрузить()? выбрать() лучше же...
|
|||
16
Нуф-Нуф
01.02.13
✎
12:11
|
т.е. вы хотите сказать, чтоб повторного обращения к Выгрузить не происходит?
|
|||
17
buhalter
01.02.13
✎
12:11
|
Показалось бредом в этом случае:
1. Запрос.Выполнить().Выгрузить() - в цикле!!! Т.е. с каждой итерацией выполняем запрос и выгружаем в ТЗ. 2. Итерация строк таблицы. Было подозрение, что если количество строк не нулевое, то всегда будем получать только первую строку. Если второй пункт не оправдал моих ожиданий, то замеры производительности по вариантам а) Для каждого Стр Из Запрос.Выполнить().Выгрузить() Цикл... б) Таблица = Запрос.Выполнить().Выгрузить(); Для каждого Стр Из Таблица Цикл... оказались разными. В пользу варианта б) |
|||
18
Fragster
гуру
01.02.13
✎
12:14
|
(17) сделай замер еще с (15). особенно на больших результатах запроса
|
|||
19
MaxisUssr
01.02.13
✎
12:14
|
(17)
Какова разница? Сколько строк и колонок в выгрузке? |
|||
20
buhalter
01.02.13
✎
12:15
|
(18) Вопрос не в этом. С Выбрать() работать в ряде случаев правильнее и оптимальнее. Я в курсе.
|
|||
21
buhalter
01.02.13
✎
12:20
|
(19) Результаты запроса одинаковые. Результат замера производительности - в пользу варианта с Для каждого Стр из Таблица Цикл... С небольшим, правда, отрывом, на 5%. Тестировалось на простом запросе без соединений. Возможно,на более сложных запросах результат сравнения замеров производительности может отличаться
|
|||
22
buhalter
01.02.13
✎
12:24
|
(6)(7) Когда разбирал код, это показалось мне смешным, потому как (17). Вот и поместил в секцию Юмор...
|
|||
23
hhhh
01.02.13
✎
12:26
|
(21) так ты в каком порядке их запускал? Ведь понятно, что первый запрос всегда медленнее чем вторй, потому что второй использует кеш.
|
|||
24
Fragster
гуру
01.02.13
✎
12:27
|
(21) 5% - это в секундах сколько? сколько прогонов тестов делал?
|
|||
25
Галахад
гуру
01.02.13
✎
12:47
|
Чо-та у меня разница от одной тысячной до нескоьких десятитысячных секуды получилась.
На справонике с 50К позиций. Функция СформироватьЗапрос() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Наименование |ИЗ | Справочник.Номенклатура КАК Номенклатура"; Возврат Запрос.Выполнить(); КонецФункции Процедура А() Рез = СформироватьЗапрос(); тз = Рез.Выгрузить(); Для Каждого Стр из тз Цикл а=1; КонецЦикла; КонецПроцедуры Процедура Б() Рез = СформироватьЗапрос(); Для Каждого Стр из Рез.Выгрузить() Цикл а=1; КонецЦикла; КонецПроцедуры Процедура КнопкаВыполнитьНажатие(Кнопка) А(); Б(); А(); Б(); КонецПроцедуры |
|||
26
Fragster
гуру
01.02.13
✎
12:54
|
(25) так и должно быть
|
|||
27
Fragster
гуру
01.02.13
✎
12:54
|
читайте про (2)
|
|||
28
buhalter
01.02.13
✎
12:55
|
(24) не существенно. В том месте, где встретил этот кусок кода, протестить не могу(. Тестил на произвольном запросе типовой УНФ-ки. Что-то вроде
Выбрать Банки.Ссылка Из Справочник.Банки как Банки 5% в этом случае - доли секунд. Прогонов теста делал 10. Суммировал общее время выполнения. Сравнивал с аналогичным вариантом (17). В сумме вышла дельта около десятой доли секунды, уже не помню. Если кому интересно, потестируйте на сложных запросах. |
|||
29
Fragster
гуру
01.02.13
✎
12:56
|
(28) при чем тут вообще запрос? он-то одинаковое время работает.
|
|||
30
buhalter
01.02.13
✎
12:56
|
(25) попробуй еще
Процедура Б() Для Каждого Стр из СформироватьЗапрос().Выгрузить() Цикл а=1; КонецЦикла; КонецПроцедуры |
|||
31
buhalter
01.02.13
✎
12:57
|
(27) а можно ссылкой? Буду благодарен!
|
|||
32
Fragster
гуру
01.02.13
✎
13:00
|
(31) wiki:Итератор
|
|||
33
Галахад
гуру
01.02.13
✎
13:01
|
(30) Ну, нафиг. Ощутимой разницы нет.
|
|||
34
buhalter
01.02.13
✎
13:04
|
(32) Спасибо!
|
|||
35
НафНаф
04.02.13
✎
22:26
|
(13) вот тут у тебя прокол
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |