рубрики: Платформа 8.3 | Дата: 13 июля, 2018
Платформа 1С:Предприятия предоставляет массу возможностей для хранения данных всевозможных типов.
Но зачастую этих возможностей не хватает. И тогда нам на помощь приходит специальный объект — ХранилищеЗначения. Этот объект позволяет хранить в специальном формате как стандартные объекты 1С:Предприятия, например, таблица значений, так и нестандартные, для которых тип в платформе не предусмотрен. К нестандартным типам могут быть отнесены файлы. Так, например, с помощью хранилища значений в базе данных 1С можно хранить фотографии сотрудников, сканы документов, внешние обработки и т.д. Преимуществом здесь является то, что все эти объекты храняться в самой базе. Соответственно при развертывании новой базы из резервной копии все эти объекты также будут присутствовать в новой базе. С другой стороны если хранить в базе файлы большого размера это может значительно увеличить ее объем и отрицательно сказаться на работоспособности. Поэтому здесь необходимо соблюдать разумный баланс.
Рассмотрим работу с хранилищем значений на примере. Создадим в конфигураторе специальный справочник — назовем его ВнешниеОбъекты, а у справочника в свою очередь создадим реквизит Объект с типом ХранилищеЗначения
И теперь мы можем создавать в этом справочнике элементы, а в реквизит Объект каждого элемента записывать файл.
Работа с хранилищем значений очень проста. Если мы заглянем в синтакс-помощник, то увидим, что у этого объекта всего лишь один метод и один конструктор.
А теперь для демонстрации напишем простейший код, который будет записывать файл в реквизит Объект ранее созданного элемента справочника, а затем читать этот файл из реквизита и записывать его на диск, но уже под другим именем.
&НаСервере
Процедура ЗагрузитьВыгрузитьФайл(ЭлементСправочника)
ОбъектСправочника = ЭлементСправочника.ПолучитьОбъект();
//Помещаем картинку в хранилище значений
ЯрлыкЗагрузка = Новый Картинка("g:\musor\favicon.ico");
ХранилищеЗагрузка = Новый ХранилищеЗначения(ЯрлыкЗагрузка);
//Записываем элемент справочника
ОбъектСправочника.Объект = ХранилищеЗагрузка;
ОбъектСправочника.Записать();
//Выгружаем картинку из хранилища значений в файл
ИмяФайла = "g:\musor\favicon_1.ico";
ЯрлыкВыгрузка = ОбъектСправочника.Объект.Получить();
ЯрлыкВыгрузка.Записать(ИмяФайла);
КонецПроцедуры
И несколько пояснений к коду.
Нельзя просто прочитать объект из хранилища просто обратившись к реквизиту справочника как мы всегда привыкли это делать с другими типами данных. Вместо этого нужно использовать метод Получить() хранилища значений.
Чтобы сохранять в хранилище другие типы файлов, отличные от картинок, можно использовать объект ДвоичныеДанные. Чисто теоретически в хранилище значений можно даже хранить элементы справочников, документы и т.д. Но на практике это не имеет никакого смысла. А вот использовать хранилище значений для хранения таблицы значений, дерева значений и других универсальных коллекций иногда можно.
Добрый день.
А куда нужно поместить этот код? В модуль справочника «ВнешниеОбъекты»?
Как запустить выполнение этого кода?
Добрый день!
Да в общем то код может располагаться где угодно. Я для проверки работы кода просто сделал внешнюю обработку в которой есть поле со ссылкой на элемент справочника. И в модуле формы соответственно описанная в статье процедура, которая вызывается при нажатии на кнопку. Единственное, что нужно учитывать, что метод ПолучитьОбъект() недоступен в тонком клиенте, поэтому из управляемой формы управление передается на сервер. Ну и файл соответственно надо будет искать на машине где установлен сервер 1С:Предприятия, если используется клиент-серверный вариант базы.
Реквизиты справочника называть «Объект» — это как минимум моветон.