ХранилищеЗначения (хранилище значений 1С) – это объект в языке 1С, который позволяет хранить в базе данных прочие значения, например картинки и файлы, структуры и таблицы значений.
Сначала мы создаем значение, например:
Знч = Новый ТаблицаЗначений();
Потом помещаем его в хранилище значений 1С:
Хранилище = Новый ХранилищеЗначения(Знч, Новый СжатиеДанных
);
Сжатие данных в хранилище значений 1С с параметром «9» означает, что данные будут храниться в архивированном виде, с максимальной степенью сжатия.
Чтобы сохранить такое значение в базу данных, нужно создать объект конфигурации (справочник, документ и т.п.), у которого добавить реквизит с типом ХранилищеЗначения.
СправочникСсылка = Справочники. Хранилище. СоздатьЭлемент();
СправочникСсылка. ХранилищеЗначения = Хранилище;
СправочникСсылка. Записать();
Кроме хранения таких значений в базе данных, с помощью хранилища значений 1С, мы также можем сохранить такое значение в файл, например:
Настройки = Новый Структура();
Настройки. Вставить(«ПоУмолчанию», Истина);
Настройки. Вставить(«Наименование», «Наименование1»);
Хранилище = Новый ХранилищеЗначения(Настройки, Новый СжатиеДанных
);
ЗначениеВФайл(«C:», Хранилище);
Пример – сохранение значения из файла
//Значение — картинка из файла
Файл = Новый Картинка(«C:ФайлКартинки.jpg»);
Хранилище = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных
);
//Значение — произвольный файл
Файл = Новый ДвоичныеДанные(«C:ИсполняемыйФайл.exe»);
Хранилище = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных
);
//Значение — текстовый файл
Файл = Новый ЧтениеТекста(«C:ТекстовыйФайл.txt»);
ТекстовыеДанные = Файл. Прочитать();
Хранилище = Новый ХранилищеЗначения(ТекстовыеДанные, Новый СжатиеДанных
);
Значение, помещенное в хранилище значений 1С нельзя использовать, пока оно там находится. Чтобы работать с ним, его нужно «распаковать» обратно, например:
Знч = Хранилище. Получить();
Если Знч = Неопределено Тогда
Сообщить(«Ошибка получения значения из хранилища»);
КонецЕсли;
Проголосовать за этот пост:
Сохранение в Хранилище Значений в 1С 8.3:
// *** 1. Пример (Таблица значений): // Создание значения «ТЗ»
// Вставка в хранилище значений // «9» — макс.степень сжатия
// Сохранение значения в реквизит объекта конфигурации (тип: ХранилищеЗначения) // Изменим и запишем численность жителей в стране
// *** 2. Пример (Табличный документ):
// *** 3. Пример (Структура): // Создание значения «Структура» «Европейская страна, расположенная на Пиренейском полуострове» // Вставка в хранилище значений // «9» — макс.степень сжатия // Сохранение значения в файл
// *** 4. Пример (Любой файл) : // «0» — без сжатия
// *** 5. Пример (Файл картинка) : // «5» — средн.степень сжатия
// *** 6. Пример (Текстовый файл) : // «1» — мин.степень сжатия
// *** 7. Пример (Отчет/обработка 1С) :
Восстановление из Хранилище Значений в 1С 8.3:
// Восстановление Табличного документа
// Восстановление и запуск Отчета/обработки 1С ; КонецЕсли;
Очистка реквизита Хранилище Значений в 1С 8.3:
Проверка значения Хранилище Значений в 1С 8.3:
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом «Хранилище значений» 1С:
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Хранилище значений — это тип, который появился в 8-ой версии 1С позволяющий сохранять прямо в базе различные данные, включая двоичные данные (произвольные файлы). Например, так можно хранить в базе данных JPG-картинки, Word-документы и т.д. Причем данные будут храниться в самой базе (файле 1CD или в таблицах на SQL-сервере) и будут включены в штатную выгрузку базы или резервную копию средствами SQL Server.
Тип Хранилище значения может быть назначен реквизиту справочника, документа, ресурсу регистра сведений и т.д.
Код 1C v 8.х
//Изображение, картинки (фотки):
ТекИзображение. Объект = СпрТкани. Ссылка;
ТекИзображение. ВидДанных = Перечисления. ВидыДополнительнойИнформацииОбъектов. Изображение;
Хранилище = Новый ХранилищеЗначения(НоваяКартинка, Новый СжатиеДанных());
ТекИзображение. Хранилище = Хранилище. Получить();
ЭлементыФормы. ПолеКартинки1. Картинка = Хранилище. Получить();
ТекИзображение. Записать();
//Произвольные файлы (двоичные данные):
ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл));
Восьмерка поддерживает сжатие данных, помещаемых в хранилище:
ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл),Новый СжатиеДанных
);
//Внешние обработки и отчеты:
Процедура ЗагрузитьОбработкуВХранилище(РеквизитТипХранилище)
СтепеньСжатия = Новый СжатиеДанных
; //9 максимум
РеквизитТипХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(«c:отчетыотчет.epf», СтепеньСжатия));
КонецПроцедуры
Процедура ЗапуститьОбработкуИзХранилища(РеквизитТипХранилище)
ИмяВременногоФайла = КаталогВременныхФайлов()+»отчет.epf»;
ДвоичныеДанные = РеквизитТипХранилище. Получить();
ДвоичныеДанные. Записать(ИмяВременногоФайла);
ВнешняяОбработка = ВнешниеОбработки. Создать(ИмяВременногоФайла);
ВнешняяОбработка. ПолучитьФорму(). Открыть();
КонецПроцедуры
Если это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().
Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:
Чтобы очистить поле типа Хранилище значения, нужно присвоить ему Неопределено:
РеквизитХранилище = Неопределено;
Если в Хранилище значений содержались какие-то ссылки, то они не будут контролироваться при контроле ссылочной целостности (операция Удаление помеченных объектов или метод НайтиПоСсылкам).
К сожалению, 1С не содержит встроенных методов для проверки того, заполнено хранилище или нет.
Такой вариант не работает:
Работает только такой вариант:
Но он требует затрат времени на извлечение данных из хранилища.
Поэтому, если это критично, нужно заводить еще один флаг, который указывает, содержит ли хранилище значение.
- Хранилище значений 1с
- Хранилище Значения 1с
- Сохранение и восстановление данных Табличного документа в Хранилище значений.
- В хранилище значения можно сохранить почти любую информацию, например,
- Работа с файлами и картинками во встроенном языке 1С
- Область действия методов
- Описание методов работы с файлами
- Получение файла из временного хранилища
- Удаление файла из временного хранилища
- Проверка адреса на принадлежность временному хранилищу
- Получение адреса реквизита
- Получение файла из информационной базы
- Пример использования файловых методов
- Поддержка адресов в поле картинки
- Ограничения при работе с Веб-клиентом
Хранилище значений 1с
Хранилище Значений 1с используется для хранения значений различных типов в сериализованном виде. Этот вид позволяет записывать данные и потом восстанавливать их. В документации по встроенному языку в описании объектов возможность сериализации указывается отметкой “Сериализуется”.
Хранение происходит в самой базе данных или файле 1Cv8.1CD в случае файловой базы данных или в таблицах на SQL-сервере в случае серверной . Соответственно при выгрузки конфигурации, данные используемые хранилищем значений будут включены в архив базы (резервную копию).
С помощью этого объекта можно хранить такие данные как:
Важно понимать, что хранение данных в таком виде будет существенно замедлять работу базы данных.
Хранилище Значения 1с
Сам тип Хранилище Значения имеет только один Метод и один конструктор.
Информация о методах и конструкторах из Синтаксис-Помошника.
Хранилище значения в Синтаксис-Помощнике
Большинство объектов, которые имеют неизменяемое значение, а также универсальные коллекции, могут быть помещены в ХранилищеЗначения. К значению, хранящемуся в объекте, нельзя обращаться, его можно только извлечь из хранилища.
Хранилище значений 1с может применяется для хранения таблицы значений.
Создадим Регистр сведений

