В документе есть два реквизита формы Клиент (СправочникСсылка.Контрагенты) и Емэил (Строка)

Для того чтобы получить емэил клиента при его выборе, используются процедуры:

```1c
    &НаКлиенте
    Процедура КонтрагентПриИзменении(Элемент)
    ДобавитьПолучателей(Объект.Емэил, Объект.Контрагент);
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ДобавитьПолучателей(Емэил, Получатели)
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ЭлПочта ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Получатели";

    Запрос.Параметры.Вставить("Получатели", Получатели);
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Получатель <> " Тогда
    Емэил = Емэил + "; ";
    КонецЕсли;
    Емэил = Емэил + Выборка.ЭлПочта;
    КонецЦикла;
    КонецПроцедуры
```

"ЭлПочта" - это реквизит справочника Контрагенты.

Подскажите пожалуйста как обратиться сразу к значению реквизита "ЭлПочта", без запроса?
---
На УФ так делать = говнокод )
Передавать весь контекст формы, чтобы получить 1 значение неправильно. Правильно будет сделать безконтекстный вызов сервера, как и указано в (2).

```1c
    &НаКлиенте
    Процедура КонтрагентПриИзменении(Элемент)
    Объект.Емэйл = ПолучитьЭмейлКонтрагентаНаСервере(Объект.Контрагент);
    КонецПроцедуры

    &НаСерверБезКонтекста
    Функция ПолучитьЭмейлКонтрагентаНаСервере(Контрагент)
    Возврат = СоркЛП(Контрагент.ЭлПочта);
    КонецФункции
```
---
wmonref1, я так понимаю читать данные из базы можно либо в объектной модели либо запросом. Емэйл где в базе хранится? Судя по запросу - реквизит справочника контрагенты?
Тогда просто

```1c
    В документе есть два реквизита формы Клиент (СправочникСсылка.Контрагенты) и Емэил (Строка)

    Для того чтобы получить емэил клиента при его выборе, используются процедуры:

    &НаКлиенте
    Процедура КонтрагентПриИзменении(Элемент)
    Объект.Емэил = получитьМэйл(Объект.Контрагент);
    КонецПроцедуры

    &НаСервереБезКонтекста
    функция получитьМэйл(Получатели)
    возврат получатели.Емэил
    конецфункции
```
---
spe1c, Я так понимаю что по-простому, типа Объект.Емэил = СокрЛП(Объект.Контрагент.ЭлПочта), никак не получиться?
---
вам уже ответили в (2)
В УФ данные объекта лежат на сервере.
---
, (7), (10), (11) Всем спасибо! Вроде понял :)

В общих чертах можно сказать что: если делаем какие-то изменения на стороне клиента (&НаКлиенте) и хотим получить какие-то данные надо обязательно использовать "вызов сервера" (&НаСервере или &НаСерверБезКонтекста),т.е. эта процедура :

```1c
    &НаСервере
    Процедура ПокупательПриИзменении(Элемент)
    Объект.Емаил = Объект.Покупатель.ЭлПочта;
    КонецПроцедуры
```

не правильная?
---
wmonref1, правильная, но в общем случае не оптимальная, так как приведет к передаче на сервер всего контекста формы.
в (11) более корректное решение.
---
Я так понимаю что по-простому, типа Объект.Емэил = СокрЛП(Объект.Контрагент.ЭлПочта), никак не получиться?
На клиенте нет.
---
Кстати, а чем вас запрос не устраивает? Читать в объектной технике - это тот же запрос к базе, только неявный, а читать через несколько точек это вообще плохо.
---
spe1c, ну, в обычных формах это же ведь работает и часто используется...
---
wmonref1, в этом и отличие обычных форм от УФ.
---
Такое впечатление, что Вы меня не поняли...

Еще раз: в документе есть два реквизита формы: "Клиент" (СправочникСсылка.Контрагенты) и "Емэил" (Строка). В Справочнике Контрагенты есть реквизит "ЭлПочта". Я выбираю контрагента в документе и хочу чтоб реквизит "Емэил" заполнился данными из реквизита "ЭлПочта" того контрагента который выбран в "Клиент". В обычных формах это же делается очень просто:

```1c
    Процедура КонтрагентПриИзменении(Элемент)
    Емэил = СокрЛП(Контрагент.ЭлПочта);
    Конецпроцедуры
```

Есть какой-то "аналог" для УФ, кроме использования запроса?
---
На УФ делается как-то так

```1c
    &НаКлиенте
    Процедура КонтрагентПриИзменении(Элемент)
    КонтрагентПриИзмененииНаСервере();
    КонецПроцедуры

    &НаСервере
    Процедура КонтрагентПриИзмененииНаСервере()
    Объект.Емэил = Объект.Контрагент.ЭлПочта;
    Конецпроцедуры
```

сори... не заметил первый ответ под спойлером.
---
На УФ так делать = говнокод )
Передавать весь контекст формы, чтобы получить 1 значение неправильно. Правильно будет сделать безконтекстный вызов сервера, как и указано в (2).

```1c
    &НаКлиенте
    Процедура КонтрагентПриИзменении(Элемент)
    Объект.Емэйл = ПолучитьЭмейлКонтрагентаНаСервере(Объект.Контрагент);
    КонецПроцедуры

    &НаСерверБезКонтекста
    Функция ПолучитьЭмейлКонтрагентаНаСервере(Контрагент)
    Возврат = СоркЛП(Контрагент.ЭлПочта);
    КонецФункции
```
---
Можно же просто вытащить на форму реквизит ссылки
---
FirePyres, Оно бывает глючить. Точно было такое кеширование через несколько ".". Тоесть вывел реквизит реквизита реквизита :)
Сотрудник.ФизЛицо.ОсновноеМестоРаботы.Адрес.
И если поменять адрес, то на форме он обновится только после перезапуска 1С.
---
dj_serega, или всё-таки после обновления формы?
---
ben19791010, На 8.3.5.1248 в новом сеансе.
---
Ужос, давайте везде через запросы получать все реквизиты, а то вдруг они закэшируются :)
---
FirePyres, ну все же знаем поговорку про "дай ... он и сломает" :)
---
FirePyres, Полезно еще посчитать трафик между клиентом и сервером для разных вариантов реализации задачи.