Задача заключается в том, чтобы получить реквизит от ссылочного значения, хранящегося в реквизите формы. Например у документа Накладная есть реквизит ссылочного типа – Поставщик. Необходимо получить ИНН этого поставщика:
Мы находимся в модуле формы на клиенте. В контексте клиента ссылочные типы очень сильно ограничены в своих возможностях. В частности, нельзя получить значение реквизита от ссылки «через точку». Это можно сделать только в контексте сервера.
Поэтому для решения этой задачи в модуле формы создадим серверную внеконтекстную функцию, которую вызовем с клиента и передадим в нее ссылку на поставщика. В теле функции, на сервере, мы получим ИНН поставщика и вернем его на клиента.
Например, локальная команда формы, вызывающая серверную функцию, будет выглядеть следующим образом:
&НаКлиенте Процедура ПолучитьИННПоставщика(Команда)
ИННПоставщика = ПолучитьИНННаСервере(Объект.Поставщик);
КонецПроцедуры
А функцию ПолучитьИНННаСервере() опишем здесь же, в модуле формы:
&НаСервереБезКонтекста Функция ПолучитьИНННаСервере(СсылкаНаПоставщика)
Возврат СсылкаНаПоставщика.ИНН;
КонецФункции
Таким образом на сервере мы сразу же получаем значение реквизита "через точку" от полученной ссылки и возвращаем его на клиента.
Важно заметить, что функция ПолучитьИНННаСервере() не использует контекст формы (директива компиляции &НаСервереБезКонтекста). Потому что все, что нужно передать на сервер, – это только ссылка, и мы передаем ее в параметре функции. Использовать контекстный вызов и передавать на сервер весь контекст формы только ради того, чтобы на сервере взять из него значение одного реквизита формы, - это слишком расточительно.