Реквизит для хранения типа 1с

Тип значения. Как сохранить в реквизите

Я
   YF

07.11.06 — 08:58

Хочу в реквизите табличного поля сохранить тип значения некоторого параметра.

Создал в этом поле колонку с типом значения «Описание типов»

Выбираю параметр, и пытаюсь записать в «колонку» тип параметра — не ругается, но и ничего не записывается …

   ТелепатБот

1 — 07.11.06 — 08:58

   TormozIT

2 — 07.11.06 — 09:14

Сохраняй пустую ссылку, если это ссылочный тип.

   megalodon

3 — 07.11.06 — 09:14

(2) а составной тип как сохранить?

   YF

4 — 07.11.06 — 09:15

(2) Это может быть что угодно, не только ссылка …

   megalodon

5 — 07.11.06 — 09:15

имхо план видов характеристик надо создавать, там можно тип хранить. Ну или как нить в хранилище значений или ваще в строке. но это для извращенцов.

   YF

6 — 07.11.06 — 09:17

(5) А зачем тогда реквизиту возможно задать тип «Описание типов» и что этот тип значит?

   Neutron

7 — 07.11.06 — 09:18

(0)А тип параметр ты создаешь через Новый ОписаниеТипов и как ты добавляешь значение в колонку? Поидее должно всё работать

   megalodon

8 — 07.11.06 — 09:20

(6) реквизиту такой тип задать нельзя.

   YF

9 — 07.11.06 — 09:21

(7) Ну типа так:

ЭлементыФормы.ТЧ_Приход.ОформлениеСтроки(ЭлементыФормы.ТЧ_Приход.ТекущаяСтрока).Ячейки.Тип.Значение = результатВыбора.Значение;

Где ячейка «Тип» и есть та ячейка, куда хочу загрузить ТипЗначения.

результатВыбора — элемент списка, значением которого является типЗначения некоторого объекта ….

   YF

10 — 07.11.06 — 09:22

(8) Как ето? Я выбрал его из списка (в конфигураторе)…

   megalodon

11 — 07.11.06 — 09:23

(10) реквизит чего?

   YF

12 — 07.11.06 — 09:24

(10) Это не реквизит — это колонка табличного поля (см. (0)) …

   megalodon

13 — 07.11.06 — 09:26

(12) гыгы, ну дык это же не сохраняемый в базе тип… А вот реквизиту справочника присвоить такой тип у тя не получиццо.

   Neutron

14 — 07.11.06 — 09:27

Либо я тебя непонял либо невнятно объяснил!

Делай так: Колонка с типом Описание типов (Колонка1)

Данные предположим ТаблицаЗначений1

Тогда

Новая = ТабличноеПоле1.Добавить();

Новая.Колонка1 = Новый ОписаниеТипов(«Строка»);

Всё работает

   Neco

15 — 07.11.06 — 09:28

Создай план видов характеристик с нужными тебе типами и назначь реквизиту

   YF

16 — 07.11.06 — 09:29

(14) А что Тип(«Строка») — не имеет тип «ОписаниеТипов»?

   Neutron

17 — 07.11.06 — 09:31

(16) нет он возвращает тип значения

   Neutron

18 — 07.11.06 — 09:32

в (14) строка дана для примера, тип данных указываешь тот какой нужен

   Neco

19 — 07.11.06 — 09:34

В базе ОписаниеТипов просто так не сохранишь

   YF

20 — 07.11.06 — 09:36

(19) Да мне не в базе, мне временно на форме …

   YF

21 — 07.11.06 — 09:36

(17) А тип «ОписаниеТипов» нафига нужен?

   Neutron

22 — 07.11.06 — 09:40

(21)Представляет собой объект для управления допустимыми типами значений. В основном предназначен для присвоения в качестве значений соответствующим свойствам других объектов. Набор допустимых типов и квалификаторы примитивных типов задаются при создании объекта.

  

Neutron

23 — 07.11.06 — 09:41

(19) Не факт.Практически любому реквизиту объектов можно назначить тип описание данных и сохраняй в базе скок хочешь

Хранилище значения

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

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

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

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

Важно! В системе не поддерживается ссылочная целостность по объектам, сохраненным в базе данных в полях типа ХранилищеЗначения. Это означает, что при попытке удаления, например, элементов справочников система не контролирует ссылки на эти элементы, сохраненные в ХранилищеЗначения.

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

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

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

Объект типа ХранилищеЗначения создается следующей конструкцией

 Хранилище = Новый ХранилищеЗначения(<Значение>, <АлгоритмСжатияДанных>)  

Параметры:

  • <Значение> (обязательный)Тип: Произвольный. Значение, которое должно быть помещено в хранилище.
  • <АлгоритмСжатияДанных> (необязательный)Тип: СжатиеДанных. Задает степень сжатия данных.
  • Если параметр не установлен, сжатие не используется.

Пример 1:

 МояКартинка = Новый Картинка("C:Мои документыКартинка1.bmp");
Сжатие = Новый СжатиеДанных(6);
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка, Сжатие);
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();

Пример 2: Метод получить – К значению, хранящемуся в объекте, нельзя обращаться, его можно только извлечь из хранилища.

//  Двоичные Данные текстового файла, сохраняемого в реквизите МоеХранилище документа
 Хранилище= Заявка.МоеХранилище.Получить();  
  ВременныйФайл = ПолучитьИмяВременногоФайла("txt"); 
 Хранилище.Записать(ВременныйФайл); 
 ТекстовыйДок= Новый ТекстовыйДокумент;
  ТекстовыйДок.Прочитать(ВременныйФайл, КодировкаТекста.UTF8);

Пример 3 : Использование объект ДвоичныеДанные , значение которого считывается из файла и может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл.

МояКартинка = Новый ДвоичныеДанные("C:Мои документыКартинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);
// сохранение значения типа ХранилищеЗначения в базе данных
НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
// реквизит Изображение имеет тип ХранилищеЗначения
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();

Пример 4 . Выгрузка значения типа ДвоичныеДанные из хранилища значений в файл

ИмяФайла = "C:Мои документыКартинка2.bmp";
Хранилище = НовНоменклатура.Изображение.Получить();
Хранилище.Записать(ИмяФайла);

  • Главная
  • О сайте
  • Главная
  • Содержание

Рукопашный бой Карташ

Категории

—>

рубрики: Платформа 8.3 | Дата: 13 июля, 2018

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

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

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

А теперь для демонстрации напишем простейший код, который будет записывать файл в реквизит Объект ранее созданного элемента справочника, а затем читать этот файл из реквизита и записывать его на диск, но уже под другим именем.


&НаСервере
Процедура ЗагрузитьВыгрузитьФайл(ЭлементСправочника)

	ОбъектСправочника = ЭлементСправочника.ПолучитьОбъект();

	//Помещаем картинку в хранилище значений
	ЯрлыкЗагрузка = Новый Картинка("g:musorfavicon.ico");
	ХранилищеЗагрузка = Новый ХранилищеЗначения(ЯрлыкЗагрузка);

	//Записываем элемент справочника
	ОбъектСправочника.Объект = ХранилищеЗагрузка;
	ОбъектСправочника.Записать();

	//Выгружаем картинку из хранилища значений в файл
	ИмяФайла = "g:musorfavicon_1.ico";
	ЯрлыкВыгрузка = ОбъектСправочника.Объект.Получить();
	ЯрлыкВыгрузка.Записать(ИмяФайла);

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

И несколько пояснений к коду.

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

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

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

Хранилище Значений 1с используется для хранения значений различных типов в сериализованном виде. Этот вид позволяет записывать данные и потом восстанавливать их. В документации по встроенному языку в описании объектов возможность сериализации указывается отметкой “Сериализуется”. 

Хранение происходит в самой базе данных или файле 1Cv8.1CD в случае файловой базы данных или в таблицах на SQL-сервере в случае серверной . Соответственно при выгрузки конфигурации, данные используемые хранилищем значений будут включены в архив базы (резервную копию). 

С помощью этого объекта можно хранить такие данные как:

  • файлы,
  • картинки (фотографии),
  • внешние обработки,
  • таблицы значений,
  • структуры…

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

Хранилище Значения 1с

Сам тип Хранилище Значения имеет только один Метод и один конструктор.

Информация о методах и конструкторах из Синтаксис-Помошника.

Хранилище Значения Метод Хранилища Значения
Хранилище значения в Синтаксис-Помощнике

Большинство объектов, которые имеют неизменяемое значение, а также универсальные коллекции, могут быть помещены в ХранилищеЗначения. К значению, хранящемуся в объекте, нельзя обращаться, его можно только извлечь из хранилища.

Хранилище значений 1с может применяется для хранения таблицы значений.

Создадим Регистр сведений

Хранилище значений 1с
Регистр сведений

Регистр Сведений будет иметь следующие измерения и ресурсы.

хранилище значений 1с
Измерения и Ресурсы Регистра Сведений

Создадим Справочник Дни. Реквизиты Справочника:

  • КурсДня-тип Хранилище Значений
  • Дата -тип Дата
Хранилище значений 1с
Справочник с Реквизитом Типа Хранилище Значений.

На форме Элемента Справочника Дни разместим Кнопку. Код кнопки будет выполняться на Сервере и помещать Таблицу значений в Реквизит КурсДня.

Условно код можно разделить на три блока.

Во-первых блок извлекающий информацию из Регистра Сведений

Запрос=новый Запрос;
	Запрос.Текст="ВЫБРАТЬ
	             |	КурсыВалютСрезПоследних.Валюта КАК Валюта,
	             |	КурсыВалютСрезПоследних.Курс КАК Курс
	             |ИЗ
	             |	РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалютСрезПоследних";
	Запрос.УстановитьПараметр("Период",Дата(ТекущаяДата()));

Во-вторых блок записи результата запроса в таблицу значений.


ТЗ=запрос.Выполнить().Выгрузить();

В третьих блок записи информации из Хранилища Значения в Справочник Дни

День=справочники.Дни.СоздатьЭлемент();
	Хранилище=новый ХранилищеЗначения(ТЗ,новый СжатиеДанных(9));
	день.Дата=Дата(ТекущаяДата());
	День.КурсДня=Хранилище;
	День.Записать();

Для проверки правильности извлечения информации из Регистра Сведений можно использовать проверку, которую впоследствии закоментируем.

//проверка запроса
	//РЗ=запрос.Выполнить().Выбрать();
	//пока РЗ.Следующий() цикл
	//Сообщить("курс"+РЗ.Валюта+"  "+РЗ.Курс);	
	//конеццикла;

Полный код представлен ниже:

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

Полный код

Для извлечения информации из Хранилища значений 1с создадим обработку.

Хранилище Значения
Внешняя обработка

В качестве Реквизита сделаем ссылку на наш Справочник Дни.

На форму обработки добавим Кнопку. Код процедуры кнопки следующий:

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

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

Ссылка на обработку(Ссылка). Код внешней обработки:

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

&НаКлиенте
Процедура Команда1(Команда)
	Команда1НаСервере();
КонецПроцедуры

Сохранение и восстановление данных Табличного документа в Хранилище значений.

Объект Табличный документ используется при проектировании Печатных форм. Передача данных выполняется с использованием Хранилища значений.

//Табличный документ:
Процедура СохранитьВХранилищеНажатие(Элемент)
    ТабДок=Новый ТабличныйДокумент;    
    ТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента1);
    Хранилище=Новый ХранилищеЗначения(ТабДок);
    Записать();
КонецПроцедуры

Процедура ВосстановитьИзХранилищаНажатие(Элемент)
    ТабДок=Хранилище.Получить();
    Если ТабДок<>Неопределено Тогда
        ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок);
    КонецЕсли;
КонецПроцедуры   

1С ХранилищеЗначения 8.3

Согласно справке 1с:

Тип — ХранилищеЗначения — Предназначен для хранения значения в специальном формате. Он может быть записан в поля базы данных, имеющие соответствующий тип. Это позволяет сохранять в базе данных значения, тип которых не может быть выбран в качестве типа поля, например, Картинка.

Большинство объектов, которые имеют неизменяемое значение, а также универсальные коллекции, могут быть помещены в ХранилищеЗначения. К значению, хранящемуся в объекте, нельзя обращаться, его можно только извлечь из хранилища.

Подробнее см. справку.

Также теория есть тут: its.1c.ru

Пример работы с хранилищем значения:

Получение и запись в хранилище.

РеквизитФормыЦвет — реквизит формы, типа Цвет.

РеквизитЦвет — реквизит объекта, типа ХранилищеЗначения.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекущийОбъект = РеквизитФормыВЗначение(«Объект»);
РеквизитФормыЦвет = ТекущийОбъект.РеквизитЦвет.Получить();
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТекущийОбъект.РеквизитЦвет = Новый ХранилищеЗначения(РеквизитФормыЦвет);
КонецПроцедуры

Понравилась статья? Поделить с друзьями:

Вот еще несколько интересных статей нашего сайта:

  • Монгольские компании в москве
  • Мондиал бизнес консорциум ооо
  • Монетка реквизиты организации
  • Монополия на большую компанию
  • Монопольные компании в россии

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии