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

Второй вариант решения

Итак, устраним описанные выше ошибки. Для этого изменим обработчик команды ЗагрузитьКартинку следующим образом (листинг 4.40).

Листинг 4.40. Обработчик команды «Загрузить картинку»

&НаКлиенте

Процедура ЗагрузитьКартинку(Команда)

 

НачатьПомещениеФайла(Новый ОписаниеОповещения("ЗагрузитьКартинкуЗавершение", ЭтотОбъект), , , Истина , УникальныйИдентификатор);

 

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

В этом обработчике методом НачатьПомещениеФайла() открывается диалог выбора файла картинки с диска.

В процедуре обработки оповещения ЗагрузитьКартинкуЗавершение() в случае выбора файла картинки пользователем будут выполняться действия по загрузке картинки товара (листинг 4.41).

Листинг 4.41. Обработчик оповещения «ЗагрузитьКартинкуЗавершение»

&НаКлиенте

Процедура ЗагрузитьКартинкуЗавершение(Результат, АдресВХранилище, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт

 

Если Результат Тогда

Файл = Новый Файл(ВыбранноеИмяФайла);

Объект.ИмяФайла = Файл.Имя;

АдресКартинки = АдресВХранилище;

 

Модифицированность = Истина;

КонецЕсли;

 

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

В случае успешного выбора картинки короткое имя выбранного файла (ВыбранноеИмя) сохраняется в реквизите справочника ИмяФайла, и данные файла картинки помещаются во временное хранилище (АдресВХранилище). Адрес данных в этом хранилище сохраняется в реквизите формы АдресКартинки.

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

Как мы уже говорили, при выборе картинки данные еще не записаны в объект базы данных. Возможно, пользователь и не станет сохранять данные. В этом случае мы закроем форму, и данные временного хранилища, связанные с этой формой, будут автоматически уничтожены. Но если пользователь решит записать данные формы, то тогда нам нужно будет взять картинку из временного хранилища и сохранить ее в базе данных. Для этого создадим обработчик события формы ПередЗаписьюНаСервере и заполним его следующим образом (листинг 4.42).

Листинг 4.42. Обработчик события «ПередЗаписьюНаСервере»

&НаСервере

Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

 

Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресКартинки);

ТекущийОбъект.ДанныеФайлаКартинки = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());

 

КонецЕсли;

 

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

Это событие выполняется непосредственно перед записью объекта из формы, когда пользователь нажал Записать или Записать и закрыть.

В этой процедуре мы сохраняем значение картинки в том случае, если у нас есть ссылка на временное хранилище. В переменной ДвоичныеДанные сохраняются данные, полученные из временного хранилища по адресу АдресКартинки. Затем создается объект ХранилищеЗначения, в него помещается значение переменной ДвоичныеДанные, и значение объекта ХранилищеЗначения сохраняется в реквизите справочника ДанныеФайлаКартинки.

После записи картинки в объект нужно очистить временное хранилище и установить для реквизита формы АдресКартинки новую навигационную ссылку на реквизит объекта, хранящий данные картинки. Для этого создадим обработчик события формы ПриЗаписиНаСервере и заполним его следующим образом (листинг 4.43).

Листинг 4.43. Обработчик события «ПриЗаписиНаСервере»

&НаСервере

Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

 

Если ЭтоАдресВременногоХранилища(АдресКартинки) Тогда УдалитьИзВременногоХранилища(АдресКартинки);

 

КонецЕсли;

 

АдресКартинки = ПолучитьНавигационнуюСсылку(ТекущийОбъект.Ссылка, "ДанныеФайлаКартинки");

 

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

Это событие выполняется после записи данных объекта, но еще до окончания транзакции записи. Так что если по каким-то причинам объект не был записан в базу, в форме останется все по-прежнему и реквизит АдресКартинки будет указывать на временное хранилище, в котором будет находиться картинка объекта.

Процедуру ПоместитьФайлКартинки() теперь можно удалить из модуля формы, так как она больше не нужна.

ПРИМЕЧАНИЕ

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

Запустим «1С:Предприятие» и откроем форму элемента справочника Товары. Если у товара уже была выбрана картинка, она отразится в форме. Нажмем кнопку Загрузить картинку и изменим картинку товара. Выбранная картинка отобразится в поле картинки товара и будет записана в реквизит объекта ДанныеФайлаКартинки в тот момент, когда пользователь решит записать товар.

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

В результате из обработчика события нажатия кнопки Загрузить картинку (см. листинг 4.40) будут сделаны два вызова сервера (рис. 4.64).

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

Эти вызовы произойдут при выполнении метода НачатьПомещениеФайла(), и они оправданны, так как их делает платформа.

Посмотрим теперь, сколько вызовов сервера будет сделано при записи элемента справочника. Ведь именно в этот момент картинка окажется в базе данных. В форме товара нажмем кнопку Записать (рис. 4.65).

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

При первом нажатии произойдут три серверных вызова и затем – два вызова, если мы, не закрывая формы, снова и снова нажимаем кнопку Записать.

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

Таким образом, видно, что при записи выполняются «обычные» вызовы сервера, которые платформа сделала бы в любом случае. То есть на запись картинки товара мы не потратили дополнительных вызовов сервера.

В результате мы избавились от трех лишних вызовов сервера, которые были у нас в первом случае при вызове методов ПоместитьФайлКартинки() и ПолучитьНавигационнуюСсылку().

Назад: Первый вариант решения
Дальше: Резюме