Как работать с типом «Хранилище значения» в управляемых формах
Автор статьи

При разработке пользовательского интерфейса на основе управляемых форм часто возникают задачи по работе с типом «ХранилищеЗначения». Особенностью этого типа данных является то, что реквизит объекта с типом «ХранилищеЗначения» недоступен в управляемой форме.
Это связано с тем, что в реквизите с типом «ХранилищеЗначения» могут хранится данные большого размера. В управляемых формах реализована клиент-серверная архитектура, которая подразумевает, что данные формы передаются между клиентом и сервером.
Если бы реквизит объекта с типом «ХранилищеЗначения» был доступен на форме, это бы негативно повлияло на производительность системы, особенно, когда клиент расположен не в одной локальной сети с сервером, а удаленно, да еще и с низкой скоростью соединения. В этой статье рассмотрим, как правильно работать c этим типом данных.
Подпишитесь на Телеграм-канал, чтобы быть в курсе
Постановка задачи
-
Научиться получать данные с типом «ХранилищеЗначения» при открытии формы;
-
Научиться работать с типом «ХранилищеЗначения» при использовании команд формы «Загрузить файл» и «Сохранить файл»;
-
Научиться записывать данные с типом «ХранилищеЗначения» с использованием процедуры "ПередЗаписьюНаСервере";
-
Научиться записывать данные с типом "ХранилищеЗначения" без использования процедуры "ПередЗаписьюНаСервере";
-
Научиться выводить на форму картинку из реквизита с типом «Хранилище.
Значения».
Подготовительные действия
-
Создадим документ «ТестовыйДокумент»;
-
Создадим реквизит объекта «ПрисоединенныйФайл» с типом «ХранилищеЗначения»;
-
Создадим форму документа;
-
Создадим реквизит формы «СсылкаНаФайл» с типом «Строка»;
-
Создадим команды формы «ЗагрузитьФайл» и «СохранитьФайл».

Рисунок 1. Создание документа
Рисунок 2. Создание реквизита формы в форме документа
Рисунок 3. Создание команд в форме документа
Как получить данные с типом «Хранилище значения» при открытии формы
В обработчике «ПриСозданииНаСервере» модуля формы документа проверим доступность реквизита объекта «ПрисоединённыйФайл».
Рисунок 4. Проверка доступности реквизита в процедуре «ПриСозданииНаСервере» модуля формы документа
Как видим, в процедуре «ПриСозданииНаСервере» модуля формы реквизит «ПрисоединённыйФайл» не доступен. Однако он доступен в процедуре «ПриЧтенииНаСервере».
Рисунок 5. Проверка доступности реквизита в процедуре «ПриЧтенииНаСервере» модуля формы документа
Первый способ как мы можем получить данные с типом «ХранилищеЗначения» - использовать метод «Получить» объекта «ХранилищеЗначения». Таким образом мы можем получить двоичные данные из реквизита объекта с типом «ХранилищеЗначения», затем поместить двоичные данные во временное хранилище, а ссылку на временное хранилище записать в реквизит формы «СсылкаНаФайл» с типом «Строка».
Рисунок 6. Получение двоичных данных из реквизита объекта с типом «ХранилищеЗначения» в событии «ПриЧтенииНаСервере» модуля формы документа
Рисунок 7. Запись двоичных данных во временное хранилище в событии «ПриЧтенииНаСервере» модуля формы документа
Здесь важно сказать про второй необязательный параметр «Адрес» функции глобального контекста «ПоместитьВоВременноеХранилище». В него мы передаем уникальный идентификатор формы. Если не указать параметр «Адрес», то данные из временного хранилища будут удалены после первого обращения.
Рисунок 8. Передача параметра «Адрес» в функцию глобального контекста «ПоместитьВоВременноеХранилище»
Второй способ как мы можем получить данные с типом «ХранилищеЗначения» - использовать метод глобального контекста «ПолучитьНавигационнуюСсылку». Причем его можно использовать как в процедуре «ПриЧтенииНаСервере», так и в процедуре «ПриСозданииНаСервере».
Рисунок 9. Получение навигационной ссылки на реквизит объекта с типом «ХранилищеЗначения» в процедуре «ПриЧтенииНаСервере»
Рисунок 10. Получение навигационной ссылки на реквизит объекта с типом «ХранилищеЗначения» в процедуре «ПриСозданииНаСервере»
Важно обратить внимание на то, что метод глобального контекста «ПолучитьНавигационнуюСсылку» возвращает не ссылку на временное хранилище, а ссылку в формате 1С:Предприятия на реквизит объекта информационной базы.
Рисунок 11. Описание возвращаемого значения метода «ПолучитьНавигационнуюСсылку»
Какой подход использовать для получения данных из реквизита объекта с типом «ХранилищеЗначения» зависит от поставленной задачи.
Как работать с типом «ХранилищеЗначения» при использовании команд формы
Мы научились получать данные. Теперь дадим возможность пользователю сохранять и загружать данные. Создадим два элемента формы с типом «Кнопка».
Рисунок 12. Создание элементов формы с типом «Кнопка»
Напишем код для команды «ЗагрузитьФайл».
Рисунок 13. Код для команды «Загрузить данные»
В процедуре «ЗагрузитьФайл» открываем диалог выбора файла. В процедуре «ПослеЗагрузкиФайла» обрабатываем результат выбора файла и вызываем метод глобального контекста «НачатьПомещениеФайла». После того, как выбранный файл будет помещен во временное хранилище будет вызвана процедура «ПослеПомещенияФайла», а в параметр «Адрес» будет передан адрес данных во временном хранилище, куда был записан файл.
Напишем код для команды «СохранитьФайл».
Рисунок 14. Код для команды «Сохранить данные»
В процедуре «СохранитьФайл» вызываем диалог сохранения файла. В процедуре «ПослеВыбораСохранения» получаем данные из временного хранилища и сохраняем их в выбранный пользователем файл.
Как записывать данные с типом «ХранилищеЗначения» с использованием процедуры "ПередЗаписьюНаСервере"
Реквизит формы «СсылкаНаФайл» хранит ссылку на временное хранилище. Так как мы дали пользователю возможность загружать данные, при сохранении данных документа нам нужно сохранить двоичные данные, которые пользователь мог загрузить. В процедуре «ПередЗаписьюНаСервере» получаем двоичные данные из временного хранилища и записываем их в реквизит объекта «ПрисоединенныйФайл» с типом «ХранилищеЗначения».

Рисунок 15. Сохранение двоичных данных в реквизит объекта с типом «ХранилищеЗначения»
Как записывать данные с типом "Хранилище значения" без использования процедуры "ПередЗаписьюНаСервере"
Иногда возникает задача «Показать диалог выбора файла и затем сохранить указанный файл в реквизите с типом «Хранилище значения» без использования процедуры «ПередЗаписьюНаСервере» модуля формы». Продемонстрируем как это можно реализовать. Создадим команду формы «ВыбратьФайлИ_СохранитьДанные». Создадим элемент формы с типом «Кнопка» и свяжем элемент формы и команду.
Рисунок 16. Создание команды формы и элементы формы «Выбрать файл и сохранить данные»
Напишем код для команды «Выбрать файл и сохранить данные».
Рисунок 17. Код для команды «Выбрать файл и сохранить данные»
В процедуре «ВыбратьФайлИ_СохранитьДанные» открываем диалог выбора и вызываем метод глобального контекста «НачатьПомещениеФайлаНаСервер», который помещает выбранный файл во временное хранилище.
В процедуре «ВыбратьФайлИ_СохранитьЗавершение» получаем адрес данных во временном хранилище, передаем его в серверную процедуру «СохранитьНаСервере» и обновляем элемент формы «Картинка».
В процедуре «СохранитьНаСервере»:
-
Получаем двоичные данные из временного хранилища;
-
В переменную «ДокументОбъект» записываем реквизит формы «Объект»;
-
В реквизит объекта «ПрисоединённыйФайл» записываем двоичные данные выбранного файла;
-
Записываем «ДокументОбъект» и записываем значение «ДокументОбъект» в реквизит формы «Объект»;
-
Обновляем значение реквизита формы «СсылкаНаФайл».
Проверяем результат:
Рисунок 18. Проверка работы команды «Выбрать файл и сохранить данные»
После выбора файла картинка на форме обновляется, а двоичные данные файла сохраняются в реквизит объекта «ПрисоединённыйФайл» с типом «ХранилищеЗначения».
Как из реквизита с типом «ХранилищеЗначения» выводить картинку на форму
Добавим элемент формы с типом «Поле», свойство элемента формы «вид» установим как «Поле картинки», а также свяжем элемент формы с реквизитом формы «СсылкаНаФайл».
Рисунок 19. Создание элемента формы с типом «Поле» и видом «Поле картинки»
Вывести картинку на форму из реквизита с типом с типом «ХранилищеЗначения» мы можем двумя способами. Первый способ, когда реквизит формы «СсылкаНаФайл» содержит ссылку на временное хранилище.
Рисунок 20. Первый способ вывода картинки на форму. Реквизит формы «СсылкаНаФайл» содержит ссылку на временное хранилище
Второй способ, когда реквизит формы «СсылкаНаФайл» содержит ссылку на реквизит объекта информационной базы в формате 1С:Предприятия.
Рисунок 21. Второй способ вывода картинки на форму. Реквизит формы «СсылкаНаФайл» содержит ссылку на реквизит объекта информационной базы в формате 1С:Предприятия
Оба способа позволяют форме отобразить данные из реквизита с типом «ХранилищеЗначения».
Рисунок 22. Отображение реквизита объекта с типом «ХранилищеЗначения» на форме
Итоги
Таким образом мы выполнили поставленные задачи: научились получать данные с типом «ХранилищеЗначения» при открытии формы, сохранять двоичные данные при сохранении документа, загружать и сохранять двоичные данные через команды формы, а также выводить двоичные данные в виде картинки на форму.
Исходные данные
Платформа «1С:Предприятие 8.3, учебная версия (8.3.24.1342)» (Windows).
Подпишитесь на Телеграм-канал, чтобы быть в курсе