Имя: Пароль:
1C
1С v8
Получение реквизитов справочника по ссылке
, , ,
0 Iater
 
19.06.15
20:23
Всем привет! Кто может растолковать мне вот это волшебство:

&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
    
    ФИО = Объект.ФИО;
    ЗаполнениеКод(ФИО);
    
КонецПроцедуры


Функция ЗаполнениеКод(ФИО)

        Объект.Код = ФИО.Код;    

КонецФункции


Вот что меня сильно смущает: Объект.ФИО содержит ссылку на справочник Сотрудники. Я передаю эту ссылку в функцию и заполняю поле Код нужным мне значением реквизита, полученного по этой ссылке. Вроде логично. Но я не понимаю почему не работает вот такой код:


&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
    
    ФИО = Объект.ФИО;
    Объект.Код = ФИО.Код;

КонецПроцедуры


Я вижу, что при передачи ссылке в функцию она магическим образом действительно работает как ссылка.
А когда я точно также обращаюсь к справочнику без функции, то ссылка почему-то не передается.
На картинке можно увидеть, что если нажать "вычислить выражение", то можно раскрыть ФИО и добраться до Кода (в случай с функцией):
http://i.imgur.com/Fq6VmeY.png
А если функцию не использовать, то раскрыть список невозможно
1 Iater
 
19.06.15
22:35
Я задал слишком сложный или слишком тупой вопрос? )))) Чего никто не отвечает?
2 mehfk
 
19.06.15
22:40
Нет здесь никого. В понедельник приходи.
3 Lexey_
 
19.06.15
23:04
(0) потому, что функция без явного указания директивы компиляции выполняется на сервере, а на клиенте значение через точку не получишь
4 Iater
 
20.06.15
00:28
(3) через точку не получишь? или вообще никак не получишь кроме как через функцию?
5 Elatiell
 
20.06.15
00:39
(4) Обращение через точку, это по сути запрос. Запросы на клиенте не доступны = > На клиенте через точку не получишь. Да, только через функцию, которая выполняется на сервере.
6 Shrek_yar
 
20.06.15
00:43
(0) деградация какая то, я бы еще понял если раньше с 7-кой работал или с 8.1.
7 Elatiell
 
20.06.15
00:44
(0) "раскрыть ФИО и добраться до Кода (в случай с функцией)"

Отлаживаешь код, скорее всего, в толстом клиенте, в толстом клиенте, грубо говоря, ты всегда находишься на сервере и все вычисления производишь там ну и т.к. запросы на сервере доступны, то и через точку ты можешь достучаться до кода.
8 Elatiell
 
20.06.15
00:45
(6) Все мы учились когда - то. =)
9 Zhuravlik
 
20.06.15
00:45
(4) Обращение через точку - это по сути запрос к ИБ, для получения значения реквизита.
Т.е. ФИО.Код - это запрос, вида
ВЫБРАТЬ * Из Справочник.Сотрудники КАК Сотрудник ГДЕ Сотрудник.Ссылка = &ФИО

(5) опередил)

Дополню лишь, что на сервере невыгодно обращаться через точку, т.к. точка от ссылки - это неявный запрос к ИБ, который получает ВСЕ реквизиты ссылки.
Для избежания этого рекомендуется создавать свой запрос. В типовых - везде практически есть функция ОМ:
ОбщегоНазначения.ПолучитьЗначениеРеквизита(ИмяРеквизита, Ссылка).
10 Elatiell
 
20.06.15
00:46
А кто-то до сих пор учится. -_- Век живи, век учись.
11 Iater
 
21.06.15
20:35
(9) Спасибо, Zhuravlik, очень помог! (5) тоже спасибо!!