Регистр Сведений будет иметь следующие измерения и ресурсы.

Измерения и Ресурсы Регистра Сведений
Создадим Справочник Дни. Реквизиты Справочника:

Справочник с Реквизитом Типа Хранилище Значений.
На форме Элемента Справочника Дни разместим Кнопку. Код кнопки будет выполняться на Сервере и помещать Таблицу значений в Реквизит КурсДня.
Условно код можно разделить на три блока.
Во-первых блок извлекающий информацию из Регистра Сведений
Во-вторых блок записи результата запроса в таблицу значений.
В третьих блок записи информации из Хранилища Значения в Справочник Дни
День=справочники. Дни. СоздатьЭлемент();
Хранилище=новый ХранилищеЗначения(ТЗ,новый СжатиеДанных
);
день. Дата=Дата(ТекущаяДата());
День. КурсДня=Хранилище;
День. Записать();
Для проверки правильности извлечения информации из Регистра Сведений можно использовать проверку, которую впоследствии закоментируем.
//проверка запроса
//РЗ=запрос. Выполнить(). Выбрать();
//пока РЗ. Следующий() цикл
//Сообщить(«курс»+РЗ. Валюта+» «+РЗ. Курс);
//конеццикла;
Полный код представлен ниже:

Для извлечения информации из Хранилища значений 1с создадим обработку.

В качестве Реквизита сделаем ссылку на наш Справочник Дни.
На форму обработки добавим Кнопку. Код процедуры кнопки следующий:

Код процедуры извлечения информации из Хранилища значений
Ссылка на обработку(Ссылка). Код внешней обработки:
&НаСервере
Процедура Команда1НаСервере()
Тз=новый ТаблицаЗначений;
Хранилище=новый ХранилищеЗначения(ТЗ,новый СжатиеДанных
);
Хранилище=объект. Объект. КурсДня. Получить();
для каждого строка из Хранилище цикл
сообщить(Строка. Курс);
сообщить(Строка. Валюта);
конеццикла;
КонецПроцедуры
&НаКлиенте
Процедура Команда1(Команда)
Команда1НаСервере();
КонецПроцедуры
Сохранение и восстановление данных Табличного документа в Хранилище значений.
Объект Табличный документ используется при проектировании Печатных форм. Передача данных выполняется с использованием Хранилища значений.
В хранилище значения можно сохранить почти любую информацию, например,
Когда у Документа в табличной части есть реквизит типа ХранилищеЗначений, то тормозит открытие формы документа, если в этом реквизите записаны данные большого размера.
Возможно, при открытии формы, на клиент передается не ссылка на данные находящиеся в ХранилищеЗначений, а сами данные.
Ещё лучше использовать временное хранилище для передачи файлов между клиентом и сервером.
Работа с файлами и картинками во встроенном языке 1С
В управляемом приложении реализован новый механизм работы с файлами. Он обеспечивает обмен файлами между информационной базой и клиентским приложением. Особенностью данного механизма является то, что он ориентирован на использование в тонком клиенте и Веб-клиенте и разработан с учетом ограничений на работу с файлами, накладываемыми веб-браузерами.
Механизм представляет собой набор методов, с помощью которых можно поместить данные, хранящиеся локально у пользователя, во временное хранилище информационной базы, перенести эту информацию из временного хранилища в базу данных и получить ее обратно на компьютер пользователя. Наиболее распространенные прикладные задачи, решаемые этим механизмом, – это хранение сопроводительной информации, например, изображений товаров, связанных с договорами документов и т. п.
Область действия методов
Временное хранилище — это специализированная область информационной базы, в которую могут быть помещены двоичные данные. Основное назначение – это временное хранение информации при клиент-серверном взаимодействии до ее переноса в базу данных.
Необходимость во временном хранилище возникает из-за того, то в модели работы веб-браузера требуется передать выбранный пользователем файл непосредственно на сервер без возможности его хранения на клиенте. При передаче файла он помещается во временное хранилище и уже потом может быть использован при записи объекта в базу данных.
Наиболее типичная решаемая временным хранилищем прикладная задача – обеспечение доступа к файлам или картинкам до того, как объект будет записан в информационную базу, например, в форме элемента.
Файл или двоичные данные, помещенные в хранилище, идентифицируются уникальным адресом, который в дальнейшем можно использовать в операциях записи, чтения или удаления. Этот адрес выдают методы записи файла во временное хранилище. Отдельный метод во встроенном языке позволяет определить, является ли переданный адрес адресом, указывающим на данные во временном хранилище.
Механизм позволяет получить доступ к двоичным данным, хранящимся в реквизитах типа ХранилищеЗначений.
Как и в случае временного хранилища, доступ к информации возможен через специальный адрес. Получить его можно через специальный метод, передав ссылку на объект или ключ записи регистра сведений, и имя реквизита. В случае табличной части дополнительно требуется передать и индекс строки табличной части.
Методы работы с файлами имеют ограничение при работе с реквизитами информационной базы. Для них, в отличие от временного хранилища, доступно только чтение информации, но не ее запись или удаление.
Описание методов работы с файлами
Наиболее типичный сценарий использования данного механизма предусматривает первоначальное размещение данных пользователя во временное хранилище. Для этого предназначены два метода: ПоместитьФайл() и ПоместитьФайлВоВременноеХранилище().
Первый метод, ПоместитьФайл(), помещает файл из локальной файловой системы во временное хранилище. Метод может принимать целевой адрес в хранилище. Если же он не определен или является пустой строкой, то будет создан новый файл и метод вернет его адрес через соответствующий параметр.
Если параметр, определяющий интерактивный режим работы, равен Истина, то метод отобразит стандартное диалоговое окно выбора файла, в котором можно выбрать файл для помещения в хранилище. В этом случае метод также вернет адрес выбранного файла.
Как результат метод возвращает Ложь, если пользователь в интерактивном режиме отказался от совершения операции в диалоге выбора файла. Метод доступен только на клиенте.
Второй метод, ПоместитьФайлВоВременноеХранилище(), схож с предыдущим, за исключением того, что он доступен на сервере, а данные для записи во временное хранилище представляются не в виде пути в файловой системе, а в виде переменной типа ДвоичныеДанные. Точно так же, если не указан целевой адрес, создается новый файл в хранилище. Его адрес возвращается как результат функции.
Получение файла из временного хранилища
При записи объекта в информационную базу может понадобиться извлечь данные из временного хранилища и поместить их, например, в реквизит. Для этого есть соответствующий серверный метод — ПолучитьФайлИзВременногоХранилища(). Этот метод извлекает данные из временного хранилища и возвращает их как результат. Для этого необходимо указать адрес во временном хранилище. Этот адрес возвращают вышеописанные методы ПоместитьФайл() и ПоместитьФайлВоВременноеХранилище() в случае их успешного выполнения.
Удаление файла из временного хранилища
После того, как данные сохранены в реквизите, файл во временном хранилище можно удалить. Для этого есть метод УдалитьФайлИзВременногоХранилища(), который удаляет файл из временного хранилища. Метод принимает в параметре адрес файла во временном хранилище. Доступен на сервере.
Проверка адреса на принадлежность временному хранилищу
Адрес файла может указывать как на временное хранилище, так и на реквизит в информационной базе. Для проверки его типа существует метод ЭтоАдресВременногоХранилища().
Он проверяет, что переданный адрес является адресом, указывающим на хранилище. Возвращает Истина, если адрес указывает на временное хранилище. Метод доступен на сервере.
Получение адреса реквизита
После того, как данные помещены в реквизит в информационной базе, может потребоваться получить доступ к ним с помощью файловых методов.
Но прежде чем получить данные, например из реквизита, необходимо получить адрес этого реквизита. Для этого существует метод ПолучитьАдресФайлаВИнформационнойБазе().
Его назначение – вернуть адрес файла в информационной базе по исходным параметрам. Для этого необходимо передать ключ объекта (это может быть как ссылка на объект, так и ключ записи регистра сведений) и имя реквизита. Если нужно получить адрес файла, хранимого в реквизите табличной части, до имени реквизита в параметре, задающем имя реквизита, необходимо добавить имя табличной части и точку «.». Метод доступен как на клиенте, так и на сервере.
Получение файла из информационной базы
Метод ПолучитьФайл() получает файл из информационной базы и сохраняет его в локальную файловую систему пользователя. Первый параметр определяет адрес файла в реквизите или во временном хранилище файлов. Второй параметр определяет целевое расположение полученного файла. В не интерактивном режиме необходимо указать путь. В интерактивном режиме параметр является опциональным.
По умолчанию метод исполняется в интерактивном режиме, то есть последний параметр равен Истина. Это значит, что выдается диалоговое окно, в котором можно указать действие с полученным файлом: запустить его или сохранить по указанному пользователем расположению. Если активен интерактивный режим, а параметр Целевой путь к файлу на диске не указан, то операция открытия файла не доступна. Возвращает булевское значение. Ложь означает, что пользователь выбрал отмену операции в диалоговом окне сохранения файлов в интерактивном режиме.
Пример использования файловых методов
// Получение в интерактивном режиме файла с диска
// и помещение его во временное хранилище
&НаКлиенте
Процедура ВыбратьФайлСДискаИЗаписать()
Перем ВыбранноеИмя;
Перем АдресВременногоХранилища;
Если ПоместитьФайл(АдресВременногоХранилища, ВыбранноеИмя, Истина) Тогда
Объект. ИмяФайла = ВыбранноеИмя;
ПоместитьФайлОбъекта(АдресВременногоХранилища);
КонецЕсли;
КонецПроцедуры
// Копирование файла из временного хранилища в реквизит
// справочника, запись объекта,удаление файла из временного
// хранилища
&НаСервере
Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)
ЭлементСправочника = РеквизитФормыВЗначение(«Объект»);
ДвоичныеДанные = ПолучитьФайлИзВременногоХранилища(АдресВременногоХранилища);
ЭлементСправочника. ДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные);
ФайлПутьНаДиске = Новый Файл(ЭлементСправочника. ИмяФайла);
ЭлементСправочника. ИмяФайла = ФайлПутьНаДиске. Имя;
ЭлементСправочника. Записать();
Модифицированность = Ложь;
УдалитьФайлИзВременногоХранилища(АдресВременногоХранилища);
ЗначениеВРеквизитФормы(ЭлементСправочника, «Объект»);
КонецПроцедуры
// Считывание файла из реквизита и сохранение его
// на локальном диске в интерактивном режиме
&НаКлиенте
Процедура ПрочитатьФайлИСохранитьНаДиск()
Адрес =
ПолучитьАдресФайлаВИнформационнойБазе(Объект. Ссылка,
«ДанныеФайла»);
ПолучитьФайл(Адрес, Объект. ИмяФайла, Истина);
КонецПроцедуры
Поддержка адресов в поле картинки
Элемент управления Поле картинки поддерживает отображение картинки, заданной адресом файла во временном хранилище или в базе данных.
Для этого в свойстве Данные элемента формы необходимо задать реквизит строкового типа. Значение этого реквизита и будет интерпретироваться как адрес картинки.
// Привязка поля картинки к адресу картинки во временном
// хранилище. АдресКартинки реквизит формы строкового типа
ПоместитьФайл(АдресКартинки, ,Истина)
Картинка. Данные = АдресКартинки
Ограничения при работе с Веб-клиентом
Работа описываемого механизма при использовании Веб-клиента имеет некоторые ограничения. Эти ограничения связаны с особенностями модели безопасности браузера. Так, например, клиент самостоятельно не может сохранить файл в локальную файловую систему, то есть доступен только интерактивный вариант клиентских методов ПоместитьФайл() и ПолучитьФайл(). При попытке использовать не интерактивный режим генерируется исключение. Диалоговые окна, отображаемые в интерактивном режиме, специфичны для конкретного типа браузера.





