1С 8.3 Хранилище значений - Программист 1С Минск. Автоматизация бизнеса.

Популярные страницы:
Перейти к контенту

1С 8.3 Хранилище значений

Данные > Примеры кода 1С > 1С 8.3 Хранилище значений
Хранилище значений в 1С 8.3 это объект, который позволяет хранить в сериализованном виде почти любые типы данных (включая двоичные). Хранение происходит в самой базе данных (файле 1Cv8.1CD или на SQL-сервере в таблицах). Соответственно при выгрузки конфигурации, данные используемые хранилищем значений будут включены в архив базы (резервную копию). С помощью этого объекта можно хранить такие данные как: файлы, картинки (фотографии), внешние обработки, таблицы значений, структуры... Важно понимать, что хранение данных в таком виде будет существенно замедлять работу базы данных. Поэтому данную технологию хранения рекомендуется использовать в крайних случаях, если отсутствует альтернатива решения для имеющейся задачи.
Сохранение в Хранилище Значений в 1С 8.3:
&НаСервере
Процедура СохранениеВХранилищеЗначений();

   // *** 1.Пример (Таблица значений):
   ЗначенияТЗ = Новый ТаблицаЗначений(); // Создание значения "ТЗ"

   // Вставка в хранилище значений
   Хранилище_Зн = Новый ХранилищеЗначения(ЗначенияТЗ, Новый СжатиеДанных(9));// "9" - макс.степень сжатия

   // Сохранение значения в реквизит объекта конфигурации (тип: ХранилищеЗначения)
   СправочникСтранаСсылка = Справочники.Страны.НайтиПоНаименованию("Испания");
   Если Не СправочникСтранаСсылка.Пустая() Тогда
       // Изменим и запишем численность жителей в стране
       СтранаИспания = СправочникСтранаСсылка.ПолучитьОбъект();
       СтранаИспания.ХранилищеЗначения = Хранилище_Зн;
       СтранаИспания.Записать();
   КонецЕсли;

   // *** 2.Пример (Табличный документ):
   ЗначенияТабДок=Новый ТабличныйДокумент;
   ЗначенияТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента1);
   Хранилище_ТабДок=Новый ХранилищеЗначения(ЗначенияТабДок);

   // *** 3.Пример (Структура):
   ЗначенияСтр = Новый Структура(); // Создание значения "Структура"
   ЗначенияСтр.Вставить("Код", "34");
   ЗначенияСтр.Вставить("Наименование", "Испания");
   ЗначенияСтр.Вставить("Описание", "Европейская страна, расположенная на Пиренейском полуострове");
   ЗначенияСтр.Вставить("Население", 46600000);
   // Вставка в хранилище значений
   Хранилище_Стр = Новый ХранилищеЗначения(ЗначенияСтр, Новый СжатиеДанных(9));// "9" - макс.степень сжатия
   ЗначениеВФайл("D:\import\", Хранилище_Стр); // Сохранение значения в файл

   // *** 4.Пример (Любой файл) :
   ФайлДвоичныеДанные = Новый ДвоичныеДанные("D:\import\КлиентБанк_РБ.exe");
   Хранилище_Файл = Новый ХранилищеЗначения(ФайлДвоичныеДанные, Новый СжатиеДанных(0));// "0" - без сжатия

   // *** 5.Пример (Файл картинка) :
   ФайлФото = Новый Картинка("D:\import\ФотоСотрудника.png");
   Хранилище_Фото = Новый ХранилищеЗначения(ФайлФото, Новый СжатиеДанных(5));// "5" - средн.степень сжатия

   // *** 6.Пример (Текстовый файл) :
   ФайлТекст = Новый ЧтениеТекста("D:\import\Война_и_мир.txt");
   ТекстИзФайла = ФайлТекст.Прочитать();
   Хранилище_Текст = Новый ХранилищеЗначения(ТекстИзФайла, Новый СжатиеДанных(1));// "1" - мин.степень сжатия

   // *** 7.Пример (Отчет/обработка 1С) :
   Хранилище_Epf = Новый ХранилищеЗначения(Новый ДвоичныеДанные("D:\import\Otchet_realizacija_2020.epf", СтепеньСжатия));

КонецПроцедуры
Восстановление из Хранилище Значений в 1С 8.3:
&НаСервере
Процедура ВосстановлениеИзХранилищеЗначений();

   
ИмяФайла = "D:\import\Война_и_мир.txt";

   
// Двоичные данные можно восстановить из хранилища значения методом Получить и записать в файл методом Записать()
   
Если ТипЗнч(РеквизитХранилище) = Тип("ДвоичныеДанные") Тогда

       
// Хранилище.Получить()<>Неопределено Тогда // Процедура извлекает данные из хранилища (требует времени)
        // Для больших объемов данных рекомендуется использовать доп.реквизит (Например: Булево) Содержит данные - Истина
       
ДанныеХранилища = РеквизитХранилище.Получить();
        Если
ДанныеХранилища = Неопределено Тогда
           
Сообщить("Ошибка получения данных из хранилища значений 1С");
        КонецЕсли;
       
ДанныеХранилища.Записать(ИмяФайла); // Записываем восстановленые данные в файл

        // Восстановление Табличного документа
       
ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ДанныеХранилища);

       
// Восстановление и запуск Отчета/обработки 1С
       
ИмяФайла_Epf = "D:\import\Otchet_realizacija_2020.epf";
       
ДвоичныеДанные = РеквизитХранилище.Получить();
       
ДвоичныеДанные.Записать(ИмяФайла_Epf);
       
Epf = ВнешниеОбработки.Создать(ИмяФайла_Epf);
       
Epf.ПолучитьФорму().Открыть();

    Иначе
       
ДанныеХранилища = РеквизитХранилище;
    КонецЕсли;

   
// Файлы зарегистрированного типа (doc, xls, pdf, jpg, txt, exe...)
   
ЗапуститьПриложение(ИмяФайла);

КонецПроцедуры
Очистка реквизита Хранилище Значений в 1С 8.3:
&НаКлиенте
Процедура ОчисткаРеквизитаХранилищеЗначений();

   
РеквизитХранилище = Неопределено;

КонецПроцедуры
Проверка значения Хранилище Значений в 1С 8.3:
&НаКлиенте
Процедура ПроверкаЗначенияХранилищеЗначений();

   
Значение = РеквизитХранилище.Получить();
    Если
Значение <> Неопределено Тогда
        Если
ТипЗнч(Значение) = Тип("Строка") Тогда
           
Сообщить("Это строка");
        ИначеЕсли
ТипЗнч(Значение) = Тип("Картинка") Тогда
           
Сообщить("Это фотография (картинка)");
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом "Хранилище значений" 1С:
Поиск кода
2
Комментарии
Administrator
14 июн 2022
Vika Ershova, Вы правы. Была синтакс.описка - надо через объект. Код поправил. Спасибо
Vika Ershova
14 июн 2022
// Сохранение значения в реквизит объекта конфигурации (тип: ХранилищеЗначения)
СправочникСтранаСсылка = Справочники.Страны.НайтиПоНаименованию("Испания");
СправочникСтранаСсылка.ХранилищеЗначения = Хранилище_Зн; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
СправочникСтранаСсылка.Записать();

У вас в коде ошибка. "Поле ХранилищеЗначения недоступно для записи". Потому что вы обращаетесь к СправочникССылка. А надо обращаться к СправочникОБЪЕКТ. Надо получать объект!
____________________
Copyright©, «Программист 1С в г.Минске», 22.09.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому