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.Пример (Таблица значений):
ЗначенияТЗ = Новый ТаблицаЗначений(); // Создание значения "ТЗ"
// Вставка в хранилище значений
Хранилище_Зн = Новый ХранилищеЗначения(ЗначенияТЗ, Новый СжатиеДанных(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...)
ЗапуститьПриложение(ИмяФайла);
КонецПроцедуры
Процедура ВосстановлениеИзХранилищеЗначений();
ИмяФайла = "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С:
📰 Актуальные новости с тегом #Хранилище значений:
- В версии 8.3.28 добавлена возможность миграции данных из хранилища двоичных данных в базу данных и обратно.
- В версии 8.3.27 добавлена возможность управлять хранилищем двоичных данных через административный интерфейс и через командную строку автономного сервера 1С Предприятия. Доступными функции: получение информации по настроенным хранилищам в ИБ, создание и восстановление резервной копии, очистка.
2
комментарии
Administrator
14 июн 2022
Vika Ershova, Вы правы. Была синтакс.описка - надо через объект. Код поправил. Спасибо
Vika Ershova
14 июн 2022
// Сохранение значения в реквизит объекта конфигурации (тип: ХранилищеЗначения)
СправочникСтранаСсылка = Справочники.Страны.НайтиПоНаименованию("Испания");
СправочникСтранаСсылка.ХранилищеЗначения = Хранилище_Зн; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
СправочникСтранаСсылка.Записать();
У вас в коде ошибка. "Поле ХранилищеЗначения недоступно для записи". Потому что вы обращаетесь к СправочникССылка. А надо обращаться к СправочникОБЪЕКТ. Надо получать объект!
СправочникСтранаСсылка = Справочники.Страны.НайтиПоНаименованию("Испания");
СправочникСтранаСсылка.ХранилищеЗначения = Хранилище_Зн; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
СправочникСтранаСсылка.Записать();
У вас в коде ошибка. "Поле ХранилищеЗначения недоступно для записи". Потому что вы обращаетесь к СправочникССылка. А надо обращаться к СправочникОБЪЕКТ. Надо получать объект!
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник