Книга: Разработка интерфейса прикладных решений на платформе "1С:Предприятие 8"
Назад: Глава 4.3. Примеры оптимизации клиент-серверного взаимодействия
Дальше: Второй вариант решения

Первый вариант решения

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

Поскольку функция универсальная, мы будем использовать ее в разных формах, поэтому поместим ее не в какой-то одной форме, а в общем модуле, чтобы все формы могли ею пользоваться.

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

Рис. 4.16. Свойства модуля «РаботаСОбъектами»

Поместим в этом модуле функцию для получения реквизита объекта по его ссылке (листинг 4.3).

Листинг 4.3. Функция «ПолучитьРеквизитИзБазыДанных()»

Функция ПолучитьРеквизитИзБазыДанных(Ссылка, ИмяРеквизита) Экспорт

 

Возврат Ссылка[ИмяРеквизита];

 

КонецФункции

Чтобы обеспечить заполнение колонок табличной части приходной накладной при выборе товара, создадим форму документа и обработчик события ПриИзменении() для поля формы Товар, содержащегося в таблице формы Товары (листинг 4.4).

Листинг 4.4. Процедура «ТоварыТоварПриИзменении()»

&НаКлиенте

Процедура ТоварыТоварПриИзменении(Элемент)

 

ДанныеТекущейСтроки = Элементы.Товары.ТекущиеДанные;

ВыбранныйТовар = ДанныеТекущейСтроки.Товар;

ДанныеТекущейСтроки.Артикул = РаботаСОбъектами. ПолучитьРеквизитИзБазыДанных(ВыбранныйТовар, "Артикул");

ДанныеТекущейСтроки.ЕдИзм = РаботаСОбъектами. ПолучитьРеквизитИзБазыДанных(ВыбранныйТовар, "ЕдиницаИзмерения");

ДанныеТекущейСтроки.Цена = РаботаСОбъектами. ПолучитьРеквизитИзБазыДанных(ВыбранныйТовар, "Цена");

 

КонецПроцедуры

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

ПРИМЕЧАНИЕ

Этот пример можно посмотреть в демонстрационной конфигурации «01 (вар. 1) Объединение нескольких вызовов сервера в один».

Посмотрим теперь, какие серверные вызовы будут происходить в режиме 1С:Предприятие в результате.

Для этого запустим «1С:Предприятие», откроем приходную накладную и сделаем выбор из справочника товаров в колонке Товар. После этого колонки табличной части Артикул, ЕдИзм и Цена будут автоматически заполнены соответствующими значениями из справочника Товары (рис. 4.17).

Рис. 4.17. Заполнение колонок табличной части в приходной накладной

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

Рис. 4.18. Показатели производительности

Там будет показано число вызовов сервера, в общем случае их будет три или больше. Больше трех вызовов может быть при первом выполнении этого действия, так как платформа выполняет запрос к информационной базе и кеширование необходимых данных. При втором и последующем выборе товара произойдет три вызова сервера.

Как мы уже говорили выше, когда платформа самостоятельно обращается к серверу, на это мы повлиять не можем. Поэтому подробно исследовать, почему серверных вызовов больше трех, мы не будем. Но три серверных вызова – это «наши вызовы», которые мы породили своим кодом. Рассмотрим подробнее, откуда они взялись.

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

Назад: Глава 4.3. Примеры оптимизации клиент-серверного взаимодействия
Дальше: Второй вариант решения