|
|
|
Почему почти везде используют запрос, а не саму табличную часть | ☑ | ||
|---|---|---|---|---|
|
0
Tonik2
17.10.08
✎
11:01
|
попробую пояснить
Запрос = Новый Запрос( "ВЫБРАТЬ | ТчТовары.Номенклатура.Представление КАК Номенклатура, | ТчТовары.ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения, | ТчТовары.Цена КАК Цена, | ТчТовары.Количество КАК Количество, | ТчТовары.ПроцентСкидкиНаценки + ТчТовары.ПроцентАвтоматическихСкидок КАК ПроцентСкидкиНаценки, | ТчТовары.СтавкаНДС, | ТчТовары.СуммаНДС |ИЗ | Документ.ЧекККМ.Товары КАК ТчТовары |ГДЕ | ТчТовары.Ссылка = &Ссылка"); Запрос.УстановитьПараметр("Ссылка", Ссылка); вот что-то типа такого встречается в конфе повсеместно. зачем столько кода, вместо просто обращения к ТЧ? это экономия трафика или что-то еще? спасибо |
|||
|
1
assasu
17.10.08
✎
11:10
|
в тч могут быть ссылки . придется каждый раз тягать их вместе с обращением.
|
|||
|
2
Tonik2
17.10.08
✎
11:20
|
ну а если запросом вытаскиваются ВСЕ поля ТЧ?
СтруктураПолей = УправлениеЗапасами.СформироватьСтруктуруПолейТабличнойЧасти(ЭтотОбъект, "Товары"); ну а дальше запрос по этой структуре. это ради унификации? или за этим чтоит что-то еще? |
|||
|
3
HEKPOH
17.10.08
✎
11:24
|
(0) Не совсем понятен вопрос. Или совсем не понятен. В тексте запроса (т.е. используется запрос) как раз и берется сама ТЧ
|
|||
|
4
tsr
17.10.08
✎
11:27
|
Если перебирать табличную часть в цикле, то это будет равносильно тому, что выполняется запрос по каждой строчке.
|
|||
|
5
Tonik2
17.10.08
✎
11:32
|
хм... а разве на клиенте нет ВСЕГО документа вместе с ТЧ? или имеется в виду запрос к ссылочным полям?
|
|||
|
6
НЕА123
17.10.08
✎
11:35
|
(0) скорее всего - просто унификация. привык с запросом работать.
такое в модуле объекта, дествительно очень даже похоже на бред. на куя лезть в базу, когда все есть в самом объекте. |
|||
|
7
tsr
17.10.08
✎
11:36
|
На клиенте только ссылки,имхо
|
|||
|
8
Vitello
17.10.08
✎
11:37
|
(5)В том то вся и фишка, чтобы не дергать все, а только то что нужно. К тому же объем передаваемых данных по сети уменьшается: скл обрабатывает все сам, и передает только результат запроса, а не объекты и все что к ним привязано целиком.
|
|||
|
9
PowerBoy
17.10.08
✎
11:39
|
(0) Объектный способ доступа к данным используют для изменения этого объекта, поэтому при этом много других накладных расходов ресурсов (Кэш, блокировки и т.д.) , а табличный способ для более быстрого чтения данных.
|
|||
|
10
НЕА123
17.10.08
✎
11:42
|
(9) да. но если уже объект считан, то зачем его опять читать?(в модуле объекта)
|
|||
|
11
Rovan
гуру
17.10.08
✎
11:44
|
(10) для соблюдения 1 стиля кода
|
|||
|
12
Rovan
гуру
17.10.08
✎
11:45
|
(+11) если объект считан и не изменен, то его вернет кэш, а не БД
|
|||
|
13
PowerBoy
17.10.08
✎
11:46
|
(10) Он мог измениться.
|
|||
|
14
JBF
17.10.08
✎
11:50
|
(10) Допустим пользователь открыл документ интерактивно. В этом случай весь объект загружается в память, но товары в табличной части - это ссылки. 1С не загружает в память вместе с документом-объектом другие объекты на которые есть ссылки в документе. Поэтому, когда ты в цикле перебираешь товары и пишешь, например, Товар.Цена, то 1С-у приходится загружать в память клиента весь объект Товар. В случае запроса на клиент передаются только нужные данные, если конечно запрос составлен верно. Т.е. если ты в запросе напишешь что тебя интересует цена, то запрос вернет тебе только цену, а все остальные реквизиты товара не будут переданы на клиент.
|
|||
|
15
Serg_1960
17.10.08
✎
11:51
|
(0) Все просто, Ватсон!
Запросом быстрее и "надежнее" - есть гарантия чтения последних данных в базе (база-то многопользовательская). Вы открыли форму документа и его исправили... Какие данные документа будем использовать? Те, которые кроме Вас, никто не видит? Или те, которые в Вашем кэше, - и возможно уже устарели? Да и документ содержит ссылки - за каждой ссылкой в базу опять лазить? |
|||
|
16
НЕА123
17.10.08
✎
12:00
|
(14) да ну? ссылки на строки ТЧ? не знал про такое.
зы ухуеть... |
|||
|
17
Serg_1960
17.10.08
✎
12:01
|
Вообще-то, не так все просто и "прямолинейно": да, считывается не "весь" объект - а только (грубо говоря) данные и ссылки "до первой точки". Но и обращение "через точку" - не всегда вызывает повторное чтение объекта. На сайте и ИТС по этому поводу есть статьи - автору рекомендую прочитать...
|
|||
|
18
Serg_1960
17.10.08
✎
12:02
|
(16) Ыыы... ну оговорился автор... хотел сказать про ссылки в ТЧ...
|
|||
|
19
igork1966
17.10.08
✎
12:02
|
(16) Где ты нашел в (14) "ссылки на строки ТЧ" ???
|
|||
|
20
Rebelx
17.10.08
✎
12:03
|
(15)не верно в корне.
запросом медленнее (можете проверить). а про надежность - если бы было верно то что вы говорите - это означает явные проблемы в механзме кеширования. В примере приведенном вами - открыли форму и изменили - должны использовать те данные, которые доступны форме (а т.к. считаем, что кеш работает корректно, эти же данные будут в кеше). По поводу ссылок объектов - как это за ссылкой в базу лазить? как вы будете в базе ссылку искать если у вас ее нет? значит она есть и лазить за ней не надо. В приведенном (0) примере смысла использовать запрос нет. Смысл использовать запрос начинается когда получаем данные через две точки - в этом случае можно уменьшить время на получение данных. |
|||
|
21
igork1966
17.10.08
✎
12:04
|
(18) он даже не оговорился, а НЕА123 невнимательно прочитал
|
|||
|
22
Serg_1960
17.10.08
✎
12:08
|
(20) И ты, Брутто :) Можно и поспорить, что быстрее запросом или напрямую(а Вас случайно не файловая версия?)... и про актуальность кэша, частоту его обновления можно поговорить...
|
|||
|
23
НЕА123
17.10.08
✎
12:10
|
(18)(14) примите мои извинения.
не совсем верно понял. выражение <но товары в табличной части - это ссылки> понял как ТЧ Товары. еще раз прошу прощения. |
|||
|
24
Tonik2
17.10.08
✎
12:11
|
(17)да это понятно. тот же LINQ делает также.
(20)спасибо. в принципе так и думал, что в данном примере унификация. просто уж как-то совсем до абсурда доводить не хочется. тода скорее вопрос по практике: а как пишет ALL? такую фигню тоже запросом, или так передает? |
|||
|
25
H A D G E H O G s
17.10.08
✎
12:13
|
Расшумелись..
(20) Немного заблуждаетесь. Вон, (22) верно думает. |
|||
|
26
Serg_1960
17.10.08
✎
12:14
|
Тормозим... В разговоре упомянули не просто "ссылки" - а "данные по ссылке" (такая тонкая разница :)
|
|||
|
27
Rebelx
17.10.08
✎
12:15
|
(22) я готов спорить. но обычно спорю на ящик пива. сейчас допиваю очедной. но виртуальное пиво не признаю.
поэтому только теория о скорости работы (про кеш не будем, мало доказуемо теоретически): запрос - суть обращение к БД через сервер 1С, потом к SQL, потом результат передается обратно. а что имеем в результате? коллекцию данных. а что в этой коллекции - данные табличной части проводимого документа. т.е. мы получили то, что уже есть в памяти - данные текущего объекта. где выйгрыш по времени с использованием запроса? |
|||
|
28
Rebelx
17.10.08
✎
12:16
|
(25) когда я могу заблуждаться - я молчу
|
|||
|
29
PowerBoy
17.10.08
✎
12:18
|
"т.е. мы получили то, что уже есть в памяти - данные текущего объекта." - а вот и нет.
|
|||
|
30
JBF
17.10.08
✎
12:20
|
(28) Когда речь идет о пакетной обработке документов, на сервере, например, то использование запросов выгоднее. Я думаю, что именно поэтому 1С использует запросы.
|
|||
|
31
Rebelx
17.10.08
✎
12:23
|
(29) а что же?
(30) чем выгоднее? |
|||
|
32
H A D G E H O G s
17.10.08
✎
12:23
|
(28) <где выйгрыш по времени с использованием запроса?> Никакого.
Если с момента получения ТЧ документа не прошло 20 секунд. |
|||
|
33
JBF
17.10.08
✎
12:24
|
(31) быстрее потому что
|
|||
|
34
PowerBoy
17.10.08
✎
12:26
|
(31) Он мог измениться. ...кажется я это уже говорил.
|
|||
|
35
Rebelx
17.10.08
✎
12:30
|
(32)не совсем так.
кеш работает так: Объект1 = Ссылка.ПолучитьОбъект(); // запрос в базу за данными объекта // пауза 0 сек Объект2 = Ссылка.ПолучитьОбъект(); // запрос в базу, а не изменились ли данные, //если не изменились - снова не перечитываем // пауза 30 сек Объект3 = Ссылка.ПолучитьОбъект(); // запрос в базу, за данными объекта ТЧ = Объект1.ТабЧасть; // никогда запроса в базу не будет. кеш тут не работает. (33)ты лично проверял? |
|||
|
36
Serg_1960
17.10.08
✎
12:34
|
(27) Вы взяли за основу предположение, что объект (документ) открыт и идет обращение к его ТЧ через запрос... Запрос в экспортной процедуре модуля объекта - и где здесь Ваш "частный" случай?... Надо мыслить шире :)
|
|||
|
37
almar
17.10.08
✎
12:37
|
(36) +1
|
|||
|
38
selenat
17.10.08
✎
12:41
|
(36) другими словами, ТЧ имеет смысл использовать в модуле формы, а не в экспортных процедурах модуля объекта. Так?
|
|||
|
39
Rebelx
17.10.08
✎
12:41
|
(36)совершенно верно. все что я сказал выше, относится только к случаю, когда у нас уже есть ДокументОбъект. В случае, если есть только ДокументСсылка - запрос быстрее.
однако используя встроенный телепат.длл я пришел к выводу что (0) имеет в виду использование запросов при проведении документов. а в этом случае у нас есть в памяти ДокументОбъект |
|||
|
40
Serg_1960
17.10.08
✎
12:42
|
Я не отвергаю и "слышу" то, что Вы мне говорите, - но "это все"... как бы сказать... временно и не постоянно: в очередной платформе наши рассуждения и утверждения могут стать пустым звуком... а запросы останутся и будут дальше оптимизироваться :)
|
|||
|
41
Rebelx
17.10.08
✎
12:45
|
(40)ок. сойдемся на этой точке. т.е. вы рассуждаете о какой-то абстрактной будущей версии, а я говорю о 1С v8.1
|
|||
|
42
Serg_1960
17.10.08
✎
12:50
|
Мы несколько отвлеклись :)
Если Вы не против, можно я поддытожу разговор утверждением того, что в модуле объекта не стоит исходить из того предположения, что объект "открыт" и его данные уже "доступны" на машине клиента? |
|||
|
43
unTonee
17.10.08
✎
12:53
|
Очень удобно использовать запросы в ТЧ, когда используешь RLS. При настройка RLS, что бы пользователь видель только то что ему нужно (нужные сторки таблицы).
В выборку запроса добавляется РАЗРЕШЕННЫЕ и вы можете легко пользоваться RLS. Но если всё делать через код, тут надо прилагать намного больше усилий! 1С пишет код, на мой взгляд, исходя не из скорости, а из удобности и правильности(кончено ни всегда это получается). |
|||
|
44
Rebelx
17.10.08
✎
13:07
|
(42) я против заканчивать разговор на в корне неверном утверждении.
*** в модуле объекта всегда присутствуют все данные объекта (т.е. они считаны в память)*** (43) супер. вы используете RLS ограничения на табличные части при проведении документов? интересно как? |
|||
|
45
Rebelx
17.10.08
✎
13:09
|
(44) это утверждение верно:
в модуле объекта ВСЕГДА присутствуют ВСЕ данные объекта (т.е. они считаны в память) |
|||
|
46
H A D G E H O G s
17.10.08
✎
13:24
|
(45) Вы не путаетесь?
Наименование=СсылкаНаНоменклатуру.Наименование; {выполняется частичное чтение объекта (код и наименование), создается кэш.} Если объект по ссылке был перезаписан (изменено значение поля TimeStamp), или прошло 20 секунд - кэш очищается. Емкость=СсылкаНаНоменклатуру.Емкость; {выполняется полное чтение объекта (все реквизиты, насчет ТЧ не знаю), создается кэш.} Если объект по ссылке был перезаписан (изменено значение поля TimeStamp), или прошло 20 секунд - кэш очищается. А Объект=СсылкаНаНоменклатуру.ПолучитьОбъект() - это просто прочитать данные в доступную переменную 1С (объект) |
|||
|
47
H A D G E H O G s
17.10.08
✎
13:28
|
(45) А вот почему не стоит печатать данные из ДокументОбъект:
1) Если ДокументОбъект создан вне модуля объекта - он не заблокирован и другой пользователь может поменять данные в БД 2) Если используется ДокументОбъект модуля объекта - в нем могут быть реквизиты, которые изменены в Объекта (оперативке), но не записаны в БД. После печати, в случае отказа пользователя на запись изменений - разночтения данных в БД и на бумаге. |
|||
|
48
unTonee
17.10.08
✎
13:30
|
(44)
> супер. вы используете RLS ограничения на табличные части при проведении документов? интересно как? Точно так же, как и на все остальные объект системы. Попробуйте и поймёте о чем я говорю. Каждая ТЧ может быть ограничена RLS. |
|||
|
49
asp
17.10.08
✎
13:31
|
(46) в кэш объектов считываются либо все данные объекта целиком, либо значения полей, необходимые для формирования представления ссылки на объект.
|
|||
|
50
MSensey
17.10.08
✎
13:32
|
(15) изучите мехнизм КЭШа платформы и не будете говорить таких глупостей
|
|||
|
51
Serg_1960
17.10.08
✎
13:34
|
Сэр Rebelx! Вы глубоко погрязли в невежестве и заблуждаетесь в своём неведении :))
|
|||
|
52
Rebelx
17.10.08
✎
13:36
|
(46)см.(28) и (39)
(47)никакой разницы КАК вы считываете данные (автоматически при создании объекта) или запросом нет, т.е. считаные данные будут одинаковы (если читать в один и тот же момент времени) (48)как? т.е. у вас есть документы, которые заводит пользователь, а провести может только половину из ТЧ? а куда деется вторая половина? (51)поясни |
|||
|
53
Serg_1960
17.10.08
✎
13:36
|
(50) Давайте изучать вместе механизм, Кеша :)
|
|||
|
54
Rovan
гуру
17.10.08
✎
13:37
|
(47)
"в модуле объекта ВСЕГДА присутствуют ВСЕ данные объекта (т.е. они считаны в память)" На момент считки данных, конечно же ! они же не будут постоянно самостоятельно обновляться Нужные более актуальные данные ? - надо делать еще раз запрос к данным |
|||
|
55
Rebelx
17.10.08
✎
13:41
|
(54)например:
считали запросом шапку. напечатали. считали таб. часть напечатали в этом случае рискуем получить нестыковку шапки и табчасти. зато печатали наиболее актуальные на момент печати данные :) |
|||
|
56
MSensey
17.10.08
✎
13:43
|
(53) а что интересует?
|
|||
|
57
Черный всадник
17.10.08
✎
13:48
|
(0, 31) Использование запросов выгоднее тем, что при проведении на сервере будет быстрее, на клиенте медленее. На клиенте есть кэш объектов, в то время как на сервере кэш таблиц.
|
|||
|
58
Serg_1960
17.10.08
✎
13:51
|
Коллеги, утверждение "в модуле объекта всегда присутствуют все данные объекта (т.е. они считаны в памяти)" - в принципе верно (кто спорит?) - но оно "молчит" про фактор времени... да и вообще, в дальнейших наших рассуждениях неприемлемо :(
Пожалуй соглашусь, что ссылки в документе относятся к данным документа... Но с киких-таких пор "ТчТовары.Номенклатура.Представление" (см.(0)) стало относиться к "данным объекта"? Сорри, коллеги, но "Наименование=Ссылка.Наименование" - вызывает чтение всего объекта (если его нет в кэше). Слово "частичное" здесь не уместно :( Поверьте на слово: Представление=Ссылка.Представление() и Представление=Строка(Ссылка) работают по разному и не зря придуманы были... |
|||
|
59
MSensey
17.10.08
✎
13:56
|
(58) >> Поверьте на слово: Представление=Ссылка.Представление() и Представление=Строка(Ссылка) работают по разному и не зря придуманы были
Конечно по разному - первое вызовет ошибку :) |
|||
|
60
Serg_1960
17.10.08
✎
14:04
|
(59) Опять к "букве", а не к "духу" сообщения придираетесь?
|
|||
|
61
MSensey
17.10.08
✎
14:05
|
(47) >> 1) Если ДокументОбъект создан вне модуля объекта - он не заблокирован и другой пользователь может поменять данные в БД
про какую блокировку речь? |
|||
|
62
MSensey
17.10.08
✎
14:06
|
(60) я придераюсь к сказаному, т.к. не понятно что вы имели ввиду
|
|||
|
63
Rebelx
17.10.08
✎
14:07
|
(37)приношу свои извинения, но бред написан.
(58)данные объекта не перечитываются из кеша, БД или еще откуда на протяжении всего времени существования объекта. (58) (20)В приведенном (0) примере смысла использовать запрос *нет* (это утверждение не верно). Смысл использовать запрос начинается когда получаем данные через две точки - в этом случае можно уменьшить время на получение данных. а запрос (0) содержит обращения через две точки. этого я не заметил. |
|||
|
64
Rebelx
17.10.08
✎
14:08
|
(63)не так: (57)приношу свои извинения, но бред написан.
|
|||
|
65
Serg_1960
17.10.08
✎
14:15
|
(59) Я тоже, приношу свои извинения, - сорри. Это я "загнул" в использовании терминов языка не подумавши :(.
В сообщении (58) я хотел сказать об отличиях в показе на форме ссылок, содержащихся в документе: Вы "видите" не сами ссылки, - а их строковое представление... это тоже надо учитывать... |
|||
|
66
H A D G E H O G s
17.10.08
✎
14:16
|
(63) Даже если бы была только одна точка - тоже надо использовать запрос
|
|||
|
67
Serg_1960
17.10.08
✎
14:32
|
Классно: покричали, поругались, помирились :) "Детские" вопросы всегда сложны... и запрос в (0) не так "прост" как кажется :) Все-таки надеюсь, что мы сообща больше "ответили" чем "запутали" автора. Но боюсь мы ввергли его в уныние своими глубокими познаниями особенностей работы платформы :)
PS: моя дочка (в детстве) предпочитала слышать ответы мамы "Потому что!" на свои "Почему...?" и ни разу не дослушивала мои ответы... Мне кажется, с тех пор, она не знает где Солнце восходит... |
|||
|
68
unTonee
17.10.08
✎
14:33
|
(52) Попробуйте провести. Вам не разрешат. В проводках такие ограничения не нужны, они нужны ны более ранних этапах.
(57) Соглачен полносотью! |
|||
|
69
Rovan
гуру
17.10.08
✎
14:44
|
(55) считывай одним запросом и шапку и ТЧ
|
|||
|
70
Rovan
гуру
17.10.08
✎
14:46
|
(67) Солнце вообще стоит на месте :-)
|
|||
|
71
Serg_1960
17.10.08
✎
14:54
|
(0) Прощаясь: на ИТС есть статья "В каких случаях использовать ссылку, запрос, выборку и объект".
|
|||
|
72
asp
17.10.08
✎
14:59
|
(71) там есть и гораздо более интересная информация :) Но в дополнение к ИТС может еще помочь книга Проф.разработка в 1С Предприятие, там подробно освещены вопросы о кешировании объектов на клиенте и сервере, уровнях изоляции etc
|
|||
|
73
MSensey
17.10.08
✎
15:02
|
проф разработка маст хэв
|
|||
|
74
unTonee
17.10.08
✎
17:14
|
(71)
Отличная статья, почитал на душе стало легче. |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |