Как лучше получить значение табличной части

1. Libera007 23.10.12 17:29 Сейчас в теме
Имеется два варианта получения значения табличной части:
  • 1. Через запрос
    Запрос = Новый Запрос();
    	Запрос.Текст = "ВЫБРАТЬ
    				   |	ЖурналПроизводственныхЗаданийСпецификацияУзлов.НаименованиеУзла
    				   |ИЗ
    				   |	Документ.ЖурналПроизводственныхЗаданий.СпецификацияУзлов КАК ЖурналПроизводственныхЗаданийСпецификацияУзлов";
    	Запрос.УстановитьПараметр("Ссылка", Ссылка);
    	КопируемоеЗначение = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(Колонка).Получить(Строка-1);
    	Возврат(КопируемоеЗначение);

  • 2 Через обращение к объекту:
    ДокументОбъект = Документы.ЖурналПроизводственныхЗаданий.ПолучитьСсылку(Ссылка).ПолучитьОбъект();
    	КопируемоеЗначение = ДокументОбъект.СпецификацияУзлов.ВыгрузитьКолонку(Колонка).Получить(Строка-1);
    	Возврат(КопируемоеЗначение);


Подскажите какой вариант предпочтительней использовать. Есть ли разница в быстродействии или наличии "подводных камней"
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Uncore 1274 24.10.12 11:59 Сейчас в теме
(1) Libera007, не рекомендовал бы использовать такой синтаксис:
КопируемоеЗначение = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(Колонка).Получить(Строка-1);

Если результат запроса будет пустым, то будет ошибка на "Получить(Строка-1);"
Лучше всегда проверять количество строк выборки, если нулевое, возвращать НЕОПРЕДЕЛЕНО:
КопируемоеЗначение = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(Колонка);
Если КопируемоеЗначение.Количество() = 0 Тогда
    КопируемоеЗначение = Неопределено;
КонецЕсли;

Возврат КопируемоеЗначение;

А по быстродействию, запрос в Вашем случае будет приоритетнее.
+
10. taiba 87 24.10.12 13:58 Сейчас в теме
(1) Libera007, +1 за запрос.

в приведенном запросе, кстати, не задействован параметр Ссылка.
+
2. sonuchin3 23.10.12 19:26 Сейчас в теме
При получении значений через запрос извлекается только то, что попросили в запросе, а через обращение к объекту будут получены все реквизиты и табличные части объекта. Если этого всего не надо, значит будет потрачен лишний ресурс.
Ещё. Правильно будет:
Возврат КопируемоеЗначение;
kiros; +1
3. andrewks 1370 23.10.12 21:41 Сейчас в теме
через запрос, однозначно
+
5. webester 26 24.10.12 12:28 Сейчас в теме
Чтение данных, всегда запрос без вариантов, если данные надо прочитать, не должно быть вопросов.
+
6. shuhorov 24.10.12 12:32 Сейчас в теме
запрос во всех случаях быстрее
+
7. DenisCh 24.10.12 12:41 Сейчас в теме
Тут и думать нечего - запрос, разумеется...
Я в одном месте в журнале документов приПолученииДанных изменил проверку на Ссылка.Реквизит = Истина на запрос Выбрать Реквизит из документ где Ссылка =&Ссылка - так журнал ускорил работу раза в 4...
+
8. shuhorov 24.10.12 13:03 Сейчас в теме
(7) DenisCh, тут еще нужно учитывать индексированный реквизит или нет
+
9. DrDrey 24.10.12 13:48 Сейчас в теме
Если объект записан то запросом, иначе то через форму к значениям табличной части...
+
11. Libera007 24.10.12 17:46 Сейчас в теме
Спасибо всем за ответы
+
12. tango 540 24.10.12 18:36 Сейчас в теме
всех, кто отдал голос за запрос против объекта, лишаю сертификатов
специалисты, блин

Запросом, циклов: 100 000;

51 сек

Объектом, циклов: 100 000;

1 сек
Прикрепленные файлы:
СравнениеЗапросОбъект.epf
+
13. sonuchin3 24.10.12 19:34 Сейчас в теме
(12) tango,
В прикрепленной обработке в цикле с объектом выполняется чтение реквизита одного и того же объекта.
Первый раз весь объект будет считан из базы, а все остальные - из кэша.

