Имя: Пароль:
1C
1С v8
Обращение через 2 точки к элементам формы
0 Мандалай
 
27.11.17
11:49
Добрый день.
По стандартам разработки 1С не принято обращаться к реквизитам справочника через 2 точки.
Но я не встречал рекомендации по поводу обращения через 2 точки к элементам формы.
Может кто видел рекомендации или тестировал подобные случаи?
1 Скиурус
 
27.11.17
11:56
>>По стандартам разработки 1С не принято обращаться к реквизитам справочника через 2 точки.
2 nordbox
 
27.11.17
11:57
??
3 Borteg
 
27.11.17
11:57
!!!!
4 Скиурус
 
27.11.17
11:57
>>По стандартам разработки 1С не принято обращаться к реквизитам справочника через 2 точки.
Не то чтобы не принято, просто надо понимать, что при этом происходит

>>Но я не встречал рекомендации по поводу обращения через 2 точки к элементам формы.
Что-то типа Элементы.Номенклатура.Код? Так вообще-то не получится. Или Элементы.Номенклатура.Видимость? ТАк пожалуйста
5 Buster007
 
27.11.17
11:58
(0) "Но я не встречал рекомендации по поводу обращения через 2 точки к элементам формы. " приведи пример
6 SSSSS_AAAAA
 
27.11.17
11:58
(0) А не пробовали почитать на чем, собственно, основа даваемая 1С рекомендация? И чем отличаются доступ к справочнику и доступ к элементу формы?
7 SSSSS_AAAAA
 
27.11.17
12:00
(0) Одинаковая запись совершенно не обязательно означает и одинаковые процессы.
8 Borteg
 
27.11.17
12:01
(0) Если можно приведите пример обращения к элементу справочника не через точки.
9 Мандалай
 
27.11.17
13:58
Я думал, это очевидно, что элементы формы отличаются от хранимых физических таблиц.

Пример обращения к элементам формы уважаемый Скириус уже привел (усложним задачу): "Элементы.Товары.Номенклатура.Видимость".
10 Мимохожий Однако
 
27.11.17
14:03
(9) ОФФ: У тебя курсовая что ли? С какой целью вопросы, которые можно будет понять банальным тестированием на практике?
11 Мандалай
 
27.11.17
14:04
(8)Контрагент.Код - некорректная запись (к базе формируется запрос, который вытаскивает объект, со всеми полями, из всех полученных полей нам нужен только "Код");
ОбщегоНазначенияКлиентСервер.ПолучитьЗначениеРеквизита(Контрагент,"Код") - корректная запись (к базе формируется запрос, который вытаскивает только одно поле "Код").
12 SSSSS_AAAAA
 
27.11.17
14:05
(9) "Я думал, это очевидно, что элементы формы отличаются от хранимых физических таблиц. "
Тогда какого лешего пытаешься сравнивать теплое с мягким и искать какие-то рекомендации по теме, очевидно, не требующей таких рекомендаций?
13 Мандалай
 
27.11.17
14:05
(9)Уважаемый, Вам не все равно? Если ответ знаете, будьте так любезны, ответьте на него, если нет, не засоряйте эфир.
14 Shrek_yar
 
27.11.17
14:06
(0) Элемент формы <> реквизит формы
15 Shrek_yar
 
27.11.17
14:10
(14) + рекомендации к реквизитам, к элементам формы они отношения не имеют. Может кому читать удобнее так

ЭлТовары = Элементы.Товары;
ЭлТовары["Номенклатура"].Видимость= ЛОЖЬ;
16 Мандалай
 
27.11.17
14:11
ОбщегоНазначенияКлиентСервер - с названием общего модуля я вроде как ошибся, главное что направление мысли задал :)
17 Мандалай
 
27.11.17
14:17
(14)Это я понимаю, просто тема с оптимизацией обращений к физическим таблицам уже разжевана вдоль и поперек, а тормоза в форме кроме как "во всем виновата корявая платформа ничего и не слышно".
18 SSSSS_AAAAA
 
27.11.17
14:19
(11) Сударь, вы чушь пишете. Ибо ОбщегоНазначенияКлиентСервер.ПолучитьЗначениеРеквизита(Контрагент,"Код") в конце концов таки именно Контрагент.Код и запросит. Ибо это и есть получение только кода, а не всего объекта.
А рекомендация о двух и более точках идет от создания дополнительного соединения от каждой следующей точки. К формам и их элементам это не имеет ни малейшего отношения.
19 SSSSS_AAAAA
 
27.11.17
14:20
(17) Разумеется. Ибо с формой работает только и исключительно платформа.
20 Мандалай
 
27.11.17
14:22
(19)Вот я и хочу понять, можно ли как то платформе
облегчить задачу обработки того, что есть на форме.
21 Мимохожий Однако
 
27.11.17
14:23
(13) Тихо сам с собою
22 Cyberhawk
 
27.11.17
14:25
(18) Гонишь и не краснеешь
23 SSSSS_AAAAA
 
