Top.Mail.Ru

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

Автор статьи

Егор Романов
Разработчик 1С

При разработке пользовательского интерфейса на основе управляемых форм часто возникают задачи по работе с типом «ХранилищеЗначения». Особенностью этого типа данных является то, что реквизит объекта с типом «ХранилищеЗначения» недоступен в управляемой форме. 

Это связано с тем, что в реквизите с типом «ХранилищеЗначения» могут хранится данные большого размера. В управляемых формах реализована клиент-серверная архитектура, которая подразумевает, что данные формы передаются между клиентом и сервером. 

Если бы реквизит объекта с типом «ХранилищеЗначения» был доступен на форме, это бы негативно повлияло на производительность системы, особенно, когда клиент расположен не в одной локальной сети с сервером, а удаленно, да еще и с низкой скоростью соединения. В этой статье рассмотрим, как правильно работать c этим типом данных.

Разработка и новости из мира 1С

Подпишитесь на Телеграм-канал, чтобы быть в курсе

Постановка задачи

  1. Научиться получать данные с типом «ХранилищеЗначения» при открытии формы;

  2. Научиться работать с типом «ХранилищеЗначения» при использовании команд формы «Загрузить файл» и «Сохранить файл»;

  3. Научиться записывать данные с типом «ХранилищеЗначения» с использованием процедуры "ПередЗаписьюНаСервере";

  4. Научиться записывать данные с типом "ХранилищеЗначения" без использования процедуры "ПередЗаписьюНаСервере";

  5. Научиться выводить на форму картинку из реквизита с типом «Хранилище.

Значения».

Подготовительные действия

  1. Создадим документ «ТестовыйДокумент»;

  2. Создадим реквизит объекта «ПрисоединенныйФайл» с типом «ХранилищеЗначения»;

  3. Создадим форму документа;

  4. Создадим реквизит формы «СсылкаНаФайл» с типом «Строка»;

  5. Создадим команды формы «ЗагрузитьФайл» и «СохранитьФайл».

Без заголовка.png

Рисунок 1. Создание документа

2.png

Рисунок 2. Создание реквизита формы в форме документа

3.png

Рисунок 3. Создание команд в форме документа

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

В обработчике «ПриСозданииНаСервере» модуля формы документа проверим доступность реквизита объекта «ПрисоединённыйФайл».

4.png

Рисунок 4. Проверка доступности реквизита в процедуре «ПриСозданииНаСервере» модуля формы документа

Как видим, в процедуре «ПриСозданииНаСервере» модуля формы реквизит «ПрисоединённыйФайл» не доступен. Однако он доступен в процедуре «ПриЧтенииНаСервере».

5.png

Рисунок 5. Проверка доступности реквизита в процедуре «ПриЧтенииНаСервере» модуля формы документа

Первый способ как мы можем получить данные с типом «ХранилищеЗначения» - использовать метод «Получить» объекта «ХранилищеЗначения». Таким образом мы можем получить двоичные данные из реквизита объекта с типом «ХранилищеЗначения», затем поместить двоичные данные во временное хранилище, а ссылку на временное хранилище записать в реквизит формы «СсылкаНаФайл» с типом «Строка».

6.png

Рисунок 6. Получение двоичных данных из реквизита объекта с типом «ХранилищеЗначения» в событии «ПриЧтенииНаСервере» модуля формы документа

7.png

Рисунок 7. Запись двоичных данных во временное хранилище в событии «ПриЧтенииНаСервере» модуля формы документа

Здесь важно сказать про второй необязательный параметр «Адрес» функции глобального контекста «ПоместитьВоВременноеХранилище». В него мы передаем уникальный идентификатор формы. Если не указать параметр «Адрес», то данные из временного хранилища будут удалены после первого обращения.

8.png

Рисунок 8. Передача параметра «Адрес» в функцию глобального контекста «ПоместитьВоВременноеХранилище»

Второй способ как мы можем получить данные с типом «ХранилищеЗначения» - использовать метод глобального контекста «ПолучитьНавигационнуюСсылку». Причем его можно использовать как в процедуре «ПриЧтенииНаСервере», так и в процедуре «ПриСозданииНаСервере».

9.png

Рисунок 9. Получение навигационной ссылки на реквизит объекта с типом «ХранилищеЗначения» в процедуре «ПриЧтенииНаСервере»

10.png

Рисунок 10. Получение навигационной ссылки на реквизит объекта с типом «ХранилищеЗначения» в процедуре «ПриСозданииНаСервере»

 Важно обратить внимание на то, что метод глобального контекста «ПолучитьНавигационнуюСсылку» возвращает не ссылку на временное хранилище, а ссылку в формате 1С:Предприятия на реквизит объекта информационной базы.

11.png

Рисунок 11. Описание возвращаемого значения метода «ПолучитьНавигационнуюСсылку»

Какой подход использовать для получения данных из реквизита объекта с типом «ХранилищеЗначения» зависит от поставленной задачи.

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

Мы научились получать данные. Теперь дадим возможность пользователю сохранять и загружать данные. Создадим два элемента формы с типом «Кнопка».
13.png

Рисунок 12. Создание элементов формы с типом «Кнопка»

Напишем код для команды «ЗагрузитьФайл».

14.png

Рисунок 13. Код для команды «Загрузить данные»

В процедуре «ЗагрузитьФайл» открываем диалог выбора файла. В процедуре «ПослеЗагрузкиФайла» обрабатываем результат выбора файла и вызываем метод глобального контекста «НачатьПомещениеФайла». После того, как выбранный файл будет помещен во временное хранилище будет вызвана процедура «ПослеПомещенияФайла», а в параметр «Адрес» будет передан адрес данных во временном хранилище, куда был записан файл.

Напишем код для команды «СохранитьФайл».

15.png

Рисунок 14. Код для команды «Сохранить данные»

В процедуре «СохранитьФайл» вызываем диалог сохранения файла. В процедуре «ПослеВыбораСохранения» получаем данные из временного хранилища и сохраняем их в выбранный пользователем файл.

Как записывать данные с типом «ХранилищеЗначения» с использованием процедуры "ПередЗаписьюНаСервере"

Реквизит формы «СсылкаНаФайл» хранит ссылку на временное хранилище. Так как мы дали пользователю возможность загружать данные, при сохранении данных документа нам нужно сохранить двоичные данные, которые пользователь мог загрузить. В процедуре «ПередЗаписьюНаСервере» получаем двоичные данные из временного хранилища и записываем их в реквизит объекта «ПрисоединенныйФайл» с типом «ХранилищеЗначения».


16.png

Рисунок 15. Сохранение двоичных данных в реквизит объекта с типом «ХранилищеЗначения»

Как записывать данные с типом "Хранилище значения" без использования процедуры "ПередЗаписьюНаСервере"

Иногда возникает задача «Показать диалог выбора файла и затем сохранить указанный файл в реквизите с типом «Хранилище значения» без использования процедуры «ПередЗаписьюНаСервере» модуля формы». Продемонстрируем как это можно реализовать. Создадим команду формы «ВыбратьФайлИ_СохранитьДанные». Создадим элемент формы с типом «Кнопка» и свяжем элемент формы и команду.

17.png

Рисунок 16. Создание команды формы и элементы формы «Выбрать файл и сохранить данные»

Напишем код для команды «Выбрать файл и сохранить данные».

18.png

Рисунок 17. Код для команды «Выбрать файл и сохранить данные»

В процедуре «ВыбратьФайлИ_СохранитьДанные» открываем диалог выбора и вызываем метод глобального контекста «НачатьПомещениеФайлаНаСервер», который помещает выбранный файл во временное хранилище.

В процедуре «ВыбратьФайлИ_СохранитьЗавершение» получаем адрес данных во временном хранилище, передаем его в серверную процедуру «СохранитьНаСервере» и обновляем элемент формы «Картинка».

В процедуре «СохранитьНаСервере»:

  1. Получаем двоичные данные из временного хранилища;

  2. В переменную «ДокументОбъект» записываем реквизит формы «Объект»;

  3. В реквизит объекта «ПрисоединённыйФайл» записываем двоичные данные выбранного файла;

  4. Записываем «ДокументОбъект» и записываем значение «ДокументОбъект» в реквизит формы «Объект»;

  5. Обновляем значение реквизита формы «СсылкаНаФайл».

Проверяем результат:

19.png

Рисунок 18. Проверка работы команды «Выбрать файл и сохранить данные»

После выбора файла картинка на форме обновляется, а двоичные данные файла сохраняются в реквизит объекта «ПрисоединённыйФайл» с типом «ХранилищеЗначения».

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

Добавим элемент формы с типом «Поле», свойство элемента формы «вид» установим как «Поле картинки», а также свяжем элемент формы с реквизитом формы «СсылкаНаФайл».

20.png

Рисунок 19. Создание элемента формы с типом «Поле» и видом «Поле картинки»

Вывести картинку на форму из реквизита с типом с типом «ХранилищеЗначения» мы можем двумя способами. Первый способ, когда реквизит формы «СсылкаНаФайл» содержит ссылку на временное хранилище.

21.png

Рисунок 20. Первый способ вывода картинки на форму. Реквизит формы «СсылкаНаФайл» содержит ссылку на временное хранилище

Второй способ, когда реквизит формы «СсылкаНаФайл» содержит ссылку на реквизит объекта информационной базы в формате 1С:Предприятия.

22.png

Рисунок 21. Второй способ вывода картинки на форму. Реквизит формы «СсылкаНаФайл» содержит ссылку на реквизит объекта информационной базы в формате 1С:Предприятия

Оба способа позволяют форме отобразить данные из реквизита с типом «ХранилищеЗначения».

23.png

Рисунок 22. Отображение реквизита объекта с типом «ХранилищеЗначения» на форме

Итоги

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

Исходные данные

Платформа «1С:Предприятие 8.3, учебная версия (8.3.24.1342)» (Windows).


Разработка и новости из мира 1С

Подпишитесь на Телеграм-канал, чтобы быть в курсе

Эту статью хорошо дополняют
Казначейство в 1С:ERP. Планирование денежного потока
Реализация конфигурации с нуля. Портал для клиентов организации с синхронизацией с учетной системой
Частичная ликвидация основных средств в 1С
Модернизация основного средства в 1С
Основы бюджетирования и способы его автоматизации в 1С
Разукомплектация основного средства в 1С
Основные отличия 1С: Бухгалтерия 8 ПРОФ от КОРП
Основные отличия ПРОФ и КОРП 1С: Документооборот
Назначение и особенности 1С: Бухгалтерия 8
Заполните форму
Свяжитесь с нами
1С: разработка и новости

Подпишитесь на канал, чтобы быть в курсе


Свяжитесь с нами