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

Рис. 4.22. Подстановка актуальной цены товара в расходную накладную
В результате использования процедуры РозничнаяЦена() для подстановки цены в документ будет происходить одно обращение на сервер (рис. 4.23).

Рис. 4.23. Показатели производительности
ПРИМЕЧАНИЕ
Заметим, что при первом выборе товара может быть лишний серверный вызов за счет автоматического кеширования формой данных в списке выбора. Но мы не будем исследовать эту ситуацию, так как этот вызов делается платформой, а нас интересуют вызовы, инициированные разработчиком.