27.11.17
14:27
(20) Поставить клиенту более быстрый комп.
24 ambrozii-fadeevich-s
 
27.11.17
14:30
(18) Есть такой стандарт
http://its.1c.ru/db/v8std/content/-2145783151/hdoc
Чтение отдельных реквизитов объекта из базы данных

так вот там прямо сказано, что  ... бла-бла... или обращение к реквизитам объекта через точку от ссылки приводит к загрузке объекта из базы целиком, вместе с его табличными частями.

И приведены примеры кода - как неправильно
СтранаСсылка = … // получаем ссылку на элемент справочника
КодСтраны = СтранаСсылка.Код; // первое обращение загружает объект целиком
НаименованиеСтраны = СтранаСсылка.Наименование;


И как правильно
большой текст с запросом к справочнику...

И внизу приписка
Для упрощения синтаксиса рекомендуется также использовать специальные функции ЗначенияРеквизитовОбъекта или ЗначениеРеквизитаОбъекта (входят в состав Библиотеки стандартных подсистем).
25 ambrozii-fadeevich-s
 
27.11.17
14:30
Но это не имеет никакого отношения к элементам формы.
26 Мандалай
 
27.11.17
14:31
(24)Взял всю интригу к фигам собачьим пофефил.
27 Мандалай
 
27.11.17
14:32
(25)Спасибо, я это понимаю, на этом же и основывался, когда вопрос задавал :)
28 ambrozii-fadeevich-s
 
27.11.17
14:34
(27) Элементы.Товары.Номенклатура.Видимость
Если есть явное явно
29 ambrozii-fadeevich-s
 
27.11.17
14:34
(28) подозрение на то ,что это тормозит, то можно попробовать условное оформление формы
30 ambrozii-fadeevich-s
 
27.11.17
14:37
В некоторых случаях условное оформление будет быстрее аналогичных конструкций в коде через видимость.
Причем условное оформление можно также задавать программно - в УТ и ЕРП полно в формах процедур, вызываемых из ПриСозданииНаСерервере

Но опять же - все индивидуально и зависит от конкретной формы и конкретного оформления.
31 vicof
 
27.11.17
14:39
(20) запросы в динамических списках оптимизируй, поменьше клади элементов на форму, при создании формы не пиши тяжёлый код, и будет твоя форма летать
32 vicof
 
27.11.17
14:40
Плюс надо смотреть профайлер, а не гадать на кофейной гуще в хрустальном шаре
33 Ненавижу 1С
 
гуру
27.11.17
14:43
Проблема не в том, что мы получаем какие-то мифические "все реквизиты", а в том, что мы делаем много маленьких запросиков:

Код = Контрагент.Код; //запрос 1
Наименование = Контрагент.Наименование; //запрос 2
ИНН = Контрагент.ИНН; //запрос 3

вместо того, чтобы получить все одним запросом
34 Cyberhawk
 
27.11.17
14:45
(33) Не будет нескольких запросов, объектный кэш же
35 Diman000
 
27.11.17
14:45
(33) Если это расположено друг за другом, то много запросов не будет, т.к. используется кэш.
Но первый запрос будет избыточным, особенно если есть табличные части.
36 Ненавижу 1С
 
гуру
27.11.17
14:46
(34) уверен? Контрагент это ссылка, а не объект тут
37 Diman000
 
27.11.17
14:47
(36) Пофиг. Профайлером давно проверялось.
38 ambrozii-fadeevich-s
 
27.11.17
14:51
(36) Совершенно точно.
Первый вызов где код - прочитает все по ссылке в память, последующие вызовы уже из считанного возьмут и базу дергать не будут.
Но суть в том, что если нужен только код и наименование, то зачем тащить еще инн, кпп, контактную информацию (всю) и т.д. - а это все тоже будет прочитано. Вот об этом и стандарт.
39 Timon1405
 
27.11.17
14:52
40 Cyberhawk
 
27.11.17
14:55
(36) Да. Еще злая шутка бывает, если за 20 секунд объект в БД был изменен где-то в другом сеансе, то данные в текущем сеансе, считываемые через точку, будут все еще получаться старые (из кэша). Ну это если вне транзакции обращение через точку.
41 Cyberhawk
 
27.11.17
14:58
Ну и аргумент "Контрагент это ссылка, а не объект тут" избыточен - если бы это был объект, то он бы был в памяти :)
42 Скиурус
 
27.11.17
15:00
(33) Только проблема маленьких запросов будет не в том случае, что ты написал, а если

Код = СсылкаНаДокумент.Контрагент.Код;//запрос 1

Наименование = СсылкаНаДокумент.Номенклатура.Наименование;//запрос 2

ИНН = СсылкаНаКонтрагент.Грузополучатель.ИНН;//запрос 3

т.е. именно через 2 точки не кошерно обращаться, через 1 можно (хотя какой-нибудь РТУ целиком подвисший в кеше не есть гуд)