Как лучше получить значение табличной части
Имеется два варианта получения значения табличной части:
Подскажите какой вариант предпочтительней использовать. Есть ли разница в быстродействии или наличии "подводных камней"
- 1. Через запрос
Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | ЖурналПроизводственныхЗаданийСпецификацияУзлов.НаименованиеУзла |ИЗ | Документ.ЖурналПроизводственныхЗаданий.СпецификацияУзлов КАК ЖурналПроизводственныхЗаданийСпецификацияУзлов"; Запрос.УстановитьПараметр("Ссылка", Ссылка); КопируемоеЗначение = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(Колонка).Получить(Строка-1); Возврат(КопируемоеЗначение);
- 2 Через обращение к объекту:
ДокументОбъект = Документы.ЖурналПроизводственныхЗаданий.ПолучитьСсылку(Ссылка).ПолучитьОбъект(); КопируемоеЗначение = ДокументОбъект.СпецификацияУзлов.ВыгрузитьКолонку(Колонка).Получить(Строка-1); Возврат(КопируемоеЗначение);
Подскажите какой вариант предпочтительней использовать. Есть ли разница в быстродействии или наличии "подводных камней"
По теме из базы знаний
- Не спеша, эффективно и правильно – путь разработки. Часть 3. Практика
- Типовые операции в 1С: БГУ 2. Часть 4. Заключение
- Как читать чужой код? Часть 3. Разбор и доработка запросов
- Работа с контактной информацией. Часть 2
- История одного админа в мире 1С. Как поиски причины тормозов 1С привели к созданию нового продукта
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Libera007, не рекомендовал бы использовать такой синтаксис:
Если результат запроса будет пустым, то будет ошибка на "Получить(Строка-1);"
Лучше всегда проверять количество строк выборки, если нулевое, возвращать НЕОПРЕДЕЛЕНО:
А по быстродействию, запрос в Вашем случае будет приоритетнее.
КопируемоеЗначение = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(Колонка).Получить(Строка-1);
Если результат запроса будет пустым, то будет ошибка на "Получить(Строка-1);"
Лучше всегда проверять количество строк выборки, если нулевое, возвращать НЕОПРЕДЕЛЕНО:
КопируемоеЗначение = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(Колонка);
Если КопируемоеЗначение.Количество() = 0 Тогда
КопируемоеЗначение = Неопределено;
КонецЕсли;
Возврат КопируемоеЗначение;
А по быстродействию, запрос в Вашем случае будет приоритетнее.
При получении значений через запрос извлекается только то, что попросили в запросе, а через обращение к объекту будут получены все реквизиты и табличные части объекта. Если этого всего не надо, значит будет потрачен лишний ресурс.
Ещё. Правильно будет:
Возврат КопируемоеЗначение;
Ещё. Правильно будет:
Возврат КопируемоеЗначение;
Тут и думать нечего - запрос, разумеется...
Я в одном месте в журнале документов приПолученииДанных изменил проверку на Ссылка.Реквизит = Истина на запрос Выбрать Реквизит из документ где Ссылка =&Ссылка - так журнал ускорил работу раза в 4...
Я в одном месте в журнале документов приПолученииДанных изменил проверку на Ссылка.Реквизит = Истина на запрос Выбрать Реквизит из документ где Ссылка =&Ссылка - так журнал ускорил работу раза в 4...
всех, кто отдал голос за запрос против объекта, лишаю сертификатов
специалисты, блин
Запросом, циклов: 100 000;
51 сек
Объектом, циклов: 100 000;
1 сек
специалисты, блин
Запросом, циклов: 100 000;
51 сек
Объектом, циклов: 100 000;
1 сек
Прикрепленные файлы:
СравнениеЗапросОбъект.epf
(12) tango,
В прикрепленной обработке в цикле с объектом выполняется чтение реквизита одного и того же объекта.
Первый раз весь объект будет считан из базы, а все остальные - из кэша.
(Профессиональная разработка в системе 1С: Предприятие 8 (2007) --> Глава 4. работа с данными --> Объектные и необъектные данные --> Кэширование представлений и объектов)
По умолчанию, ведь, наверное, предполагаем, что в той задаче, о которой идет речь, кэш успевает сгореть. Иначе об этом должно было быть особо указано.
В прикрепленной обработке в цикле с объектом выполняется чтение реквизита одного и того же объекта.
Первый раз весь объект будет считан из базы, а все остальные - из кэша.
(Профессиональная разработка в системе 1С: Предприятие 8 (2007) --> Глава 4. работа с данными --> Объектные и необъектные данные --> Кэширование представлений и объектов)
По умолчанию, ведь, наверное, предполагаем, что в той задаче, о которой идет речь, кэш успевает сгореть. Иначе об этом должно было быть особо указано.
(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
1
Запросом, циклов3: 99 999
1
(14) taiba,
Ну, я так понимаю, речь немножко не о том.
По всей видимости, имеется в виду, что нам нужен в данный момент один реквизит одного объекта. Измерить время однократного обращения затруднительно, к тому же оно все равно различное в разных случаях. Поэтому надо как-то сделать так, чтобы аналогичных обращений было очень много. Стало быть, мы в цикле обращаемся и ожидаем увидеть уже ощутимые цифры.
Но здесь уже, конечно, надо стоить циклы так, чтобы то и другое обращение находились в равных условиях. Поэтому, если мы хотим сравнить время однократного обращения, то надо в циклах обращаться к разным объектам, в т.ч. выполнять запрос в цикле.
Другое дело, если в реальной задаче все-таки особые условия. Тогда если извлеваются реквизиты одного и того же объекта и кэш не успевает сгореть, то обращение к объекту будет иметь преимущество. А если обращаемся к разным объектам, и есть возможность передать эти объекты в запрос, то преимущество запроса будет еще более значительным (конечно же, в реальной задаче выполнять запрос в цикле, скорее всего, не будем).
Ну, я так понимаю, речь немножко не о том.
По всей видимости, имеется в виду, что нам нужен в данный момент один реквизит одного объекта. Измерить время однократного обращения затруднительно, к тому же оно все равно различное в разных случаях. Поэтому надо как-то сделать так, чтобы аналогичных обращений было очень много. Стало быть, мы в цикле обращаемся и ожидаем увидеть уже ощутимые цифры.
Но здесь уже, конечно, надо стоить циклы так, чтобы то и другое обращение находились в равных условиях. Поэтому, если мы хотим сравнить время однократного обращения, то надо в циклах обращаться к разным объектам, в т.ч. выполнять запрос в цикле.
Другое дело, если в реальной задаче все-таки особые условия. Тогда если извлеваются реквизиты одного и того же объекта и кэш не успевает сгореть, то обращение к объекту будет иметь преимущество. А если обращаемся к разным объектам, и есть возможность передать эти объекты в запрос, то преимущество запроса будет еще более значительным (конечно же, в реальной задаче выполнять запрос в цикле, скорее всего, не будем).
другой вариант, правда по последовательному доступу к справочнику http://forum.infostart.ru/forum24/topic73106/message785712/#message785712
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот