|
Большая ли разница между получением реквизита объекта через запрос или "точку"? | ☑ | ||
---|---|---|---|---|
0
SeiOkami
19.11.12
✎
14:37
|
Готовлюсь к спецу по УТ 11. Смотрю пример сделанного отчета и сравниваю со своим. Такое заметил. Вот код моей формы:
&НаКлиенте Процедура ВидЦеныПриИзменении(Элемент) Если ЗначениеЗаполнено(Отчет.ВидЦены) тогда _УстановитьВалютуВидаЦен() КонецЕсли КонецПроцедуры &НаСервере Процедура _УстановитьВалютуВидаЦен() Отчет._Валюта = Отчет.ВидЦены.ВалютаЦены; КонецПроцедуры А вот код через запрос: &НаКлиенте Процедура ВидЦеныПриИзменении(Элемент) Если ЗначениеЗаполнено(Отчет.ВидЦены) Тогда Отчет.ВалютаОтчета=ПолучитьВалютуЦены(Отчет.ВидЦены); КонецЕсли; КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьВалютуЦены(ВидЦены) Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ | ВидыЦен.ВалютаЦены |ИЗ | Справочник.ВидыЦен КАК ВидыЦен |ГДЕ | ВидыЦен.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка",ВидЦены); Выборка=Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Рез=Выборка.ВалютаЦены; Иначе Рез=Неопределено; КонецЕсли; Возврат Рез; КонецФункции |
|||
1
SeiOkami
19.11.12
✎
14:38
|
Большая ли будет разница??? Есть ли смысл так извращаться?
|
|||
2
Maxus43
19.11.12
✎
14:38
|
через точку - считывается весь объект. через запрос - тока нужные поля
|
|||
3
НЕА123
19.11.12
✎
14:43
|
Если НЕ Отчет.ВидЦены.Пустая() тогда
_УстановитьВалютуВидаЦен() КонецЕсли |
|||
4
НЕА123
19.11.12
✎
14:44
|
(2)
уверен? даже в (0) и (3) весь объект? |
|||
5
SeiOkami
19.11.12
✎
14:45
|
(3) а почему именно так?
|
|||
6
Reset
19.11.12
✎
14:45
|
(4) Получение объекта в (0) происходит в процедуре _УстановитьВалютуВидаЦен()
|
|||
7
TormozIT
гуру
19.11.12
✎
14:47
|
Оба способа имеют свои плюсы.
Так что надо просто их знать и правильно использовать оба. Плюсы: Через точку - объект по ссылке кэшируется платформой на сервере. Через запрос - получаем только то, что нужно, а не весь объект (с табличными частями и строками неограниченной длинны и хранилищами значений). |
|||
8
SeiOkami
19.11.12
✎
14:49
|
Ну так и сильно будет толку, если во втором варианте мы сначала передаем вид цен в функцию, затем в запрос, а потом уже получаем валюту из выборки.?
Только поймите, я не спорю, а просто хочу понять и разобраться, чтобы приучиться, так сказать, сразу к наилучшему варианту =) |
|||
9
Поросенок Петр
19.11.12
✎
14:51
|
&НаСервереБезКонтекста
и &НаСервере вот где главная разница |
|||
10
НЕА123
19.11.12
✎
14:51
|
(5)
ЗначениеЗаполнено дольше отрабатывает. (6) > Отчет._Валюта = Отчет.ВидЦены.ВалютаЦены; дык при двух точках не создается. в 77 так было точно, что и логично. |
|||
11
France
19.11.12
✎
14:51
|
если через точку в цикле, то будешь троллить сервер, в то время как запросом все получишь за один раз
|
|||
12
Maxus43
19.11.12
✎
14:52
|
(4) Отчет. - после точки уже влечёт за собой считывание объекта "Отчет", т.е. по сути запрос на сервер вида "Отчет.*" посылается платформой. Имхо
|
|||
13
Reset
19.11.12
✎
14:53
|
(8) Первый вариант также приведет к "неявному" запросу на сервер (sql), только выбираться будут все поля, а не одно.
Грубо ВЫБРАТЬ | ВидыЦен.ВалютаЦены, | ВидыЦен.Код, | ВидыЦен.Наименование, | ВидыЦен.ЕщеПоле, | ВидыЦен.ЕщеПоле |ИЗ | Справочник.ВидыЦен КАК ВидыЦен |ГДЕ | ВидыЦен.Ссылка = &Ссылка"; |
|||
14
SeiOkami
19.11.12
✎
14:54
|
(9) то бишь если я в своём варианте поставлю &НаСервереБезКонтекста - будет лучше?
|
|||
15
Reset
19.11.12
✎
14:55
|
(10) Создается.
Отчет.ВидЦены - это ссылка. Для получения реквизита после второй точки делаться запрос на получение объекта по ссылке, из которого уже используется конкреткный реквизит |
|||
16
SeiOkami
19.11.12
✎
14:57
|
А если так?
&НаКлиенте Процедура ВидЦеныПриИзменении(Элемент) ВидЦены = Отчет.ВидЦены; Если НЕ ВидЦены.Пустая() тогда Отчет._Валюта = _УстановитьВалютуВидаЦен(ВидЦены); КонецЕсли КонецПроцедуры &НаСервереБезКонтекста Функция _УстановитьВалютуВидаЦен(ВидЦены) Возврат ВидЦены.ВалютаЦены; КонецФункции |
|||
17
SeiOkami
19.11.12
✎
14:58
|
Разница будет?
|
|||
18
НЕА123
19.11.12
✎
14:59
|
(15)
не буду спорить. но зачем тащить лишние данные? вот так при двух точках ВЫБРАТЬ | ВидыЦен.ВалютаЦены |ИЗ | Справочник.ВидыЦен КАК ВидыЦен |ГДЕ | ВидыЦен.Ссылка = &Ссылка"; |
|||
19
Reset
19.11.12
✎
14:59
|
(16) Это среднее между 1 и 2 :)
|
|||
20
Поросенок Петр
19.11.12
✎
14:59
|
(14) Вощем то будет однокуйственно. Получение значения через точку или через запрос мало отличаются временем (ну если в объекте не 9000 строк в ТЧ) по сравнению с самим серверным вызовом.
Вариант запросом тупо менее читабелен. |
|||
21
Reset
19.11.12
✎
14:59
|
(18)Да, зачем?
|
|||
22
SeiOkami
19.11.12
✎
15:00
|
А если еще обращаться к виду цен не через Отчет.ВидЦены, а через Элемент.Что-то (не помню как там) ?
|
|||
23
SeiOkami
19.11.12
✎
15:02
|
ну что бы объект отчета не читать =)
|
|||
24
Поросенок Петр
19.11.12
✎
15:02
|
Одна, две точки. Люди вы чо курите? ...
|
|||
25
Поросенок Петр
19.11.12
✎
15:03
|
Про объект отчета точно лучше не читать.
|
|||
26
НЕА123
19.11.12
✎
15:03
|
(24)
ты, это... тебе все равно не дадим... |
|||
27
ХочуСказать
19.11.12
✎
15:05
|
очень большая разница при использовании RLS на поля объекта
|
|||
28
SeiOkami
19.11.12
✎
15:06
|
в конкретном примере, конечно, разнице микроскопическая, так я же и говорю, что хочу, так сказать, изначально приспособиться к более оптимальному варианту, чтобы уже в последствии писать как лучше
|
|||
29
SeiOkami
19.11.12
✎
15:07
|
как то так =)
|
|||
30
SeiOkami
19.11.12
✎
15:13
|
Результат таков.
Имеем три варианта: №1: &НаКлиенте Процедура ВидЦеныПриИзменении(Элемент) Если ЗначениеЗаполнено(Отчет.ВидЦены) тогда _УстановитьВалютуВидаЦен() КонецЕсли КонецПроцедуры &НаСервере Процедура _УстановитьВалютуВидаЦен() Отчет._Валюта = Отчет.ВидЦены.ВалютаЦены; КонецПроцедуры №2: &НаКлиенте Процедура ВидЦеныПриИзменении(Элемент) ВидЦены = Отчет.ВидЦены; Если НЕ ВидЦены.Пустая() тогда Отчет._Валюта = _УстановитьВалютуВидаЦен(ВидЦены); КонецЕсли КонецПроцедуры &НаСервереБезКонтекста Функция _УстановитьВалютуВидаЦен(ВидЦены) Возврат ВидЦены.ВалютаЦены; КонецФункции №3: &НаКлиенте Процедура ВидЦеныПриИзменении(Элемент) Если ЗначениеЗаполнено(Отчет.ВидЦены) Тогда Отчет.ВалютаОтчета=ПолучитьВалютуЦены(Отчет.ВидЦены); КонецЕсли; КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьВалютуЦены(ВидЦены) Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ | ВидыЦен.ВалютаЦены |ИЗ | Справочник.ВидыЦен КАК ВидыЦен |ГДЕ | ВидыЦен.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка",ВидЦены); Выборка=Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Рез=Выборка.ВалютаЦены; Иначе Рез=Неопределено; КонецЕсли; Возврат Рез; КонецФункции По быстродействию их порядок (сначала самый быстрый): 3, 2, 1 По читабельности и "писабельности" (на мой взгляд) порядок с самого лучшего таков: 1, 2, 3 Значит оптимальный вариант № 2. Так выходит ? =) |
|||
31
Поросенок Петр
19.11.12
✎
15:14
|
Дело в том ещё, что подобные атомарные чтения практически никогда не нужны в каком-нить критической области, типа проведения. Обычно это нужно как у автора, походу работы с интерфейсом, т.е. там где выигрыш будет незаметен.
Впрочем если не думать, то лучше делать как партия говорит. Писать запросы. ПыСы: Вариант с запросом теперь хавает почти любой тип - программа стала менее безопасной. Впрочем, это щас мало кого парит. |
|||
32
Поросенок Петр
19.11.12
✎
15:15
|
*Писать запросы _ВЕЗДЕ_.
|
|||
33
SeiOkami
19.11.12
✎
15:22
|
(32) фиговое решение =(
а как же типовые построены ? иль 1с'никам по_ на нюансы своей платформы ? =) |
|||
34
ХочуСказать
19.11.12
✎
15:28
|
(33) почти везде запросы и используются
|
|||
35
H A D G E H O G s
19.11.12
✎
15:29
|
Правильно писать так:
ОбщегоНазначения.ПолучитьЗначениеРеквизита() ОбщегоНазначения.ПолучитьЗначениеРеквизитов() Все остальное - куйня. |
|||
36
H A D G E H O G s
19.11.12
✎
15:30
|
Поросенок Петр - дятелъ, кстати
|
|||
37
H A D G E H O G s
19.11.12
✎
15:32
|
(34) Не везде, либо кое - где аддски.
Посмотри замер производительности, когда жмякаешь галочку "Бух" в типовых документах типовой УПП. Вроде фигня, вроде и недолго, а все равно тормозит с секунду-две. |
|||
38
SeiOkami
19.11.12
✎
15:36
|
(35) а если конфа поменяется (измениться название, либо кол-во передаваемых параметров, либо еще чего), тогда работать не будет. Так надежнее
|
|||
39
H A D G E H O G s
19.11.12
✎
15:40
|
(38) Для этого запилили расширенную проверку.
|
|||
40
SeiOkami
19.11.12
✎
15:45
|
(39) что за "расширенная проверка" ?
|
|||
41
pumbaEO
19.11.12
✎
15:56
|
(0) Прочти (27) и используй "ВЫБРАТЬ РАЗРЕШЕННЫЕ " .
(39) РЛС расширенная проверка проверит? |
|||
42
SeiOkami
19.11.12
✎
16:07
|
(41), эээ, то бишь, если пользователю нельзя читать валюту, то выпадет ошибка?
|
|||
43
pumbaEO
19.11.12
✎
16:12
|
Да, но если будет в привелигированом модуле исполняться, то нет :).
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |