Хранение типа в реквизите 1с

Обновлено: 01.07.2024

Хранение данных в полях типа ХранилищеЗначения

В 1С:Предприятии 8 существует возможность хранения различных данных в полях типа ХранилищеЗначения . В этих полях могут храниться значения типа ХранилищеЗначения . Сам тип ХранилищеЗначения предназначен, прежде всего, для хранения значений различных типов в сериализованном виде, то есть в том виде, который позволяет записывать данные и потом восстанавливать их. В документации по встроенному языку в описании объектов возможность сериализации указывается отметкой "Сериализуется". Эти значения, а также значения примитивных типов, могут помещаться в хранилище значения и таким образом могут записываться в поля базы данных с типом ХранилищеЗначения . Важной особенностью хранилища значений является возможность хранения данных в сжатом виде. Это позволяет существенно сократить объем хранимой информации для больших объектов.

Таким образом, с помощью полей типа ХранилищеЗначения существует возможность хранения в базе данных существенно более широкого перечня типов данных, по сравнению с тем, который может быть в явном виде указан для полей. Однако следует учитывать, что такой способ хранения и возможности манипулирования такими данными существенно отличаются от обычного хранения данных в полях базы данных. Для таких полей система не поддерживает практически никакой функциональности, кроме собственно записи и чтения. Для таких полей не может использоваться индексирование, по ним нельзя упорядочивать данные в запросах и выборках, такие поля не могут суммироваться и т.д. Можно считать, что в этом случае механизм базы данных хранит некоторую информацию, ничего не зная о ее природе.

Соответственно поля типа ХранилищеЗначения следует использовать только в тех случаях, когда это соответствует их назначению и технологическим особенностям.

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

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

Хотя в системе не существует явного ограничения на размер данных, хранящихся в полях типа ХранилищеЗначения , следует все-таки осмотрительно относиться к объемам хранимой информации. Следует учитывать, что помещение больших объемов в такие поля увеличивает общий объем информационной базы, и это будет негативно сказываться на работе системы при выполнении различных административных операций, таких как создание резервной копии базы данных. Например, при хранении образов файлов, можно рекомендовать хранить в таких полях данные, действительно необходимые в работе, но не использовать их для хранения больших объемов файлов, не используемых в решаемой прикладной задаче.

Объект "ХранилищеЗначения" известен в 1С, начиная с 8.0 и, казалось бы, прост, понятен, изучен вдоль и поперёк. Но иногда возникают вопросы, касающиеся работы с хранилищем, и данная публикация (по сути, краткий антисклерозник) призвана зафиксировать ответы на некоторые из них.


Хранилище значения (далее ХЗ) представляет собой данные, полученные кодированием и, при необходимости, сжатием входных данных с помощью 32-х битного алгоритма // из строки в ХЗ хз=XMLЗначение(Тип("ХранилищеЗначения"),ИсходнаяСтрокаBase64); // из ХЗ в строку ИтоговаяСтрокаBase64=XMLСтрока(ХЗ);

Важно понимать, что ХЗ это не значение, а указатель на область памяти. Они всегда разные, поэтому ни сравнение, ни поиск, ни отбор (в т.ч. в запросах) применять нельзя. Указатель равен сам себе лишь в рамках конкретного оператора-конструктора (и, кстати, в этом случае по нему работает, например, поиск в универсальных коллекциях). Так, например, если "А=хз; Б=А;", то А будет равно Б. А для сравнения именно значений следует действовать так (причём это не будет распаковкой как "расжатием"):

и это не зависит от наличия и степени сжатия в их конструкторах. Кстати, после применения конструктора определить степень сжатия можно лишь преобразованием в двоичные данные и анализом первых битов потока.

Так вот, размер "как есть" мы можем узнать, либо создав объект метаданных (например, справочник с единственным реквизитом типа ХЗ) и получив размер таблицы методом ПолучитьРазмерДанныхБазыДанных, либо опосредованно, через строку и двоичные данные (учитывая неизбежно прибавляемое), так:

Это не годится для абсолютных замеров (так, один символ латиницы, т.е. по идее 1 байт, и символ кириллицы, 2 байта, дают одинаковые 32 байта на выходе), но годится для относительных прикидок. Так, вызов без прямого указания "СжатиеДанных" всегда даёт значение большего (и иногда существенно большего, в разы) размера, чем с любым сжатием. На малых размерах сжатие не даёт заметного эффекта при любом аргументе. В СП сказано, что аргумент по умолчанию для объекта "СжатиеДанных" равен 1, но сжатие без его указания и с явным указанием даёт разные размеры, до десятков и сотен байт. На средних объектах (например, строки 500-1000 символов) сжатие со степенью выше 3-4 даёт примерно одинаковые итоговые размеры, т.е. эффективность одинаковая. Наряду с этим, в ряде старых релизов конструктор без сжатия даёт меньший итоговый размер.

Деструкция этого указателя тоже имеет нюансы.

В таблицах/деревьях значений с явно объявленной колонкой может использоваться везде, кроме запроса (не помещается в ВТ), не воспринимается как аргумент запроса, даже как &ПараметрТипаХЗ в секции "ВЫБРАТЬ". Что, учитывая известное про СУБД, не вполне логично.

При копировании объекта с реквизитами, содержащими ХЗ, ни интерфейсно, ни программно, эти значения НЕ наследуются, не копируются.

Если некое значение, упакованное в ХЗ, подпадает под RLS, то логика следующая - платформа всегда вначале выполняет неявную распаковку, либо рассматривает сделанную в коде явную; а затем накладывает ограничение, так что RLS применится именно для уже распакованного значения, спровоцировать тут ошибку ни разу не удалось.

Из интересных публикаций рекомендую эту.

Поскольку в современных метаданных конфигураций реквизит типа ХЗ где-нибудь точно наличествует, а также фигурирует в коде, то вопрос занимаемого им места актуален. В связи с этим было бы интересно исследовать рост места, занимаемого таблицей, состоящей исключительно из ХЗ, а также сравнить эффективность работы "СжатиеДанных" и основанного на том же Deflation объекта "ЗаписьZipФайла", пробуя разные значения УровеньСжатияZIP (естественно, при МетодСжатияZIP = "Сжатие").

Возможно, этот привычный и вроде бы простой объект, Хранилище значения, преподнесёт (особенно на больших данных и нагрузках) ещё некоторые удивительные сюрпризы.

У управляемой формы реквизиты заведенные как реквизиты формы, при закрытии и открытии ее заново могут сохраняться и восстанавливаться, достаточно только поставить напротив галочку сохранять и в свойствах формы выбрать "АвтоматическоеСохранениеДанныхВНастройках" - Использовать.



Подробнее в этой статье Как сохранять и восстанавливать значения реквизитов на форме? и там же пример для обычных форм.

А что же делать с реквизитами, которые выступают в роли реквизитов объектов ?

у них такой настройки нет нет - напишем:

Открыв обработку и заполним поля закрываем ее, при следующем открытии все поля заполнены из сохраненных настроек:


Разместил: all4cf  Версии: | 8.2 УП | 8.3 |  Дата: 13.01.2016   Прочитано: 55442

Распечатать

Похожие FAQ

Как заполнить табличную часть формы программно?  6
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С  42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C: Enterprise Development Tools  50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем Google maps : вывод точек на карту и режим панорамы  7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора База 1С при запуске уходит в дамп и вылетает  1
В последнее время частенько обращаются пользователи у которых после замены или ремонта компьютера 1С не запускается, а точнее при открытии уходит в dump и вылетает. Как правило, решение одно: Отключить аппаратное ускорение видеокарты В Window Посмотреть все результаты поиска похожих

Еще в этой же категории

Как обновить динамический список или реквизит на форме клиента?  19
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Как установить параметр динамического списка?  14
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента Для вывода используется исп Список НЕ модальных методов в 1С  4
Найдено в интернете но говорят что с диска ИТС. Табличная часть


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

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

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

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

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

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

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

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

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

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

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

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

Читайте также: