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