(Профессиональная разработка в системе 1С: Предприятие 8 (2007) --> Глава 4. работа с данными --> Объектные и необъектные данные --> Кэширование представлений и объектов)

По умолчанию, ведь, наверное, предполагаем, что в той задаче, о которой идет речь, кэш успевает сгореть. Иначе об этом должно было быть особо указано.
+
15. tango 540 24.10.12 21:00 Сейчас в теме
(13) sonuchin3,
6. shuhorov 24.10.12 12:32
запрос во всех случаях быстрее
+
16. sonuchin3 24.10.12 21:03 Сейчас в теме
(15) tango,
6. shuhorov 24.10.12 12:32 запрос во всех случаях быстрее

- Согласен. Конечно, не во всех.
+
14. taiba 87 24.10.12 19:38 Сейчас в теме
(12) tango, Ага щаз!
Вы под вечер такое не делайте. Вот для сравнения.
(Разница всё равно при таком подходе в пользу объекта, но не настолько же!)

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


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


а тут уже
Объектом, циклов: 99 999
1
Запросом, циклов3: 99 999
1
+
17. sonuchin3 24.10.12 21:17 Сейчас в теме
(14) taiba,
Ну, я так понимаю, речь немножко не о том.
По всей видимости, имеется в виду, что нам нужен в данный момент один реквизит одного объекта. Измерить время однократного обращения затруднительно, к тому же оно все равно различное в разных случаях. Поэтому надо как-то сделать так, чтобы аналогичных обращений было очень много. Стало быть, мы в цикле обращаемся и ожидаем увидеть уже ощутимые цифры.
Но здесь уже, конечно, надо стоить циклы так, чтобы то и другое обращение находились в равных условиях. Поэтому, если мы хотим сравнить время однократного обращения, то надо в циклах обращаться к разным объектам, в т.ч. выполнять запрос в цикле.

Другое дело, если в реальной задаче все-таки особые условия. Тогда если извлеваются реквизиты одного и того же объекта и кэш не успевает сгореть, то обращение к объекту будет иметь преимущество. А если обращаемся к разным объектам, и есть возможность передать эти объекты в запрос, то преимущество запроса будет еще более значительным (конечно же, в реальной задаче выполнять запрос в цикле, скорее всего, не будем).
+
18. tango 540 24.10.12 21:35 Сейчас в теме
(17) sonuchin3, согласен. изъятие жолтых бумажков откладывается
+
19. deniseek77 86 24.10.12 21:50 Сейчас в теме
(17) sonuchin3, (17) sonuchin3, ...И все же, грамотно построенный запрос- максимально лучше выберет. Другое дело, что запрос- не всегда правильный...Иногда очень не оптимальный.Вообще...
kiros; +1
20. tango 540 24.10.12 21:55 Сейчас в теме
(19) deniseek77, просто предоставьте тест. бла-бла-бла - это к видеоурокам
+
24. tango 540 25.10.12 18:20 Сейчас в теме
(17) sonuchin3, примете участие в (21) ?
+
25. sonuchin3 25.10.12 21:30 Сейчас в теме
(24) tango,
Что-то я со ссылкой (21) не понял. Перехожу по ней - там написано:
"Каталог конфигураций, отчетов и обработок для 1С
Публикация не активна".
+
26. tango 540 26.10.12 10:25 Сейчас в теме
(25) sonuchin3, было на модерации: я добавил пару строк в конце текста, модератор принял
+
21. tango 540 25.10.12 16:01 Сейчас в теме
22. taiba 87 25.10.12 18:08 Сейчас в теме
23. tango 540 25.10.12 18:19 Сейчас в теме
(22) taiba, да, нет, коллега. некорректный там тест. надо подработать
+
27. mxm2 1266 31.10.12 23:07 Сейчас в теме
другой вариант, правда по последовательному доступу к справочнику http://forum.infostart.ru/forum24/topic73106/message785712/#message785712
+
Внимание! Тема сдана в архив

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