Имя: Пароль:
1C
1С v8
Большая ли разница между получением реквизита объекта через запрос или "точку"?
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
Да, но если будет в привелигированом модуле исполняться, то нет :).