При получении данных

1. Xershi 1484 02.12.15 09:45 Сейчас в теме
Добрый день!

Задавался вопросом как оптимальнее вывести данные в списке.

Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	
	СписокЗадач = Новый СписокЗначений;	
	
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
				
		СписокЗадач.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);	
		
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	ВремяРаботыТехподдержкиСрезПоследних.РаботаПо КАК ЗадачаИнженера,
	               |	ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
	               |ИЗ
	               |	РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних КАК ВремяРаботыТехподдержкиСрезПоследних
	               |ГДЕ
	               |	ВремяРаботыТехподдержкиСрезПоследних.РаботаПо В(&СписокЗадач)";

	Запрос.УстановитьПараметр("СписокЗадач", СписокЗадач);

	ТаблицаЗадач = Запрос.Выполнить().Выгрузить();

	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		
		НайденнаяСтрока = ТаблицаЗадач.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка,"ЗадачаИнженера");
		
		Если НайденнаяСтрока = Неопределено Тогда
			ОформлениеСтроки.Ячейки.Выполнено.Значение = 0; 
		Иначе
			ОформлениеСтроки.Ячейки.Выполнено.Значение = НайденнаяСтрока.ВыполненоНаСегодня;
		КонецЕсли;
		
	КонецЦикла; 
	
КонецПроцедуры
Показать


Результат производительности хуже чем

Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
				
		Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ
			|	ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
			|ИЗ
			|	РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних КАК ВремяРаботыТехподдержкиСрезПоследних
			|ГДЕ
			|	ВремяРаботыТехподдержкиСрезПоследних.РаботаПо = &РаботаПо";

		Запрос.УстановитьПараметр("РаботаПо", ОформлениеСтроки.ДанныеСтроки.Ссылка);

		Результат = Запрос.Выполнить();

		Выборка = Результат.Выбрать();

		Пока Выборка.Следующий() Цикл
			Выполнено = Выборка.ВыполненоНаСегодня; 
		КонецЦикла;
		
		ОформлениеСтроки.Ячейки.Выполнено.Значение = Выполнено;
		
	КонецЦикла;
	
КонецПроцедуры
Показать


Первый код: 0,857456
Второй код: 0,350234

Хоть я и получаю ТЗ, но запрос выполняете дольше(3 раза вызывался), чем получение одного реквизита тип строка в запросом в цикле(43 раза вызывался)?

Это проблема запроса или подхода?
Прикрепленные файлы:
ЗамерКогдаЗапросНаКаждуюСтроку.pff
ЗамерКогдаЗапросТаблица.pff
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. sommid 02.12.15 09:52 Сейчас в теме
странно.. может попробуйте проиндексировать в регистре "РаботаПо" и повторить замеры
3. Xershi 1484 02.12.15 09:53 Сейчас в теме
(2) sommid, т.е. мне нужно в регистре реквизит поставить индексировать и проверить результат?
4. sommid 02.12.15 09:57 Сейчас в теме
5. Xershi 1484 02.12.15 10:06 Сейчас в теме
(4) sommid, похоже запрос не оптимальный.
И второй код все равно выигрывает!

Первый код: 0,402975
Второй код: 0,379751
Прикрепленные файлы:
ЗамерКогдаЗапросТаблицаИндекс.pff
ЗамерКогдаЗапросНаКаждуюСтрокуИндекс.pff
6. Xershi 1484 02.12.15 10:08 Сейчас в теме
Так же еще отличие такое
ТаблицаЗадач = Запрос.Выполнить().Выгрузить();


Результат = Запрос.Выполнить();

        Выборка = Результат.Выбрать();

        Пока Выборка.Следующий() Цикл
            Выполнено = Выборка.ВыполненоНаСегодня; 
        КонецЦикла;


Может обход выборки работает быстрее выгрузить?
7. Xershi 1484 02.12.15 10:14 Сейчас в теме
(6) Xershi, это не дало результата замер: 0,438890
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	
	СписокЗадач = Новый СписокЗначений;    
    
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
                
        СписокЗадач.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);    
        
    КонецЦикла;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ВремяРаботыТехподдержкиСрезПоследних.РаботаПо КАК ЗадачаИнженера,
                   |    ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
                   |ИЗ
                   |    РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних КАК ВремяРаботыТехподдержкиСрезПоследних
                   |ГДЕ
                   |    ВремяРаботыТехподдержкиСрезПоследних.РаботаПо В(&СписокЗадач)";

    Запрос.УстановитьПараметр("СписокЗадач", СписокЗадач);

    ТаблицаЗадач = Новый ТаблицаЗначений;
	ТаблицаЗадач.Колонки.Добавить("ЗадачаИнженера");
	ТаблицаЗадач.Колонки.Добавить("ВыполненоНаСегодня");
	
	Результат = Запрос.Выполнить();

    Выборка = Результат.Выбрать();

    Пока Выборка.Следующий() Цикл
        НоваяСтрока = ТаблицаЗадач.Добавить();
		НоваяСтрока.ЗадачаИнженера = Выборка.ЗадачаИнженера;
		НоваяСтрока.ВыполненоНаСегодня = Выборка.ВыполненоНаСегодня;
	КонецЦикла;
		
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        
        НайденнаяСтрока = ТаблицаЗадач.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка,"ЗадачаИнженера");
        
        Если НайденнаяСтрока = Неопределено Тогда
            ОформлениеСтроки.Ячейки.Выполнено.Значение = 0; 
        Иначе
            ОформлениеСтроки.Ячейки.Выполнено.Значение = НайденнаяСтрока.ВыполненоНаСегодня;
        КонецЕсли;
        
    КонецЦикла; 
	
КонецПроцедуры

Показать
Прикрепленные файлы:
ЗамерКогдаЗапросОбходТаблицаИндекс.pff
8. sommid 02.12.15 10:14 Сейчас в теме
(6) может быть.. возможно время на создание таблицы тут имеет значение, попробуйте так же с выборкой.
Или для начала можно разделить выполнение запроса и получение данных из него. Так можно будет посмотреть, где же бОльшее время тратится:
Результат = Запрос.Выполнить();
ТаблицаЗадач = Результат .Выгрузить();
9. Xershi 1484 02.12.15 10:15 Сейчас в теме
(8) sommid, уже сделал. Ручной обход дольше выполняется.
17. mymyka 02.12.15 10:29 Сейчас в теме
(6)Условие попробуйте перенести в параметры вирт.таблицы. Хотя это даст прирост в обоих случаях.
10. Xershi 1484 02.12.15 10:17 Сейчас в теме
Просто в моей публикации http://infostart.ru/public/406155/
Оставили комментарий, что лучше сделать один запрос. Но выходит что этот запрос получится не оптимальный! И результат будет хуже...
11. ditp 91 02.12.15 10:20 Сейчас в теме
1) разобраться, почему три раза вызывается при получении данных
2) наложить условия на измерения в запросе
12. Xershi 1484 02.12.15 10:24 Сейчас в теме
(11) ditp, помогите разобраться?

Стою в начале списка, включаю замер.
Жму контр+енд оказываюсь в конце списка!
Выключаю замер 3 раза запрос выполняется.
В коде формы документа списка только эта процедура!
Код Модуля и менеджера пустой.
37. Xershi 1484 02.12.15 12:03 Сейчас в теме
По поводу 3 вызовов из (12).
Первый вызов это все видимые строки на таблице.
Второй вызов это первые 4 видимых строки на таблице.
Третий вызов это первая строка выше видимых строк на таблице.
13. Xershi 1484 02.12.15 10:24 Сейчас в теме
(11) ditp, какое условие? код посмотрите условие уже есть!
18. sommid 02.12.15 10:32 Сейчас в теме
(13) он имеет ввиду, получать только для "новых" строк.
т.е. выполняем запрос, в переменную запоминаем список обработанных ссылок, в следующем запросе (опять произошло обновление табличного поля) получаем данные, исключая ссылки, обработанные при прошлом срабатывании события. Заменяем список обработанных ссылок на текущий и так далее.
Ну это я так понял )
20. Xershi 1484 02.12.15 10:37 Сейчас в теме
(18) sommid, ну так у меня есть список. Сначала я вначале. Затем перемещаюсь в самый конец. Записей в списке на несколько страниц.
24. sommid 02.12.15 10:47 Сейчас в теме
(20) скорее всего вариант с виртуальными параметрами все решит.
я имел ввиду следующее:
Запрос.Текст = "ВЫБРАТЬ
                   |    ВремяРаботыТехподдержкиСрезПоследних.РаботаПо КАК ЗадачаИнженера,
                   |    ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
                   |ИЗ
                   |    РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, РаботаПо В (&СписокЗадач) И НЕ РаботаПо В (&СписокЗадачПрошлыйЗапрос)) КАК ВремяРаботыТехподдержкиСрезПоследних"

главное, чтобы так строки не очистились, которые в прошлый раз заполняли, а в этот "соптимизировали" и пропустили.. уже давновато с обычными формами не работал
25. herfis 499 02.12.15 10:51 Сейчас в теме
(24) sommid, Боже мой! Что это? Даже если бы это работало, то в этом нет никакого смысла. Размер порции данных для таких запросов всегда заведомо ограничен и дополнительное уменьшение размера выборки никакого практического эффекта не даст.
27. sommid 02.12.15 11:22 Сейчас в теме
(25) скорее всего ). смутила большая разница в замерах, но это должно быть из-за ГДЕ, а не отбора через виртуальные параметры.
Ну и для проведения опыта почему нет, тут же доли секунд экономим? сделал, посмотрел на результат - если толку нет, то пропустил и забыл
28. sommid 02.12.15 11:23 Сейчас в теме
(25) + это при многократном вызове платформы позволит вообще не выполнять запрос и обход, если списки текущий и предыдущий совпадут, а это уже ~2/3 от затраченного времени (в начале автор писал, что вызывается трижды)
34. herfis 499 02.12.15 11:59 Сейчас в теме
(28) sommid, Если речь о кэшировании запрашиваемых данных - то это другой разговор. Но с кэшем куча своих проблем возникает. Контроль размера, контроль времени жизни. А чтобы подряд ПолучениеДанных() на одни и те же оформления строк получало - такого я не замечал. Несколько вызовов на разные порции - да. Чаще всего наблюдал два вызова подряд.
46. sommid 02.12.15 12:22 Сейчас в теме
(34) ясно. я решил из описания, что именно по тем же данным вызов идет. тогда мой совет "мимо".
14. Xershi 1484 02.12.15 10:27 Сейчас в теме
Для уточнения формы обычные. Может нужно в свойствах формы галки снять какие? Создавалась форма конструктором.
15. ditp 91 02.12.15 10:28 Сейчас в теме
Если РаботаПо это измерение, то
ВЫБРАТЬ
    ВремяРаботыТехподдержкиСрезПоследних.РаботаПо КАК ЗадачаИнженера,
    ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
ИЗ
    РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, РаботаПо В(&СписокЗадач)) КАК ВремяРаботыТехподдержкиСрезПоследних

а не то что у вас.
dabu-dabu; sommid; +2 Ответить
16. Xershi 1484 02.12.15 10:29 Сейчас в теме
(15) ditp, да это измерение. Сейчас проверю результат.
19. Xershi 1484 02.12.15 10:35 Сейчас в теме
Проверил результат не дает переписка запроса.
Когда таблица вручную создается: 0,456324
Когда выгружается: 0,430917

Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	
	СписокЗадач = Новый СписокЗначений;    
    
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
                
        СписокЗадач.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);    
        
    КонецЦикла;
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |	ВремяРаботыТехподдержкиСрезПоследних.РаботаПо КАК ЗадачаИнженера,
                   |	ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
                   |ИЗ
                   |	РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, РаботаПо В (&СписокЗадач)) КАК ВремяРаботыТехподдержкиСрезПоследних";

    Запрос.УстановитьПараметр("СписокЗадач", СписокЗадач);

    ТаблицаЗадач = Запрос.Выполнить().Выгрузить();
		
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        
        НайденнаяСтрока = ТаблицаЗадач.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка,"ЗадачаИнженера");
        
        Если НайденнаяСтрока = Неопределено Тогда
            ОформлениеСтроки.Ячейки.Выполнено.Значение = 0; 
        Иначе
            ОформлениеСтроки.Ячейки.Выполнено.Значение = НайденнаяСтрока.ВыполненоНаСегодня;
        КонецЕсли;
        
    КонецЦикла; 
	
КонецПроцедуры

Показать
Прикрепленные файлы:
ЗамерКогдаЗапросТаблицаИндексУсловие.pff
ЗамерКогдаЗапросОбходТаблицаИндексУсловие.pff
21. Alexey_ 27 02.12.15 10:40 Сейчас в теме
самый оптимальный вариант:

Соответствие = Новый Соответствие;
МассивСсылок = Новый Массив;

Для Каждого Строка Из ОформленияСтрок Цикл
	МассивСсылок.Добавить(Строка.ДанныеСтроки.Ссылка);
	Соответствие.Вставить(Строка.ДанныеСтроки.Ссылка, Строка);
КонецЦикла; 

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
                   |    ВремяРаботыТехподдержкиСрезПоследних.РаботаПо КАК ЗадачаИнженера,
                   |    ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
                   |ИЗ
                   |    РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, РаботаПо В (&СписокЗадач)) КАК ВремяРаботыТехподдержкиСрезПоследних";

Запрос.УстановитьПараметр("СписокЗадач", МассивСсылок);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	Соответствие.Получить(ВыборкаДетальныеЗаписи.ЗадачаИнженера).Ячейки.Выполнено.УстановитьТекст("" + ВыборкаДетальныеЗаписи.ВыполненоНаСегодня);
КонецЦикла;
Показать


p.s. где-то мог ошибиться
Xershi; herfis; +2 Ответить
29. Xershi 1484 02.12.15 11:42 Сейчас в теме
(21) Alexey_, проверю ваш вариант.

Но
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		               |	ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
		               |ИЗ
		               |	РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, ) КАК ВремяРаботыТехподдержкиСрезПоследних
		               |ГДЕ
		               |	ВремяРаботыТехподдержкиСрезПоследних.РаботаПо = &РаботаПо";
		
		Запрос.УстановитьПараметр("РаботаПо", ОформлениеСтроки.ДанныеСтроки.Ссылка);
		
		Результат = Запрос.Выполнить();
		
		Выборка = Результат.Выбрать();
		
		Пока Выборка.Следующий() Цикл
			Выполнено = Выборка.ВыполненоНаСегодня; 
		КонецЦикла;
		
		ОформлениеСтроки.Ячейки.Выполнено.Значение = Выполнено; 
		
	КонецЦикла;
	
КонецПроцедуры
Показать


Замер: 0,104290

А с виртуальным параметром: 0,424331
Прикрепленные файлы:
ЗамерКогдаЗапросНаКаждуюСтрокуИндекс2.pff
ЗамерКогдаЗапросНаКаждуюСтрокуИндексВиртуальныйПараметр.pff
36. spacecraft 02.12.15 12:03 Сейчас в теме
(29) Xershi,
ИЗ
                       |    РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, ) КАК ВремяРаботыТехподдержкиСрезПоследних

данные выбираются только один раз. Потом уже из кеша считываются (данные в таблице не менялись во время цикла). При "виртуальном" параметре они каждый раз выбираются. Да и это заметно на встроенной базе 1С. С SQL будет немного не так. Но тоже быстрее, срезПоследних целиком в памяти еще будет, но добавятся накладные расходы.
39. Xershi 1484 02.12.15 12:07 Сейчас в теме
(36) spacecraft, тестирование идет на SQL. Я думаю в (33) оно тоже закэшировалось!
43. Xershi 1484 02.12.15 12:14 Сейчас в теме
(21) Alexey_, хотя посмотрел замер.
ТаблицаЗадач = Запрос.Выполнить().Выгрузить(); 3 0,423948 98,38

