Имя: Пароль:
1C
 
Почему почти везде используют запрос, а не саму табличную часть
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)
Отличная статья, почитал на душе стало легче.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой