Имя: Пароль:
1C
 
Анализ кода: Неужели так быстрее?
0 Ksandr
 
28.03.10
16:22
Из книжки по 8.2 товарища Радченко.

       Запрос = Новый Запрос;
       Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
       Запрос.Текст =
       "ВЫБРАТЬ
       | Дата
       |ИЗ
       | Документ.ВводНачальныхОстатковНоменклатуры
       |ГДЕ Ссылка = &ТекущийДокумент";

       Выборка = Запрос.Выполнить().Выбрать();
       Выборка.Следующий();


Неужели это быстрее чем Объект.Дата ?
1 IamAlexy
 
28.03.10
16:23
суть то одна и та же
2 Fragster
 
гуру
28.03.10
16:23
(0) в теории на больших выборках - быстрее
3 Fragster
 
гуру
28.03.10
16:24
потому что Объект.дата - заставит закешировать весь объект, а запрос - только прочитает дату, и все
4 Ksandr
 
28.03.10
16:24
(2) На больших, где обращаться приходится к множеству полей - да, а когда одно поле.
Хотя - да. с (3) Согласен.
5 vde69
 
28.03.10
16:26
оператор:

дата = обьект.дата

затянет на клиент весь обьект и потом получит дату, а в обьекте может быть ТЧ на 10 000 строк или бинарные данные...

а вот по чему не сделать

дата = ссылка.дата

я не понимаю
6 vde69
 
28.03.10
16:27
(3) точно, вопрос именно в кеше сервера, и его вытеснении...
7 Fragster
 
гуру
28.03.10
16:29
(5) ТЧ подтягиваться не будет
8 Один С
 
28.03.10
16:29
я думаю, проблема ваще не в том что Объект тянет весь объект.
а в том, что запросом получаются реальные данные, которые записаны.
если открыть док и поменять дату не записывая, то ваш "объект.дата" вернет новую дату.
а запрос старую.
как то так...
9 vde69
 
28.03.10
16:30
(7) ну бинарный реквизит на 100 метров с картинкой :)
10 Ksandr
 
28.03.10
16:33
(8) А иным способом получить хранимые в базе значения нельзя?
11 Defender aka LINN
 
28.03.10
16:36
(5) "а вот по чему не сделать дата = ссылка.дата" - потому что тогда из БД будут считаны ВСЕ реквизиты
12 Jolly Roger
 
28.03.10
16:38
(0) это не столько быстрее, сколько правильнее...
13 Злопчинский
 
28.03.10
16:40
(12) каков критерий "правильности"?
14 Jolly Roger
 
28.03.10
16:42
(13) у меня на подобные вопросы всегда один ответ: дорогу правильнее переходить на зеленый свет. кто не согласен, может переходить и на красный...
15 Злопчинский
 
28.03.10
16:45
(14) неверно, переход на зеленый свет - не есть правильно с точки зреняи пешехода. С точки зреняи пешехода переход на зеленый свет + отсутствие авто мчащихся на зеленый свет.
.
поэтому правильнее на зеленый свет переходить именно потому, что не цвет зеленый, а что в это время машины стоять должны. т.е. существует достаточно внятный критерий "правильности" перехода на зеленый свет.
.
вопрос снова: каков внятный критерий "правильности" сабжа?
16 Defender aka LINN
 
28.03.10
16:49
(15) Быстрее и таки правильнее. Запрос получает данные из БД, если их брать из объекта - есть вероятность, что реквизит изменился.
Кроме того, такой код можно легко перенести в другое место, если у тебя везде будет натыкано "Объект.Реквизит", то будешь потом переделывать.
Ну и вообще, есть методические указания, открой глаза и прочитай.
17 Jolly Roger
 
28.03.10
16:49
(15) я ж говорю: кто не согласен - сам себе злобный буратино. пусть переходит на красный. почему правильнее выбирать запросом в данном конкретном случае - ответ очевиден тому, кто понимает суть происходящего в том и другом случае...
18 Злопчинский
 
28.03.10
17:02
(17) злой ты.. ;-)
19 H A D G E H O G s
 
28.03.10
18:00
Быстрее, при любом размере выборки.
20 Fragster
 
гуру
28.03.10
18:02
(19) я имел ввиду, что есть места,  где разницей можно принебречь
21 Злопчинский
 
28.03.10
18:06
(19) а почему быстрее?
22 Mitriy
 
28.03.10
18:18
(21) см. (11)
23 Злопчинский
 
28.03.10
18:25
т.е. только за счет того, что чтение производится именно для конкретно указанного реквизита?
24 Fragster
 
гуру
28.03.10
18:33
(23) не используется кеш и все механизмы, с ним связанные
25 gae
 
28.03.10
21:59
(11) >>"а вот по чему не сделать дата = ссылка.дата" - потому что тогда из БД будут считаны ВСЕ реквизиты

Это точно?
26 gae
 
28.03.10
22:07
(25) :) Да, точно. Стр. 41 в "проф разработке".
27 Stepa86
 
28.03.10
22:09
(0) код конечно быстрее отрабатывает и в 8.2 на тонком и веб-клиенте свои заморочки (код в (0) наверно тянет данные из текущей строки таблицы формы)... но я предпочитаю сначала написать код быстро и правильно (то есть обычно я б написал объект.дата), а уже потом заниматься производительностью, если нужно.
28 Stepa86
 
28.03.10
22:13
(14) если нужно перейти дорогу, то я ее просто перейду, если вдруг возникают проблемы (сбили пару раз например), то тогда только начну искать светофор, переход и прочее... может мне изначально нужно перейти дорогу, на которой машины то раз в месяц появляются
29 Stepa86
 
28.03.10
22:17
(16) от того, что напишешь ссылка.Дата или код в (0) связность не изменится, поэтому даже если я перенесу код в другое место, то он перестанет работать при некорректной "Ссылка" в обоих случаях... вот если из контекста тянуть данные (обращаться просто Дата), то связность увеличивается со всеми вытекающими
30 gae
 
28.03.10
22:29
Вообще, в типовых на 8.1, при работе с формой, не считается зазорным получать данные "через точку"

РеализацияНаЭкспорт = ?(ЕстьДоговорКонтрагента, ?(ДокументОбъект.ДоговорКонтрагента.РеализацияНаЭкспорт = Истина, Истина, Ложь), Ложь);

а также использование тяжелых конструкций типа

ИмяТабличнойЧасти = Метаданные.НайтиПоТипу(ТипЗнч(СтрокаТабличнойЧасти)).Имя;

Не считается критичным. При записи-проведении другое дело.
31 Jolly Roger
 
28.03.10
22:36
(28) бугага! завязывай с игрухами, это опасно! в реале второго раза может и не быть....
32 mikecool
 
28.03.10
22:45
(27) "но я предпочитаю сначала написать код быстро и правильно (то есть обычно я б написал объект.дата), а уже потом заниматься производительностью, если нужно." - видно не работал никогда в большом проекте с жестким контролем качества и штрафами за лаги...
33 Defender aka LINN
 
28.03.10
22:46
(29) Если делать через запрос, то изменение потребуется только в одном месте - при установке параметра. В твоем варианте - везде.
34 Stepa86
 
28.03.10
22:50
(31) программирование немного не похоже на реальность... первый раз обычно ловится на тестировании
(32) а что есть большой проект? и почему эти принципы не подходит к большим проектам?
35 Armando
 
28.03.10
22:52
(0) Почитай ИТС: 'Особенности использования типов данных, предназначенных для манипулирования объектами базы данных' и 'В каких случаях использовать ссылку, запрос, выборку и объект'.
И Радченко по 8.2: стр. 440. Устройство кеша.
36 Stepa86
 
28.03.10
22:54
(33) в смысле везде? в одном месте, где идет обращение к дате через точку... если код в (0) вынесен в отдельным метод доступа, то и Ссылка.Дата тоже можно рассматривать как метод доступа
37 Stepa86
 
28.03.10
22:57
(32) штрафовать программиста за ошибки... да я б там сразу всех послал и ушел с такого проекта...
38 misha122062
 
28.03.10
23:10
(37)+1000
Там и текучка дай боже - сталкивался  с подобными фирмами.
Реализовавали в всемером большой проект и никто не штрафовал - потому что сразу сказали - баги будут. Контролируйте данные. На это и есть отладка
39 SnarkHunter
 
28.03.10
23:11
>> Послал бы и ушел...

Да вот никто не берет...
40 Defender aka LINN
 
28.03.10
23:13
(36) Тебе и правда нужен будет один реквизит объекта? Или все же несколько?
И вообще - на ИТС есть статья, в которой описываются рекомендации, потрудись ее прочесть.
(38) Тебя не штрафовать, тебя сразу гнать надо.
41 Masquerade
 
28.03.10
23:35
(37)
Ошибки - они разные бывают.
42 Эстет хренов
 
29.03.10
00:45
(0) ужасно, это методологические недоработки разработчиков.
пусть напишут нормальный геттер для реквизита (списка реквизитов).
43 YauheniL
 
29.03.10
01:12
Вот никогда не понимал в модуле проведения вот такой код (почти цитата):

...
ТекСклад =      Ссылка.Склад;
ТекКонтрагент = Ссылка.Контрагент;
ТекДоговор =    Ссылка.ДоговорКонтрагента;
...

Недоумение возникает на счет использования несколько раз конструкции Сссылка.Реквизит. Для чего? Ведь при проведении документ уже записан?
44 Stepa86
 
29.03.10
08:20
(40) ты всегда пишешь обращение к реквизиту какого либо объекта через запрос, а не через точку? в этой ситуации запрос vs через точку лично я вижу только плюс сл стороны запроса - быстрее отрабатывает, со стороны "через точку" - код ооочень простой и понятный и его легко можно будет модифицировать потом, при появлении проблем (про рефакторинг потрудись сам почитать что нить), если нужно...

Пример. Есть 2 программиста: П1 и П2. производительность абсолютно одинакова, задача поставлена абсолютно одинакова, но П1 каждую строчку кода пытается написать так, чтобы она работала быстрее (тратит при этом время на разработку + время на оптимизацию (Р + О)). П2 просто пишет код не заморачиваясь оптимизацией - время разработки Р. После того как П2 реализовал функционал и прогнал тесты он обнаружил, что узких мест в коде всего 20% от всего кода (правило 20/80), которые и нужно оптимизировать. Итого П2 потратит на разработку колвоСтрок * (Р + 0.2*О)), а у П1  колвоСтрок * (Р + О)). На выходе о обоих программистов одинаковые решения.


(41) вообще то не считаю обращение к реквизиту объекта через точку в общем случае ошибкой. иногда в каком либо контексте может быть, но не по умолчанию...
45 Jolly Roger
 
29.03.10
08:47
(44) безусловно, ты прав. но выбор способа решения сабжа зависит от понимания внутренних механизмов восьмерки...
46 Ksandr
 
29.03.10
08:55
Еще кстати встречал в книжке такого плана код:
в запросе:
ЧтоТо.Количество
ЧтоТо.Цена

А потом в переборе выборки результата:

Выборка.Количество * Выборка.Цена

А в запросе не эффективнее?
47 Ksandr
 
29.03.10
08:55
+ к (46) При этом поля по отдельности не используются
48 hhhh
 
29.03.10
09:38
(46) для больших массивов, например

Для к = 0 ПО 1000 Цикл
  ЧтоТо = массивСсылок[к];
  ЧтоТо.Количество
  ЧтоТо.Цена
КонецЦикла;

будет тормозить не по-детски.

При варианте с Выборкой тормозить не будет.
49 Serg_1960
 
29.03.10
09:47
Хм... Удивляюсь, что еще никто не послал автора :) в отладку - в замер производительности.
50 Defender aka LINN
 
29.03.10
09:52
(44) "ты всегда пишешь обращение к реквизиту какого либо объекта через запрос, а не через точку?" - да.
Про производительность - бред. Атомный.
51 Господин ПЖ
 
29.03.10
09:53
интересно как утверждение из (0) будет выглядеть на 8.2... ДокОбъект.Код все равно на сервере сидит
52 Господин ПЖ
 
29.03.10
09:56
кстати 8.2 вполне может увеличить кол-во "плохого кода". Проще написать на клиенте с помощью "magic number" логику чем нырять за каждой мелочью на сервер
53 Stepa86
 
29.03.10
09:57
(51) запрос на тонком клиенте тож не особо работает, да и вообще ветка в рамках 8.2
54 Stepa86
 
29.03.10
09:58
(52) я для этих целей кэшируемый модуль использую
55 Господин ПЖ
 
29.03.10
10:00
(54) это которых хранит результат? А как он все таки работает если в сигнатуре пользуются структуры?
56 Stepa86
 
29.03.10
10:02
(55) коллекции не использую просто, есть подозрение, что толку не будет от таких методов, даже кешируемых
57 Stepa86
 
29.03.10
10:14
(50) "Про производительность - бред. Атомный." и что бредового? это как бэ не я придумал, а вычитал у Макконнелла ( http://ru.wikipedia.org/wiki/Макконнелл,_Стив ), Кента Бека ( Kent Beck ) и Фаулера ( http://ru.wikipedia.org/wiki/Фаулер,_Мартин )  или они все ничего не понимают в программировании???
58 Serg_1960
 
29.03.10
10:54
(подколка) Ооо... Данные господа изучали 1С? Не знал :)
59 Stepa86
 
29.03.10
10:59
(58) данные господа изучали программирование в целом, а не конкретный инструмент... Вы же не будете учится готовить по инструкции к микроволновке?
60 Serg_1960
 
29.03.10
11:18
Тонкий юмор не дощел :)

"безусловно, ты прав. Но выбор способа решения сабжа зависит от понимания внутренних механизмов восьмерки" ( Jolly Roger )
61 Ksandr
 
29.03.10
11:32
(48) Речь о выборке результатов запроса
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.