13.10.2010

Как получить реквизит от ссылочного значения, хранящегося в реквизите формы?

Задача заключается в том, чтобы получить реквизит от ссылочного значения, хранящегося в реквизите формы. Например у документа Накладная есть реквизит ссылочного типа – Поставщик. Необходимо получить ИНН этого поставщика:

Мы находимся в модуле формы на клиенте. В контексте клиента ссылочные типы очень сильно ограничены в своих возможностях. В частности, нельзя получить значение реквизита от ссылки «через точку». Это можно сделать только в контексте сервера.

Поэтому для решения этой задачи в модуле формы создадим серверную внеконтекстную функцию, которую вызовем с клиента и передадим в нее ссылку на поставщика. В теле функции, на сервере, мы получим ИНН поставщика и вернем его на клиента.

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

Копировать в буфер обмена

&НаКлиенте
Процедура ПолучитьИННПоставщика(Команда)
                
     ИННПоставщика = ПолучитьИНННаСервере(Объект.Поставщик);
               
КонецПроцедуры

А функцию ПолучитьИНННаСервере() опишем здесь же, в модуле формы:

Копировать в буфер обмена
&НаСервереБезКонтекста
Функция ПолучитьИНННаСервере(СсылкаНаПоставщика)
                
     Возврат СсылкаНаПоставщика.ИНН;
                
КонецФункции  

Таким образом на сервере мы сразу же получаем значение реквизита "через точку" от полученной ссылки и возвращаем его на клиента.

Важно заметить, что функция ПолучитьИНННаСервере() не использует контекст формы (директива компиляции &НаСервереБезКонтекста). Потому что все, что нужно передать на сервер, – это только ссылка, и мы передаем ее в параметре функции. Использовать контекстный вызов и передавать на сервер весь контекст формы только ради того, чтобы на сервере взять из него значение одного реквизита формы, - это слишком расточительно.