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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В платформе 1С:Предприятие реквизиты с типом ХранилищеЗначения используются для сохранения произвольных сериализуемых данных (например, элементов типа СписокЗначений, ТаблицаЗначений, Структура, Массив или двоичных данных файлов). Рассмотрим подробно, как правильно записывать и считывать такие данные на сервере и в управляемых формах.

Базовый синтаксис записи и чтения

Для того чтобы записать любой объект в реквизит типа ХранилищеЗначения, его необходимо поместить в специальный оберточный объект с помощью конструктора Новый ХранилищеЗначения(). Разберем базовый пример работы на сервере или в модуле объекта:


// Запись значения в реквизит документа (например, СписокЗначений)
ОбъектДокумента.РеквизитХранилище = Новый ХранилищеЗначения(ПеременнаяЗначение);

// Извлечение значения из реквизита
МоеЗначение = ОбъектДокумента.РеквизитХранилище.Получить();

Порядок работы в управляемом приложении

В управляемых формах реквизиты с типом ХранилищеЗначения не включаются в данные формы (структуру ДанныеФормыСтруктура). Поэтому прямое обращение вида Объект.ИмяРеквизита на клиенте вызовет ошибку.

Проанализируем стандартный алгоритм передачи и сохранения данных при работе с управляемой формой:

  1. На клиенте помещаем нужные данные или файл во временное хранилище с помощью функции ПоместитьВоВременноеХранилище().
  2. Передаем полученный адрес временного хранилища на сервер при записи формы.
  3. В серверном обработчике ПередЗаписьюНаСервере извлекаем данные с помощью функции ПолучитьИзВременногоХранилища() и записываем их в реквизит объекта.

Посмотрим на пример реализации в форме документа:


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    Если ЗначениеЗаполнено(АдресВременногоХранилища) Тогда
        ДанныеИзХранилища = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
        ТекущийОбъект.РеквизитХранилище = Новый ХранилищеЗначения(ДанныеИзХранилища);
    КонецЕсли;
    
КонецПроцедуры

Оптимизация и сжатие данных

Если в реквизит планируется сохранять файлы большого объема или крупную структуру данных, рекомендуем использовать возможность автоматического сжатия. Это предотвращает быстрый рост базы данных:


// Создаем объект сжатия (указываем степень от 0 до 9)
Сжатие = Новый СжатиеДанных(9);
ОбъектДокумента.РеквизитХранилище = Новый ХранилищеЗначения(ПеременнаяЗначение, Сжатие);

Ключевые ограничения платформы

Выясним особенности и ограничения, которые необходимо учитывать при проектировании архитектуры:

  1. Язык запросов: Поля с типом ХранилищеЗначения нельзя выбирать, группировать или использовать в отборах языком запросов и в динамических списках.
  2. Требования к типам: В хранилище можно помещать только те типы, которые поддерживают сериализацию. Объекты базы данных (например, СправочникОбъект или ДокументОбъект) сохранить напрямую нельзя.
  3. Копирование документов: При копировании объекта данные из реквизита ХранилищеЗначения не заполняются автоматически на форме нового объекта, их считывание и копирование необходимо обрабатывать программно.
← На главную