Как уже говорилось выше, возможности ссылки на клиенте сильно ограничены. Чтобы воспользоваться полными возможностями ссылки, можно, например, создать универсальную функцию ПолучитьРеквизитИзБазыДанных(Ссылка, ИмяРеквизита), поместить ее в общем модуле, исполняющемся на сервере, и использовать ее всякий раз, когда потребуется получить реквизит какого-нибудь объекта.
Поскольку функция универсальная, мы будем использовать ее в разных формах, поэтому поместим ее не в какой-то одной форме, а в общем модуле, чтобы все формы могли ею пользоваться.
Итак, создадим общий модуль конфигурации РаботаСОбъектами. По умолчанию у него установлен флажок Сервер, значит, экземпляры этого модуля будут скомпилированы на стороне сервера. Установим у него флажок Вызов сервера, чтобы экспортируемые процедуры и функции этого модуля можно было вызывать с клиента (рис. 4.16).

Рис. 4.16. Свойства модуля «РаботаСОбъектами»
Поместим в этом модуле функцию для получения реквизита объекта по его ссылке (листинг 4.3).
Листинг 4.3. Функция «ПолучитьРеквизитИзБазыДанных()»
Функция ПолучитьРеквизитИзБазыДанных(Ссылка, ИмяРеквизита) Экспорт
Возврат Ссылка[ИмяРеквизита];
КонецФункции
Чтобы обеспечить заполнение колонок табличной части приходной накладной при выборе товара, создадим форму документа и обработчик события ПриИзменении() для поля формы Товар, содержащегося в таблице формы Товары (листинг 4.4).
Листинг 4.4. Процедура «ТоварыТоварПриИзменении()»
&НаКлиенте
Процедура ТоварыТоварПриИзменении(Элемент)
ДанныеТекущейСтроки = Элементы.Товары.ТекущиеДанные;
ВыбранныйТовар = ДанныеТекущейСтроки.Товар;
ДанныеТекущейСтроки.Артикул = РаботаСОбъектами. ПолучитьРеквизитИзБазыДанных(ВыбранныйТовар, "Артикул");
ДанныеТекущейСтроки.ЕдИзм = РаботаСОбъектами. ПолучитьРеквизитИзБазыДанных(ВыбранныйТовар, "ЕдиницаИзмерения");
ДанныеТекущейСтроки.Цена = РаботаСОбъектами. ПолучитьРеквизитИзБазыДанных(ВыбранныйТовар, "Цена");
КонецПроцедуры
В этом обработчике мы получаем доступ к данным текущей строки таблицы формы в переменной ДанныеТекущейСтроки. Чтобы получить значение, содержащееся в конкретном поле текущей строки, нужно через точку указать имя этого поля (.Товар). Так мы получаем ссылку на выбранный товар и вместе с именем нужного реквизита передаем ее в функцию ПолучитьРеквизитИзБазыДанных(), которая возвращает нам значение этого реквизита.
ПРИМЕЧАНИЕ
Этот пример можно посмотреть в демонстрационной конфигурации «01 (вар. 1) Объединение нескольких вызовов сервера в один».
Посмотрим теперь, какие серверные вызовы будут происходить в режиме 1С:Предприятие в результате.
Для этого запустим «1С:Предприятие», откроем приходную накладную и сделаем выбор из справочника товаров в колонке Товар. После этого колонки табличной части Артикул, ЕдИзм и Цена будут автоматически заполнены соответствующими значениями из справочника Товары (рис. 4.17).

Рис. 4.17. Заполнение колонок табличной части в приходной накладной
Сразу после выбора товара посмотрим на показатели производительности (рис. 4.18).

Рис. 4.18. Показатели производительности
Там будет показано число вызовов сервера, в общем случае их будет три или больше. Больше трех вызовов может быть при первом выполнении этого действия, так как платформа выполняет запрос к информационной базе и кеширование необходимых данных. При втором и последующем выборе товара произойдет три вызова сервера.
Как мы уже говорили выше, когда платформа самостоятельно обращается к серверу, на это мы повлиять не можем. Поэтому подробно исследовать, почему серверных вызовов больше трех, мы не будем. Но три серверных вызова – это «наши вызовы», которые мы породили своим кодом. Рассмотрим подробнее, откуда они взялись.
Так происходит потому, что в результате использования универсальной функции ПолучитьРеквизитИзБазыДанных() будет происходить обращение на сервер столько раз, сколько понадобится получить реквизитов объекта. Таким образом, при выборе товара в строке табличной части документа произошло три вызова сервера, так как нам понадобилось узнать значение трех реквизитов выбранного товара.