Так что это не оптимизирует результат.
45. herfis 499 02.12.15 12:16 Сейчас в теме
(43) А просто Запрос.Выполнить() сколько "тянет"? И еще раз - на каждую строку отдельная задача или нет?
47. Alexey_ 27 02.12.15 12:54 Сейчас в теме
(43) Xershi, (21) замерял? какой результат?
в (21) нет строки "ТаблицаЗадач = Запрос.Выполнить().Выгрузить();"
48. Xershi 1484 02.12.15 13:48 Сейчас в теме
(47) Alexey_, еще не делал. Просто у тебя обход все равно идет, а это было основная проблема.
Напишу код выложу результат.
49. Alexey_ 27 02.12.15 13:53 Сейчас в теме
(48) Xershi, обход - не основная проблема, основные проблемы это выгрузка результата запроса в ТЗ и поиск по ТЗ, ни того ни другого нет в (21)
50. Xershi 1484 02.12.15 14:18 Сейчас в теме
(49) Alexey_, речь шла про
Запрос.Выполнить()


Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	
	Соответствие = Новый Соответствие; 
	МассивСсылок = Новый Массив; 
	
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл 
		МассивСсылок.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка); 
		Соответствие.Вставить(ОформлениеСтроки.ДанныеСтроки.Ссылка, ОформлениеСтроки); 
	КонецЦикла; 
	
	Запрос = Новый Запрос; 
	Запрос.Текст = "ВЫБРАТЬ
	               |	ВремяРаботыТехподдержкиСрезПоследних.РаботаПо КАК ЗадачаИнженера,
	               |	ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
	               |ИЗ
	               |	РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, РаботаПо В (&СписокЗадач)) КАК ВремяРаботыТехподдержкиСрезПоследних"; 
	
	Запрос.УстановитьПараметр("СписокЗадач", МассивСсылок); 
	
	РезультатЗапроса = Запрос.Выполнить(); 
	
	Выборка = РезультатЗапроса.Выбрать(); 
	
	Пока Выборка.Следующий() Цикл 
		Соответствие.Получить(Выборка.ЗадачаИнженера).Ячейки.Выполнено.Значение = Выборка.ВыполненоНаСегодня; 
	КонецЦикла;
	
КонецПроцедуры

Показать


Соответствие.Получить(Выборка.ЗадачаИнженера).Ячейки.Выполнено.Значение = Выборка.ВыполненоНаСегодня; 

Присвоение значения быстрее идет:0,311116
А через установить текст: 0,385490
Прикрепленные файлы:
ЗамерСоответсвиеИндексЗначение.pff
ЗамерСоответсвиеИндексУстановитьТекст.pff
22. herfis 499 02.12.15 10:44 Сейчас в теме
Про параметры виртуальной таблицы уже сказали.
Еще у тебя абсолютно ненужный поиск по "ТаблицаЗадач". Его можно легко избежать.
При первом обходе оформлений строк в отдельном соответствии запоминаешь сопоставление задачи оформлению строки (или массиву оформлений строк).
А затем просто обходишь выборку данных запроса, получаешь из соответствия оформления нужных строк и оформляешь ячейки.
Ну и если одна и та же задача может соответствовать нескольким строкам, то и передавать нужно уникальный список. А лучше не список значений в запрос передавать, а всегда для этого использовать массив. Массив заметно "легче" списка значений.
23. herfis 499 02.12.15 10:45 Сейчас в теме
Пока писал, уже и код готовый выложили :)
26. ditp 91 02.12.15 11:13 Сейчас в теме
На самом то деле, проблема в том, что ПриПолученииДанных несколько раз вызывается.
Но у нас документ, следовательно кол-во строк ограничено. Так что можно все расчеты повесить на процедуру ПриОткрытии, загонять результат в соответствие Задача - Выполнено, и в ПриПолученииДанных не запрос выполнять по нескольку раз, а пользоваться данными из соответствия.

На случай добавления строк - добавить расчет также на событие ПриОкончанииРедактирования.

Ну и соответствие, в котором результат расчета будет храниться, должно быть объявлено как переменная модуля.
30. Xershi 1484 02.12.15 11:46 Сейчас в теме
(26) ditp, так никто так и не помог разобраться. Почему 3 раза идет вызов по методу (12).
31. sommid 02.12.15 11:50 Сейчас в теме
(30) это уже вопрос к платформе, врядли на это получится повлиять
38. ditp 91 02.12.15 12:07 Сейчас в теме
Да толку в этих исследованиях никакого, на самом деле.
Для документа с ограниченным числом строк (26) вполне хватит.
По крайней мере, количество запросов становится вполне контролируемым.
40. Xershi 1484 02.12.15 12:08 Сейчас в теме
(38) ditp, просто вопрос в масштабировании. Сейчас меня результаты и так устраивают.
32. ditp 91 02.12.15 11:52 Сейчас в теме
Угу. Я у себя проверил, оно удивительно работает.
30 строк на экране, ПриПолученииДанных трижды вызвается, первый раз 26 строк, потом 3 и потом еще 1.
33. Xershi 1484 02.12.15 11:56 Сейчас в теме
Сделал повторный замер: 0,099174
С виртуальным параметром
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		               |	ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
		               |ИЗ
		               |	РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, РаботаПо = &РаботаПо) КАК ВремяРаботыТехподдержкиСрезПоследних";
		
		Запрос.УстановитьПараметр("РаботаПо", ОформлениеСтроки.ДанныеСтроки.Ссылка);
		
		Результат = Запрос.Выполнить();
		
		Выборка = Результат.Выбрать();
		
		Пока Выборка.Следующий() Цикл
			Выполнено = Выборка.ВыполненоНаСегодня; 
		КонецЦикла;
		
		ОформлениеСтроки.Ячейки.Выполнено.Значение = Выполнено; 
		
	КонецЦикла;
	
КонецПроцедуры

Показать
Прикрепленные файлы:
ЗамерКогдаЗапросНаКаждуюСтрокуИндексВиртуальныйПараметр2.pff
35. caponid 02.12.15 12:01 Сейчас в теме
Передача в запрос списка/массива тут самая затратная операция

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

Запрос.УстановитьПараметр("Массив10Элементов", Массив10Элементов);
и РаботаПо В (&Массив10Элементов)

И
Запрос.УстановитьПараметр("Элемент1", Элементо1);
...
Запрос.УстановитьПараметр("Элемент10", Элементо10);
И РаботаПо В (&Элемент1, ... &Элемент10)
41. Xershi 1484 02.12.15 12:10 Сейчас в теме
(35) caponid, вы предлагаете передать не список, а каждый элемент через обход коллекции?
44. herfis 499 02.12.15 12:15 Сейчас в теме
(41) Xershi, Вариант (21) тестировался? Задачи уникальны для строк или одна задача может быть на несколько строк?
55. zkorpus1 01.09.17 16:48 Сейчас в теме
План запроса при использовании оператора in показывает обход таблицы по записям, ни индексы ни ассоциации не работают т.е. только Loop, т.е. переберет все.
Всегда предпочтительней внутренне соединение Match, этого вы в виртуальной таблице не сможете сделать.
Я задаю отбор передачей параметра таблицей значений, и соединением с виртуальной таблицей, все равно виртуальная таблица вывалит тот же набор записей, что и для Loop внутри себя, а потом сделает Match, всегда быстрее. Если (35) использовать работает индекс т.е. Match.
А в вашем случает высокая селективность Ссылок, зачем виртуальная таблица? Легче сделать внутренне соединение с обычной таблицей по ссылкам. А потом уже ручками срез последних, тут много публикаций как это сделать.
56. Xershi 1484 02.09.17 10:18 Сейчас в теме
(55) с этой конфигурацией уже не работаю. Проверить не смогу. Возможно в будущих проектах пригодится.
42. caponid 02.12.15 12:11 Сейчас в теме
а как часто меняется РегистрСведений.ВремяРаботыТехподдержки ? может проще вообще вынести получение среза в модуль с повторным возвратом испольуемых значений? тут гарантированно будет ускорение - причем ощутимое - все таки регист сведений довольно тормозной механизм
52. Xershi 1484 02.12.15 14:34 Сейчас в теме
(42) caponid, сколько дней инженер делал задачу столько и будет записей.
(44) herfis, задача в регистре это измерение. Т.к. задача ставится одному сотруднику, то и срез только по задаче достаточен в условии. Можно дополнить еще условие по сотруднику, но это будет избыточно, но сути не поменяет.
(45) herfis, да сред и делает уникальные записи по задачам. Т.е. одна строка в списке есть 0 или 1 запись в срезе.
51. Xershi 1484 02.12.15 14:27 Сейчас в теме
Подведу итог!

В моем случае оказалось самым производительным решение:
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	
	 Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
                
        Запрос = Новый Запрос;
        Запрос.Текст = "ВЫБРАТЬ
                       |	ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
                       |ИЗ
                       |	РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, РаботаПо = &РаботаПо) КАК ВремяРаботыТехподдержкиСрезПоследних";

        Запрос.УстановитьПараметр("РаботаПо", ОформлениеСтроки.ДанныеСтроки.Ссылка);

        Результат = Запрос.Выполнить();

        Выборка = Результат.Выбрать();

        Пока Выборка.Следующий() Цикл
            Выполнено = Выборка.ВыполненоНаСегодня; 
        КонецЦикла;
        
        ОформлениеСтроки.Ячейки.Выполнено.Значение = Выполнено;
        
    КонецЦикла;
	
КонецПроцедуры

Показать


На втором месте:
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
    
    Соответствие = Новый Соответствие; 
    МассивСсылок = Новый Массив; 
    
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл 
        МассивСсылок.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка); 
        Соответствие.Вставить(ОформлениеСтроки.ДанныеСтроки.Ссылка, ОформлениеСтроки); 
    КонецЦикла; 
    
    Запрос = Новый Запрос; 
    Запрос.Текст = "ВЫБРАТЬ
                   |    ВремяРаботыТехподдержкиСрезПоследних.РаботаПо КАК ЗадачаИнженера,
                   |    ВремяРаботыТехподдержкиСрезПоследних.ВыполненоНаСегодня
                   |ИЗ
                   |    РегистрСведений.ВремяРаботыТехподдержки.СрезПоследних(, РаботаПо В (&СписокЗадач)) КАК ВремяРаботыТехподдержкиСрезПоследних"; 
    
    Запрос.УстановитьПараметр("СписокЗадач", МассивСсылок); 
    
    РезультатЗапроса = Запрос.Выполнить(); 
    
    Выборка = РезультатЗапроса.Выбрать(); 
    
    Пока Выборка.Следующий() Цикл 
        Соответствие.Получить(Выборка.ЗадачаИнженера).Ячейки.Выполнено.Значение = Выборка.ВыполненоНаСегодня; 
    КонецЦикла;
    
КонецПроцедуры
Показать


Т.е. соответсвие будет оптимальнее врешении аналогичных задач. Где запрос будет в первом случае не настолько оптимален по производительности!
53. Xershi 1484 02.12.15 14:42 Сейчас в теме
Еще вопрос. Вот я прикреплял файлы замеров, то их в другой конфигурации открыть можно?
54. sommid 02.12.15 15:22 Сейчас в теме
(53) да. я открывал в 1С:Предприятие 8.3 (8.3.5.1383) Управление торговлей, редакция 11.1 (11.1.3.6)
57. nvv1970 02.09.17 10:47 Сейчас в теме
Обо всем чём нужно уже сказали, но вставлю пять копеек в подтверждение.
100% срез получайте сами. Соединение рулит.
Пачка ссылок лучше чем одна.
У вас речь о заметных полсекунде, а часто и 0.1 является заметной проблемой для комфортного юзания.
Кэш - очень неплохое решение. Но не кэш сеанса (повт.исп), а сделаете сами кэш на форме. Сохранять в кэш весь регистр - сомнительно при неизвестном размере реестра. Лучше накапливать в кэше полученные данные.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот