Хранилище значений 1с как с ним работать

Хранилище значений 1с как с ним работать

Ситуация

У нас есть справочник "Товры", в реквизите "Данные" которого сохраняется информация в виде двоичных данных. Сам реквизит имеет тип значения "ХранилищеЗначения". На следующем скриншоте представлена стркутура метаданных справочника.

Для прикрепления произвольного файла с диска в форме элемента реализована команда "ПрикрепитьФайл". Ее программный код представлен на следующем листинге:

Если описать алгоритм в общих чертах, то сначала на клиенте выбирается файл с диска. Полученные двоичные данные файла отправляются на сервер, где записываются в информационную базу, а именно в реквизит "Данные" текущего элемента справочника.

В принципе все работает. При открытии элемента мы можем считывать эти данные по необходимости. Если, например, в реквизите сохранено изображение, то мы можетм получить его и вывести в поле формы. Такое решение имеет место быть, но в большинстве задач использовать реквизит с типом значения "ХранилищеЗначения" в справочниках и документах не оптимально. И вот почему.

Влияние на производительность

Проведем несколько тестов на производительность. В тестах будут использоваться два элемента справочника "Товары" с прикрепленным файлом и без. Размер прикрепленного файла составляет 5 мегабайт.

Все тесты проводятся с помощью обработки "ПолучениеЭлемента" в тестовой конфигурации. Скачать данную конфигурацию Вы можете по ссылке в конце статьи.

Замерим время открытие элементов справочника "Товары". Для открытия элемента используется метод глобального контекста "ОткрытьЗначение()", в качестве параметра которому передается ссылка на элемент. Выполним замер времени открытия с помощью стандартного интруемента замера производительности. Результаты представлены на следующем скриншоте:

Как мы видим, время открытия элемента с прикрепленным файлом больше в 10 раз! Сделаем другой тест. Выполним метод "ПолучитьОбъект()" для ссылки на элемент справочника товары. Результат теста Вы можете видеть на следующем скриншоте.

Разница весьма существенная. Получение элемента без прикрепленного файла отрабатывает быстре в 194 раза!

Происходит это потому, что метод "ПолучитьОбъект()" получает все данные из реквизитов элемента справочника по ссылке. Соответственно, метод получает значения не только реквизитов "Код" и "Наименование", но и значение реквизита "Данные". Если в нем хранятся двоичные данные размером 5 мегабайт (как в нашем примере), то при получении объекта эти данные помещаются в оперативную память (как и остальные реквизиты) и затем передаются на клиентскую сторону. Именно получение данных из этого реквизита увеличивает время получения объекта элемента. Если же используется тонкий канал связи, то время открытия увеличится еще более значительно из-за передачи большого объема информации по сети.

Примечание: при выполнении метода "ОткрытьЗначение()" также сначала получается объект элемента справочника, а затем трансформируется в объект формы и передается на клиент (для управляемых форм). То есть, при открытии элемента по ссылке получение объекта также выполняется.

Проведем последний тест на время открытия и записи элемента справочника с прикрепленным файлом и без него. Результат представлен на следующем скриншоте.

Закономерный результат. Время получения и, затем, записи для элемента справочника с прикрепленным файлом оказалось в

19 раз больше. Как было сказано выше, при получении объекта получаются значения всех его реквизитов, в том числе и реквизита "Данные" в котором сохранены 5 мегабайт информации. При записи элемента этот объем данных вновь записывается в информационную базу. Следовательно, хранение данных в реквизите справочника (или документа) с типом "ХранилищеЗначения" отрицательно влияет на производительность как при получении объекта, так и при помещении его в информационную базу.

Какой же способ решения задачи по хранению данных для объектов информационной базы наиболее правильный?

Правильное решение

Если мы посмотрим на реализацию данного механизма в типовых конфигурациях, то увидим, что для объектов дополнительная информация хранится в отдельной таблице регистра сведений. Вот так, например, выглядит механизм присоединенных файлов в типовой конфигурациии "Управление торговлей" версии 11.

Справочник "Номенклатура" является владельцем для справочника "НоменклатураПрисоединенныеФайлы". Тот в свою очередь связан с регистрам сведений "ПрисоединенныеФайлы", измерение которого "ПрисоединенныйФайл" ссылается на его элемент. Таким образом, данные, прикрепляемые к объектам информационной базы, фактически хранится в таблице регистра сведений, на работу которого объекм хранимых данных в ресурсе практически не влияет. Промежуточный справочник "НоменклатураПрисоединенныеФайлы" необходим для хранения дополнительной информации для присоединенного файла, а тажке для поддержки обращения к присоединенному файлу по ссылке.

Все выше сказанное еще раз подтверждает огромное влияние на производительность правильно разработанной структуры метаданных конфигурации.

Тестовая конфигурация с примером из статьи: LINK .

Примеры по программированию в 1с 7.7, 8.1, 8.2

пятница, 21 февраля 2014 г.

Хранилище значений и управляемая форма

&НаКлиенте
Процедура ПутьКОбработкеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Укажите файл";
Диалог.Фильтр = "*.epf|*.epf|*.erf|*.erf|Все файлы|*.*";

Если Не Диалог.Выбрать() Тогда
Возврат;
КонецЕсли;

ВремФайл = Новый Файл(Диалог.ПолноеИмяФайла);

ПутьКОбработке = ВремФайл.ПолноеИмя;

АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьКОбработке));//АдресВоВременномХранилище — Реквизит формы

КонецПроцедуры

Передаем на сервер адрес временного хранилища файла, а на сервере, записываем в ТЧ объекта "Версии" в реквизит Файл (Хранилище значений).
Обязательно сделать так: Об.Записать(); //- без этого данные из реквизита файл теряются

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

Проконсультироваться
со специалистом 1С

Хранилище значений — это тип, который появился в 8-ой версии 1С позволяющий сохранять прямо в базе различные данные, включая двоичные данные (произвольные файлы). Например, так можно хранить в базе данных JPG-картинки, Word-документы и т.д. Причем данные будут храниться в самой базе (файле 1CD или в таблицах на SQL-сервере) и будут включены в штатную выгрузку базы или резервную копию средствами SQL Server.

Тип Хранилище значения может быть назначен реквизиту справочника, документа, ресурсу регистра сведений и т.д.

Восьмерка поддерживает сжатие данных, помещаемых в хранилище:

Если это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().

Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:

Чтобы очистить поле типа Хранилище значения, нужно присвоить ему Неопределено:
Код 1C v 8.х

Если в Хранилище значений содержались какие-то ссылки, то они не будут контролироваться при контроле ссылочной целостности (операция Удаление помеченных объектов или метод НайтиПоСсылкам).

К сожалению, 1С не содержит встроенных методов для проверки того, заполнено хранилище или нет.
Такой вариант не работает:
Код 1C v 8.х

Работает только такой вариант:
Код 1C v 8.х

Но он требует затрат времени на извлечение данных из хранилища.
Поэтому, если это критично, нужно заводить еще один флаг, который указывает, содержит ли хранилище значение.

Ссылка на основную публикацию
Хороший набор инструментов для автомобиля отзывы
Счастливым обладателям автомобилей необходимо иметь при себе инструменты, помогающие в чрезвычайной ситуации с машиной. Ежегодно выпускается большое количество разнообразных инструментов,...
Фейковая карта visa с деньгами
Getting a valid Visa credit card number Visa credit card number (Bulk Generate Visa Cards) To check if your credit...
Фейсбук страница владимира панаева
с 16 по 26 Декабря Поволжское отделение Российской академии художеств Лаврушинский пер., д. 15Москва 15 декабря в 18.00 в Координационном...
Хонор похожий на айфон
Apple активно продвигает iPhone XS, но есть ли достойная альтернатива дорогому и в чём-то «сырому» устройству? Honor наносит ответный удар...