Содержание
- 1 В хранилище значения можно сохранить почти любую информацию, например,
- 1.1 … картинки (фотки):
- 1.2 …табличный документ:
- 1.3 … произвольные файлы (двоичные данные):
- 1.4 … внешние обработки и отчеты:
- 1.5 Работа с хранилищем
- 2 Работа с файлами и картинками во встроенном языке 1С:Предприятия 8
- 2.1 Назначение
- 2.2 Область действия методов
- 2.2.1 Временное хранилище
- 2.2.2 Информационная база
- 2.3 Описание методов работы с файлами
- 2.3.1 Сохранение данных во временное хранилище
- 2.3.2 Получение файла из временного хранилища
- 2.3.3 Удаление файла из временного хранилища
- 2.3.4 Проверка адреса на принадлежность временному хранилищу
- 2.3.5 Получение адреса реквизита
- 2.3.6 Получение файла из информационной базы
- 2.3.7 Пример использования файловых методов
- 2.3.8 Поддержка адресов в поле картинки
- 2.4 Ограничения при работе с Веб-клиентом
- 3 Особенности при работе с ХранилищемЗначений на Клиенте
В хранилище значения можно сохранить почти любую информацию, например,
… картинки (фотки):
ТекИзображение.Объект = СпрТкани.Ссылка; ТекИзображение.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение; Хранилище = Новый ХранилищеЗначения(НоваяКартинка, Новый СжатиеДанных()); ТекИзображение.Хранилище = Хранилище.Получить(); // в этом месте он все выводит ... ЭлементыФормы.ПолеКартинки1.Картинка = Хранилище.Получить(); ТекИзображение.Записать();
…табличный документ:
Процедура СохранитьВХранилищеНажатие(Элемент)
ТабДок=Новый ТабличныйДокумент;
ТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента1);
Хранилище=Новый ХранилищеЗначения(ТабДок);
Записать();
КонецПроцедуры
Процедура ВосстановитьИзХранилищаНажатие(Элемент)
ТабДок=Хранилище.Получить();
Если ТабДок<>Неопределено Тогда
ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок);
КонецЕсли;
КонецПроцедуры
… произвольные файлы (двоичные данные):
ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл));
Восьмерка поддерживает сжатие данных, помещаемых в хранилище:
ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл),Новый СжатиеДанных(9));
… внешние обработки и отчеты:
Процедура ЗагрузитьОбработкуВХранилище(РеквизитТипХранилище)
СтепеньСжатия = Новый СжатиеДанных(9); //9 максимум
РеквизитТипХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные("c:отчетыотчет.epf", СтепеньСжатия));
КонецПроцедуры
Процедура ЗапуститьОбработкуИзХранилища(РеквизитТипХранилище)
ИмяВременногоФайла = КаталогВременныхФайлов()+"отчет.epf";
ДвоичныеДанные = РеквизитТипХранилище.Получить();
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ВнешняяОбработка = ВнешниеОбработки.Создать(ИмяВременногоФайла);
ВнешняяОбработка.ПолучитьФорму().Открыть();
КонецПроцедуры
Работа с хранилищем
Если это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().
Если ТипЗнч(Хранилище) <> Тип("ДвоичныеДанные") Тогда
ДвоичныеДанные = Хранилище.Получить();
Иначе
ДвоичныеДанные = Хранилище;
КонецЕсли;
ДвоичныеДанные.Записать(ИмяФайла);
Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:
ЗапуститьПриложение(ИмяФайла);
Чтобы очистить поле типа Хранилище значения, нужно присвоить ему Неопределено:
РеквизитХранилище = Неопределено;
Работа с файлами и картинками во встроенном языке 1С:Предприятия 8
Назначение
В управляемом приложении реализован новый механизм работы с файлами. Он обеспечивает обмен файлами между информационной базой и клиентским приложением. Особенностью данного механизма является то, что он ориентирован на использование в тонком клиенте и Веб-клиенте и разработан с учетом ограничений на работу с файлами, накладываемыми веб-браузерами.
Механизм представляет собой набор методов, с помощью которых можно поместить данные, хранящиеся локально у пользователя, во временное хранилище информационной базы, перенести эту информацию из временного хранилища в базу данных и получить ее обратно на компьютер пользователя. Наиболее распространенные прикладные задачи, решаемые этим механизмом, – это хранение сопроводительной информации, например, изображений товаров, связанных с договорами документов и т. п.
Область действия методов
Временное хранилище
Временное хранилище — это специализированная область информационной базы, в которую могут быть помещены двоичные данные. Основное назначение – это временное хранение информации при клиент-серверном взаимодействии до ее переноса в базу данных.
Необходимость во временном хранилище возникает из-за того, то в модели работы веб-браузера требуется передать выбранный пользователем файл непосредственно на сервер без возможности его хранения на клиенте. При передаче файла он помещается во временное хранилище и уже потом может быть использован при записи объекта в базу данных.
Наиболее типичная решаемая временным хранилищем прикладная задача – обеспечение доступа к файлам или картинкам до того, как объект будет записан в информационную базу, например, в форме элемента.
Файл или двоичные данные, помещенные в хранилище, идентифицируются уникальным адресом, который в дальнейшем можно использовать в операциях записи, чтения или удаления. Этот адрес выдают методы записи файла во временное хранилище. Отдельный метод во встроенном языке позволяет определить, является ли переданный адрес адресом, указывающим на данные во временном хранилище.
Информационная база
Механизм позволяет получить доступ к двоичным данным, хранящимся в реквизитах типа ХранилищеЗначений.
Как и в случае временного хранилища, доступ к информации возможен через специальный адрес. Получить его можно через специальный метод, передав ссылку на объект или ключ записи регистра сведений, и имя реквизита. В случае табличной части дополнительно требуется передать и индекс строки табличной части.
Методы работы с файлами имеют ограничение при работе с реквизитами информационной базы. Для них, в отличие от временного хранилища, доступно только чтение информации, но не ее запись или удаление.
Описание методов работы с файлами
Сохранение данных во временное хранилище
Наиболее типичный сценарий использования данного механизма предусматривает первоначальное размещение данных пользователя во временное хранилище. Для этого предназначены два метода: ПоместитьФайл() и ПоместитьФайлВоВременноеХранилище().
Первый метод, ПоместитьФайл(), помещает файл из локальной файловой системы во временное хранилище. Метод может принимать целевой адрес в хранилище. Если же он не определен или является пустой строкой, то будет создан новый файл и метод вернет его адрес через соответствующий параметр.
Если параметр, определяющий интерактивный режим работы, равен Истина, то метод отобразит стандартное диалоговое окно выбора файла, в котором можно выбрать файл для помещения в хранилище. В этом случае метод также вернет адрес выбранного файла.
Как результат метод возвращает Ложь, если пользователь в интерактивном режиме отказался от совершения операции в диалоге выбора файла. Метод доступен только на клиенте.
Второй метод, ПоместитьФайлВоВременноеХранилище(), схож с предыдущим, за исключением того, что он доступен на сервере, а данные для записи во временное хранилище представляются не в виде пути в файловой системе, а в виде переменной типа ДвоичныеДанные. Точно так же, если не указан целевой адрес, создается новый файл в хранилище. Его адрес возвращается как результат функции.
Получение файла из временного хранилища
При записи объекта в информационную базу может понадобиться извлечь данные из временного хранилища и поместить их, например, в реквизит. Для этого есть соответствующий серверный метод — ПолучитьФайлИзВременногоХранилища(). Этот метод извлекает данные из временного хранилища и возвращает их как результат. Для этого необходимо указать адрес во временном хранилище. Этот адрес возвращают вышеописанные методы ПоместитьФайл() и ПоместитьФайлВоВременноеХранилище() в случае их успешного выполнения.
Удаление файла из временного хранилища
После того, как данные сохранены в реквизите, файл во временном хранилище можно удалить. Для этого есть метод УдалитьФайлИзВременногоХранилища(), который удаляет файл из временного хранилища. Метод принимает в параметре адрес файла во временном хранилище. Доступен на сервере.
Проверка адреса на принадлежность временному хранилищу
Адрес файла может указывать как на временное хранилище, так и на реквизит в информационной базе. Для проверки его типа существует метод ЭтоАдресВременногоХранилища().
Он проверяет, что переданный адрес является адресом, указывающим на хранилище. Возвращает Истина, если адрес указывает на временное хранилище. Метод доступен на сервере.
Получение адреса реквизита
После того, как данные помещены в реквизит в информационной базе, может потребоваться получить доступ к ним с помощью файловых методов.
Но прежде чем получить данные, например из реквизита, необходимо получить адрес этого реквизита. Для этого существует метод ПолучитьАдресФайлаВИнформационнойБазе().
Его назначение – вернуть адрес файла в информационной базе по исходным параметрам. Для этого необходимо передать ключ объекта (это может быть как ссылка на объект, так и ключ записи регистра сведений) и имя реквизита. Если нужно получить адрес файла, хранимого в реквизите табличной части, до имени реквизита в параметре, задающем имя реквизита, необходимо добавить имя табличной части и точку «.». Метод доступен как на клиенте, так и на сервере.
Получение файла из информационной базы
Метод ПолучитьФайл() получает файл из информационной базы и сохраняет его в локальную файловую систему пользователя. Первый параметр определяет адрес файла в реквизите или во временном хранилище файлов. Второй параметр определяет целевое расположение полученного файла. В не интерактивном режиме необходимо указать путь. В интерактивном режиме параметр является опциональным.
По умолчанию метод исполняется в интерактивном режиме, то есть последний параметр равен Истина. Это значит, что выдается диалоговое окно, в котором можно указать действие с полученным файлом: запустить его или сохранить по указанному пользователем расположению. Если активен интерактивный режим, а параметр Целевой путь к файлу на диске не указан, то операция открытия файла не доступна. Возвращает булевское значение. Ложь означает, что пользователь выбрал отмену операции в диалоговом окне сохранения файлов в интерактивном режиме.
Пример использования файловых методов
// Получение в интерактивном режиме файла с диска
// и помещение его во временное хранилище
&НаКлиенте
Процедура ВыбратьФайлСДискаИЗаписать()
Перем ВыбранноеИмя;
Перем АдресВременногоХранилища;
Если ПоместитьФайл(АдресВременногоХранилища, ВыбранноеИмя, Истина) Тогда
Объект.ИмяФайла = ВыбранноеИмя;
ПоместитьФайлОбъекта(АдресВременногоХранилища);
КонецЕсли;
КонецПроцедуры
// Копирование файла из временного хранилища в реквизит
// справочника, запись объекта,удаление файла из временного
// хранилища
&НаСервере
Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)
ЭлементСправочника = РеквизитФормыВЗначение("Объект");
ДвоичныеДанные = ПолучитьФайлИзВременногоХранилища(АдресВременногоХранилища);
ЭлементСправочника.ДанныеФайла = Новый ХранилищеЗначения(ДвоичныеДанные);
ФайлПутьНаДиске = Новый Файл(ЭлементСправочника.ИмяФайла);
ЭлементСправочника.ИмяФайла = ФайлПутьНаДиске.Имя;
ЭлементСправочника.Записать();
Модифицированность = Ложь;
УдалитьФайлИзВременногоХранилища(АдресВременногоХранилища);
ЗначениеВРеквизитФормы(ЭлементСправочника, "Объект");
КонецПроцедуры
// Считывание файла из реквизита и сохранение его
// на локальном диске в интерактивном режиме
&НаКлиенте
Процедура ПрочитатьФайлИСохранитьНаДиск()
Адрес =
ПолучитьАдресФайлаВИнформационнойБазе(Объект.Ссылка,
"ДанныеФайла");
ПолучитьФайл(Адрес, Объект.ИмяФайла, Истина);
КонецПроцедуры
Поддержка адресов в поле картинки
Элемент управления Поле картинки поддерживает отображение картинки, заданной адресом файла во временном хранилище или в базе данных.
Для этого в свойстве Данные элемента формы необходимо задать реквизит строкового типа. Значение этого реквизита и будет интерпретироваться как адрес картинки.
[Image]
Пример
// Привязка поля картинки к адресу картинки во временном // хранилище. АдресКартинки реквизит формы строкового типа ПоместитьФайл(АдресКартинки, ,Истина) Картинка.Данные = АдресКартинки
Ограничения при работе с Веб-клиентом
Работа описываемого механизма при использовании Веб-клиента имеет некоторые ограничения. Эти ограничения связаны с особенностями модели безопасности браузера. Так, например, клиент самостоятельно не может сохранить файл в локальную файловую систему, то есть доступен только интерактивный вариант клиентских методов ПоместитьФайл() и ПолучитьФайл(). При попытке использовать не интерактивный режим генерируется исключение. Диалоговые окна, отображаемые в интерактивном режиме, специфичны для конкретного типа браузера.
Особенности при работе с ХранилищемЗначений на Клиенте
Проблема:
Когда у Документа в табличной части есть реквизит типа ХранилищеЗначений, то тормозит открытие формы документа, если в этом реквизите записаны данные большого размера.
Предполагаемая причина:
Возможно, при открытии формы, на клиент передается не ссылка на данные находящиеся в ХранилищеЗначений, а сами данные.
Решение
- В свойствах табличного реквизита формы есть флаг «Использовать всегда». Если он установлен, то содержимое поля всегда передается между сервером и клиентом — например, при открытии формы. Этот флаг надо отключить, но при этом нужно учесть это в коде, так как по умолчанию значения этого поля на клиенте не будет. Пример можно посмотреть в 1С:Архив.
Ещё лучше использовать временное хранилище для передачи файлов между клиентом и сервером.
Как обеспечить хранение хранилищ значений в строках табличной части в управляемой форме? |
Я |
05.09.17 — 23:38
Есть динамически создаваемый объектный реквизит управляемой формы (например СправочникОбъект.Номенклатура). У него есть табличные части с реквизитами типа ХранилищеЗначения. Нужно предоставить пользователю возможность просматривать представления и редактировать содержимое этих хранилищ значений. Как оптимальнее всего решать такую задачу?
Пока я вижу только способ создания реквизита ТаблицаЗначений для каждой ТЧ с созданием дочерних реквизитов по колонкам ТЧ, но хранилища значений заменять на Строка(0). При чтении объекта помещать каждое хранилище значения во временное хранилище, а в реквизит таблицы помещать его адрес. Перед записью соответственно делать обратную процедуру. Но уж очень хлопотный способ.
1 — 10.09.17 — 14:12
Ап
2 — 10.09.17 — 14:17
Смириться или переделать архитектуру.
Сколько копий уже ломали, что хранилище значений в ТЧ — это зло…
3 — 10.09.17 — 23:37
(0) А чем РС не устраивает?
4 — 10.09.17 — 23:54
(3) Не понял.
5 — 10.09.17 — 23:56
А что находится в ХЗ?
6 — 10.09.17 — 23:58
Ты просто так излагаешь странно, будто в обычных формах ХЗ — это такой прям клиентский редактируемый тип данных.
7 — 11.09.17 — 00:09
(0)»При чтении объекта помещать каждое хранилище значения во временное хранилище, а в реквизит таблицы помещать его адре» — мне кажется лишнее… Правится должна одна строка, а читаются все 20.. Сделать форму для редактирования, как возникла нужда править — открывать ее, блокируя владельца, и обновлять ХЗ соотв. Это также позволит разделить код по редактированию от кода по сохранению.
8 — 11.09.17 — 06:40
(3) Сделай регистр сведений. Храни в нем хранилища.
9 — 11.09.17 — 06:55
(7) Форму то сделать проще простого. Как хранить хранилища значений для строк ТЧ (до записи объекта в базу)?
10 — 11.09.17 — 06:58
(6) Посмотри мой «Редактор объекта БД» из подсистемы «Инструменты разработчика». Там полная поддержка хранилищ значений (в ТЧ, в движениях, в реквизитах объекта).
11 — 11.09.17 — 07:50
не понимаю чем тут ТЗ поможет. как не крути ХЗ напрямую нельзя редактировать
12 — 11.09.17 — 08:36
(9) СправочникОбъект после редактирования ХЗ что мешает принудительно записать?
13 — 11.09.17 — 08:47
(12) хотя можно и не писать… только про модифицированность основной формы не забыть
получаешь ХЗ из ОБЪЕКТА на сервере, передаешь в форму редактирования параметром, ХЗ МОЖНО ПЕРЕДАВАТЬ, ОНО СЕРИАЛИЗУЕТСЯ, ПриСозданииНаСервере формы редактирования читаешь из ХЗ и помещаешь в реквизит формы
обратно передаешь так же: пакуешь реквизит в ХЗ и отдаешь как параметр оповещения
в исходной форме ловишь оповещение, на сервере присваиваешь ОБЪЕКТУ через
ОБ = РеквизитФормыВЗначение(«Объект»);
……….
ЗначениеВРеквизитФормы(ОБ,»Объект»);
вот после этого надо по идее или взвести модифицированность основной формы или принудительно записать ОБЪЕКТ
14 — 11.09.17 — 09:03
(13) Ты уже вроде (9) прочитал и даже ответил. Там я писал что форму для редактирования хранилища значения сделать просто. Но возможно кому то будет полезно.
15 — 11.09.17 — 09:07
Давайте сосредоточимся на (0). Платформа для реквизитов объектов типа ХранилищеЗначения реализует в серверном контексте формы внутреннее хранилище, т.е. на самом деле хранлища значений лежат в строках ТЧ данных формы на сервере, но они не видны в объектной модели и получить их нельзя. Если удалить строку ТЧ, то удалится и ее хранилище значения из серверных данных формы. Если переместить строку ТЧ, то у нее сохранится хранилище значения. При записи объекта все эти хранилища значений в реквизитах строк ТЧ появляются, но до этого момента их нельзя увидеть.
Поэтому я и написал в (0) что очевидным способом является реализованная на прикладном уровне альтернатива механизму платформы, но с возможностью получать хранилище значения ячейки на клиент и там редактировать его.
16 — 11.09.17 — 09:15
(0) ну а чем он хлопотный? прописать ПриЧетнииНаСервере, ПередЗаписьюНаСервере…
но я бы в ТЗ-реквизитах формы добавил поле для хранения индекса соответствующей табличной части объекта и дополнительно обработку удаления/добавления строк ТЧ.
17 — 11.09.17 — 09:33
(15) «хранлища значений лежат в строках ТЧ «. Вот вам, видимо, болт.
В строках ТЧ лежат не собственно значения, а их адреса в специально предназначенном для этих целей хранилище в БД. Потому и работа с ними организована в стиле поместить и получить. Все остальное — на прикладном разработчике.
Если допустим в хранилище лежит какой-нибудь специфичный файл. Например чертеж АвтоКада. Как вы предлагаете его редактировать в ячейке табличного поля?
18 — 11.09.17 — 09:56
(17)
Про редактирования хранилищ в форме смотри (10).
Про хранение адресов вместо самих хранилищ — это понятно. Я написал так для упрощения, чтобы понятнее передать смысл. Ведь в (0) я по сути предложил тоже самое, только кодировать самому.
19 — 11.09.17 — 10:26
(0)а зачем создавать таблицу значений для каждой ТЧ? Если можно просто добавить реквизит формы с адресом прямо в ТЧ (вроде, так все и делают)?
20 — 11.09.17 — 10:57
(19) Да, действительно делают. Забыл об этой возможности. Спасибо. Это упрощает реализацию.
21 — 11.09.17 — 11:20
(14) а как редактировать ХЗ без доп.формы, файл или ТЗ или пять томов ВойнаИМир в ячейке? 
22 — 11.09.17 — 12:16
(21) Зачем редактировать без доп. формы?
23 — 11.09.17 — 12:21
(9) Использовать значения произвольного типа или двоичные данные
24 — 11.09.17 — 12:31
(22) тогда я не понял вопроса и трудностей
передаешь ХЗ из строки Объекта в доп.форму как параметр, в доп.форме разворачиваешь его, через Оповестить отдаешь обратно и пишешь в основной форме в реквизит строки Объекта
25 — 11.09.17 — 12:33
(23) Не прокатит. При первой же синхронизации данных формы между сервером и клиентом возникнет ошибка «Отсутствует отображение типа ХранилищеЗначения».
26 — 11.09.17 — 12:35
(24) В 3-й раз: у меня нет проблемы редактировать одно хранилище значения на клиенте. Вопрос был: Как это сделать, когда у ТЧ есть реквизит типа ХранилищеЗначения?
27 — 11.09.17 — 12:40
(25) Прокатит. Если разбирать что именно там хранится.
Внутри хранилища хранилища значений еще одно хранилище значения?
28 — 11.09.17 — 13:52
(27) Проверил. Ты прав. Произвольный тип позволяет хранить хранилище значения в реквизите формы, причем независимо от его содержимого. Спасибо. Это мне сильно поможет.
Итак текущий план действий такой.
1. В ТЧ добавить реквизиты с типом Произвольный для каждого реквизита типа ХранилищеЗначения
2. Загрузить туда данные при чтении на сервере.
3. На толстом клиенте их оттуда получить и показать в отдельной форме-редакторе.
4. Поместить отредактированное значение обратно в реквизит ТЧ приозвольного типа.
5. Перед записью на сервере поместить из добавленных реквизитов ТЧ данные в оригинальные реквизиты ТЧ.
29 — 11.09.17 — 14:19
(26) тоже не понял
простой пример: тыркаешь два раза в строку, срабатывает процедура Выбор, в ней определяешь текущую строку, читаешь ХЗ этой строки, отдаешь как параметр формы в форму редактирования ХЗ и т.д.
30 — 11.09.17 — 14:30
(0) нетленка для типовых «без изменения конфигураций», угадал?)
31 — 11.09.17 — 14:31
аа, это же ТС
32 — 11.09.17 — 14:34
Как читать хранилище значения соответствующее строке из данных формы?
33 — 11.09.17 — 14:34
(32) это я обращался к (29)
34 — 11.09.17 — 15:20
(32) через идстроки на сервере
35 — 11.09.17 — 15:27
(34) Покажи код, который позволит прочитать хранилище значения из строки через ИД на сервере.
36 — 12.09.17 — 08:22
немножко соврамши про ИД, давно писал
весь фокус — найти нужную строку в ТЧ
&НаСервере
Функция ПараметрыЗапросаПолучитьСервер(ИДСтроки)
ПараметрыЗапроса = Новый ХранилищеЗначения(Неопределено);
ТекСтрока = Объект.ОбъектыОбмена.НайтиПоИдентификатору(ИДСтроки);
//получаем параметры запроса по имени объекта в строке
ОБ = РеквизитФормыВЗначение(«Объект»);
ТЧОбъекта = ОБ.ОбъектыОбмена;
ТекСтрокаТЧ = ТЧОбъекта.Найти(ТекСтрока.ИмяОбъектаОбмена);
Если НЕ ТекСтрокаТЧ = Неопределено Тогда
ПараметрыЗапроса = ТекСтрокаТЧ.ПараметрыЗапроса;
КонецЕсли;
Возврат ПараметрыЗапроса;
КонецФункции
37 — 12.09.17 — 09:04
(36) Если это работает, то это будет лучшим ответом на мой вопрос (0) и очень странно что никто другой так долго на рассказал об этом способе. Спасибо.
38 — 12.09.17 — 09:06
(36) А способ то хотя видимо рабочий, но не универсальный. Не во всех ТЧ есть реквизит «ИмяОбъектаОбмена».
39 — 12.09.17 — 09:08
(36) Универсальный способ должен опираться на номер строки ТЧ, т.е. вместо поиска по значению реквизита надо брать строку ТЧ по индексу из данных формы.
40 — 12.09.17 — 09:12
Универсальный видимо будет типа такого
&НаСервере
Функция ПараметрыЗапросаПолучитьСервер(ИДСтроки)
ПараметрыЗапроса = Новый ХранилищеЗначения(Неопределено);
ТекСтрока = Объект.ОбъектыОбмена.НайтиПоИдентификатору(ИДСтроки);
//получаем параметры запроса по имени объекта в строке
ОБ = РеквизитФормыВЗначение(«Объект»);
ТЧОбъекта = ОБ.ОбъектыОбмена;
ТекСтрокаТЧ = ТЧОбъекта[Объект.ОбъектыОбмена.Индекс(ТекСтрока));
Если НЕ ТекСтрокаТЧ = Неопределено Тогда
ПараметрыЗапроса = ТекСтрокаТЧ.ПараметрыЗапроса;
КонецЕсли;
Возврат ПараметрыЗапроса;
КонецФункции
41 — 12.09.17 — 09:21
(40) индексы ДанныеФормыЭлементКоллекции и ОБ.ТЧ боюсь не совпадут 
42 — 12.09.17 — 09:23
(41) Совпадут. Иначе как номера строк устанавливаются при сохранении?
43 — 12.09.17 — 09:24
Вот только обратное действие, т.е. сохранение отредактированного значения в строке ТЧ на сервере будет приводить каждый раз к куче сбросов текущих строк и подобного.
44 — 12.09.17 — 10:17
(42) к сожалению не гарантируется, судя по
ДанныеФормыКоллекция (FormDataCollection)
Индекс (IndexOf)
Синтаксис:
Индекс(<Элемент>)
Описание:
Получает индекс элемента коллекции.
именно Элемента из ДанныеФормыКоллекция
про совпадение результата с методом
Табличная часть (Tabular section)
Индекс (IndexOf)
Синтаксис:
Индекс(<Строка>)
Параметры:
<Строка> (обязательный
Описание:
Получает индекс строки в табличной части.
ни слова 
45 — 12.09.17 — 10:30
(44) Не согласен с твоим обоснованием твоего предположения. Если оно верно, то дай хотя бы одно предположение, в каком порядке расставляются строки ТЧ при преобразовании из данных формы.
46 — 12.09.17 — 10:31
(45) лучше вот чего
ДанныеФормыЭлементКоллекции (FormDataCollectionItem)
ИсходныйНомерСтроки (SourceLineNumber)
Использование:
Только чтение.
Описание:
Тип: Число.
Если объект ДанныеФормыКоллекция был получен из табличной части, то свойство содержит номер данной строки в оригинальной табличной части.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).
47 — 12.09.17 — 10:41
(46) Номер строки в ОРИГИНАЛЬНОЙ табличной части никак не поможет передать порядок строки из ДанныеФормыКоллекция в ТЧ.
48 — 12.09.17 — 10:57
(47) я предложил ИсходныйНомерСтроки только как ИД строки использовать
потому как индексы не сойдутся 
49 — 12.09.17 — 11:02
(48) Еще раз почему индексы не сойдутся? (44) Слишком слабый (очень косвенный) аргумент.
50 — 12.09.17 — 11:30
(49) потому как это разные по сути коллекции
если строку на форме подвигать вверх-вниз, индекс элемента в ДанныеФормыКоллекции изменится? а в коллекции РеквизитФормыВЗначение().ТЧ?
51 — 12.09.17 — 11:36
(50) Сдвиг строки в таблице формы приведет к изменению индекса ДанныеФормыЭлементКоллекции и соответсвенно получаемой из нее через РеквизитФормыВЗначение строки ТЧ
52 — 12.09.17 — 11:47
(51) проверял? 
53 — 12.09.17 — 11:48
(51) +а если строка новая и подвинута промеж «старых»?
54 — 12.09.17 — 11:48
(51) Не проверял. А ты проверял? Где тогда порядок строк в ДанныеФормыКоллекция хранится?
55 — 12.09.17 — 11:49
(53) Причем здесь старые строки?
56 — 12.09.17 — 12:18
(55) короч, отпишись как реализуешь, интересно 
57 — 12.09.17 — 12:23
(56) Да, напишу о результатах. Спасибо еще раз за наиболее ценную информацию по теме.
TormozIT
58 — 16.09.17 — 13:45
(28) В итоге получилось этим способом.
Способ с обращением к серверу для получения/установки хранилища значения через РеквизитФормыВЗначение не заработал. Мои представления о том, как хранятся хранилища значений в коллекциях данных формы оказались не верными. Если преобразовать объект с хранилищем значения в ТЧ в данные формы и обратно, то хранилище значения очищается. Таким образом получается, что платформа вообще не хранит хранилища значений для коллекций формы. Получается, что они будут всегда очищаться при записи, если явно не позаботиться об их сохранении?
В тонком и веб-клиенте имеется возможность загружать внешние файлы, но сохранение в реквизите табличной части отрабатывается некорректно. Предлагаю свой метод решения этой задачи.
В табличных частях объектов 8.2 имеется возможность создавать реквизиты типа ХранилищеЗначения но сохранеие этих реквизитов в тонком клиенте отрабатывается некорректно, разве что каждый раз после присваивания вызывать метод записи объекта Записать(), что не очень то удобно использовать каждый раз при изменении отдельной строки. Для корректной работы с реквизитами такого типа предлагаю сохранять значения в соответствия, которое в свой черед помещается в реквизит формы типа ХранилищеЗначения. Ключом соответствия является идентификатор строки табличной части
////////////////////////////////////////////////////////////////////////
/////////////////////// Обработчик событий на клиенте
&НаКлиенте
Процедура ПрикрепленныеФайлыПередУдалением(Элемент, Отказ)
ТекущаяСтрока = Элементы.ПрикрепленныеФайлы.ТекущаяСтрока;
ДанныеСтроки = Элементы.ПрикрепленныеФайлы.ДанныеСтроки(ТекущаяСтрока);
УдалитьДанныеИзСоответствия(ДанныеСтроки.НомерСтроки);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////
/////////////////////// Обработчик событий на сервере
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Хранилище = Новый ХранилищеЗначения(Новый Соответствие);
Индекс = —1;
Для Каждого Строка Из Объект.ПрикрепленныеФайлы Цикл
Индекс = Макс(Индекс, Строка.ПолучитьИдентификатор());
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Соответствие = Хранилище.Получить();
Для Каждого Строка Из Объект.ПрикрепленныеФайлы Цикл
ИндексТекущейСтроки = Строка.ПолучитьИдентификатор();
Если Не Соответствие[ИндексТекущейСтроки] = Неопределено Тогда
// Записать файл
ТекущийОбъект.ПрикрепленныеФайлы[Строка.НомерСтроки—1].Файл = Соответствие[ИндексТекущейСтроки];
// Удаление соответствия
Соответствие.Удалить(ИндексТекущейСтроки);
КонецЕсли;
КонецЦикла;
Хранилище = Новый ХранилищеЗначения(Соответствие);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////
/////////////////////// Серверные процедуры и функции
&НаСервере
Процедура ПоместитьФайлыИзВременногоХранилищаВТЗ(МассивФайлов)
СправочникОбъект = РеквизитФормыВЗначение(«Объект»);
// … тело модуля
Индекс = Индекс + 1;
НоваяСтрокаВложения = СправочникОбъект.ПрикрепленныеФайлы.Добавить();
Соответствие = Хранилище.Получить();
Соответствие.Вставить(Индекс, Новый ХранилищеЗначения(Файл));
Хранилище = Новый ХранилищеЗначения(Соответствие);
ЗначениеВРеквизитФормы(СправочникОбъект, «Объект»);
КонецПроцедуры
&НаСервере
Процедура УдалитьДанныеИзСоответствия(ТекущаяСтрока);
ИндексТекущейСтроки = Объект.ПрикрепленныеФайлы[ТекущаяСтрока—1].ПолучитьИдентификатор();
Соответствие = Хранилище.Получить();
Соответствие.Удалить(ИндексТекущейСтроки);
Хранилище = Новый ХранилищеЗначения(Соответствие);
КонецПроцедуры.
работа с реквизитом типа хранилище значения
Автор sunady, 17 янв 2011, 09:39
0 Пользователей и 1 гость просматривают эту тему.
Всем добрый день!
Хочу из внешней обработки передавать массив серийных номеров в табличную часть Товары. Добавила реквизит табличной части с типом хранилище значения и в обработке сохраняю в него выборку. Тут же беру ее обратно, чтобы проверить как сохранилось и получаю неопределено.
Если делать через локальную переменную типа хранилище значения — все работает.
Подскажите пожалуйста в чем может быть дело.
ДокументРеализации.ПолучитьОбъект().Товары[НомерСтроки].СерийныеНомера = Новый ХранилищеЗначения(СерийныеНомера.Выгрузить());;
ТаблицаЗначений = ДокументРеализации.Товары[НомерСтроки].СерийныеНомера.Получить();
Если ТаблицаЗначений <> Неопределено Тогда
Для каждого СтрокаСерийника из ТаблицаЗначений Цикл
Сообщить(СтрокаСерийника.СерийныйНомер);
КонецЦикла;
КонецЕсли;
Думаю, чтобы получить изменения, нужно их в документ в начале записать
То есть как-то так:
ДокОбъект=ДокументРеализации.ПолучитьОбъект();
ДокОбъект.Товары[НомерСтроки].СерийныеНомера = Новый ХранилищеЗначения(СерийныеНомера.Выгрузить());
ДокОбъект.Записать();
ТаблицаЗначений = ДокументРеализации.Товары[НомерСтроки].СерийныеНомера.Получить();
Если ТаблицаЗначений <> Неопределено Тогда
Для каждого СтрокаСерийника из ТаблицаЗначений Цикл
Сообщить(СтрокаСерийника.СерийныйНомер);
КонецЦикла;
КонецЕсли;
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь…
Мысль — это оргазм мозга. Кто способен его испытать — получают истинное наслаждение, остальным приходится имитировать
Спасибо, Клякса! Твой вариант работает, причем я пробовала тоже записывать и не работало, а твой код скопировала и все ок 
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь…
Мысль — это оргазм мозга. Кто способен его испытать — получают истинное наслаждение, остальным приходится имитировать
Хранилище значений в 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:importOtchet_realizacija_2020.epf», СтепеньСжатия));
КонецПроцедуры
Восстановление из Хранилище Значений в 1С 8.3:
&НаСервере
Процедура ВосстановлениеИзХранилищеЗначений();ИмяФайла = «D:importВойна_и_мир.txt»;// Двоичные данные можно восстановить из хранилища значения методом Получить и записать в файл методом Записать()
Если ТипЗнч(РеквизитХранилище) = Тип(«ДвоичныеДанные») Тогда// Хранилище.Получить()<>Неопределено Тогда // Процедура извлекает данные из хранилища (требует времени)
// Для больших объемов данных рекомендуется использовать доп.реквизит (Например: Булево) Содержит данные — Истина
ДанныеХранилища = РеквизитХранилище.Получить();
Если ДанныеХранилища = Неопределено Тогда
Сообщить(«Ошибка получения данных из хранилища значений 1С»);
КонецЕсли;
ДанныеХранилища.Записать(ИмяФайла); // Записываем восстановленые данные в файл
// Восстановление Табличного документа
ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ДанныеХранилища);// Восстановление и запуск Отчета/обработки 1С
ИмяФайла_Epf = «D:importOtchet_realizacija_2020.epf»;
ДвоичныеДанные = РеквизитХранилище.Получить();
ДвоичныеДанные.Записать(ИмяФайла_Epf);
Epf = ВнешниеОбработки.Создать(ИмяФайла_Epf);
Epf.ПолучитьФорму().Открыть();
Иначе
ДанныеХранилища = РеквизитХранилище;
КонецЕсли;// Файлы зарегистрированного типа (doc, xls, pdf, jpg, txt, exe…)
ЗапуститьПриложение(ИмяФайла);
КонецПроцедуры
Очистка реквизита Хранилище Значений в 1С 8.3:
&НаКлиенте
Процедура ОчисткаРеквизитаХранилищеЗначений();РеквизитХранилище = Неопределено;
КонецПроцедуры
Проверка значения Хранилище Значений в 1С 8.3:
&НаКлиенте
Процедура ПроверкаЗначенияХранилищеЗначений();Значение = РеквизитХранилище.Получить();
Если Значение <> Неопределено Тогда
Если ТипЗнч(Значение) = Тип(«Строка») Тогда
Сообщить(«Это строка»);
ИначеЕсли ТипЗнч(Значение) = Тип(«Картинка») Тогда
Сообщить(«Это фотография (картинка)»);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом «Хранилище значений» 1С:
Copyright©, «Программист 1С в г.Минске», 22.09.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Хранилище значений 1с
Хранилище Значений 1с используется для хранения значений различных типов в сериализованном виде. Этот вид позволяет записывать данные и потом восстанавливать их. В документации по встроенному языку в описании объектов возможность сериализации указывается отметкой “Сериализуется”.
Хранение происходит в самой базе данных или файле 1Cv8.1CD в случае файловой базы данных или в таблицах на SQL-сервере в случае серверной . Соответственно при выгрузки конфигурации, данные используемые хранилищем значений будут включены в архив базы (резервную копию).
С помощью этого объекта можно хранить такие данные как:
- файлы,
- картинки (фотографии),
- внешние обработки,
- таблицы значений,
- структуры…
Важно понимать, что хранение данных в таком виде будет существенно замедлять работу базы данных.
Хранилище Значения 1с
Сам тип Хранилище Значения имеет только один Метод и один конструктор.
Информация о методах и конструкторах из Синтаксис-Помошника.
![]() |
![]() |
Большинство объектов, которые имеют неизменяемое значение, а также универсальные коллекции, могут быть помещены в ХранилищеЗначения. К значению, хранящемуся в объекте, нельзя обращаться, его можно только извлечь из хранилища.
Хранилище значений 1с может применяется для хранения таблицы значений.
Создадим Регистр сведений

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

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

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

В качестве Реквизита сделаем ссылку на наш Справочник Дни.
На форму обработки добавим Кнопку. Код процедуры кнопки следующий:
Ссылка на обработку(Ссылка). Код внешней обработки:
&НаСервере
Процедура Команда1НаСервере()
Тз=новый ТаблицаЗначений;
Хранилище=новый ХранилищеЗначения(ТЗ,новый СжатиеДанных(9));
Хранилище=объект.Объект.КурсДня.Получить();
для каждого строка из Хранилище цикл
сообщить(Строка.Курс);
сообщить(Строка.Валюта);
конеццикла;
КонецПроцедуры
&НаКлиенте
Процедура Команда1(Команда)
Команда1НаСервере();
КонецПроцедуры
Сохранение и восстановление данных Табличного документа в Хранилище значений.
Объект Табличный документ используется при проектировании Печатных форм. Передача данных выполняется с использованием Хранилища значений.
//Табличный документ:
Процедура СохранитьВХранилищеНажатие(Элемент)
ТабДок=Новый ТабличныйДокумент;
ТабДок.Вывести(ЭлементыФормы.ПолеТабличногоДокумента1);
Хранилище=Новый ХранилищеЗначения(ТабДок);
Записать();
КонецПроцедуры
Процедура ВосстановитьИзХранилищаНажатие(Элемент)
ТабДок=Хранилище.Получить();
Если ТабДок<>Неопределено Тогда
ЭлементыФормы.ПолеТабличногоДокумента1.Вывести(ТабДок);
КонецЕсли;
КонецПроцедуры
Хранилище значения
Хранение данных в полях типа ХранилищеЗначения
В 1С:Предприятии 8 существует возможность хранения различных данных в полях
типа ХранилищеЗначения. В этих полях могут храниться значения
типа ХранилищеЗначения. Сам тип
ХранилищеЗначения предназначен, прежде всего, для хранения
значений различных типов в сериализованном виде, то есть в том виде, который
позволяет записывать данные и потом восстанавливать их. В документации по
встроенному языку в описании объектов возможность сериализации указывается
отметкой “Сериализуется”. Эти значения, а также значения примитивных типов,
могут помещаться в хранилище значения и таким образом могут записываться в поля
базы данных с типом ХранилищеЗначения. Важной особенностью
хранилища значений является возможность хранения данных в сжатом виде. Это
позволяет существенно сократить объем хранимой информации для больших
объектов.
Таким образом, с помощью полей типа ХранилищеЗначения
существует возможность хранения в базе данных существенно более широкого перечня
типов данных, по сравнению с тем, который может быть в явном виде указан для
полей. Однако следует учитывать, что такой способ хранения и возможности
манипулирования такими данными существенно отличаются от обычного хранения
данных в полях базы данных. Для таких полей система не поддерживает практически
никакой функциональности, кроме собственно записи и чтения. Для таких полей не
может использоваться индексирование, по ним нельзя упорядочивать данные в
запросах и выборках, такие поля не могут суммироваться и т.д. Можно считать, что
в этом случае механизм базы данных хранит некоторую информацию, ничего не зная о
ее природе.
Соответственно поля типа ХранилищеЗначения следует
использовать только в тех случаях, когда это соответствует их назначению и
технологическим особенностям.
Важно! В системе не поддерживается ссылочная целостность по объектам, сохраненным в базе данных в полях типа ХранилищеЗначения. Это означает, что при попытке удаления, например, элементов справочников система не контролирует ссылки на эти элементы, сохраненные в ХранилищеЗначения.
Одним из основных применений полей типа ХранилищеЗначения
является хранение изображений и образов файлов. Для этого используются типа
Картинка и ДвоичныеДанные. Это позволяет
сохранять в базе данных фотографии сотрудников, документы созданные в различных
форматах и т.д. При реализации хранения такой информации можно рекомендовать
создавать структуры данных, которые обеспечат отдельное хранение этих полей от
основной информации. Например, для хранения фотографий сотрудников можно
реализовать отдельный справочник или регистр сведений, а не помещать поля типа
ХранилищеЗначения в сами объекты, хранящие список физических
лиц. Следует учитывать, что объекты (например, элементы справочника) считываются
системой всегда целиком. Поэтому хранение больших объемов информации
непосредственно в полях объектов может существенно замедлить работу системы.
В полях типа ХранилищеЗначения допускается, например,
хранение таблиц значений и структур. При этом в таблицах значений и структурах
могут храниться любые типы данных, в том числе и ссылочные типы. Заметим, что
в ХранилищеЗначения коллекция может быть помещена, если в ней
содержатся только сериализуемые значения. Однако следует учитывать, что этот
вариант хранения данных существенно отличается, от явного хранения значений в
отдельных полях и от хранения информации в табличных частях или регистрах
сведений. Система не будет поддерживать для таких полей ссылочную целостность,
не будет обеспечивать поиск данных в запросах и т.д. Таким образом, хранение
коллекций в таких полях нельзя применять для реализации существенных частей
прикладного решения отвечающих за бизнес логику. Такое хранение может
допускаться только для вспомогательных данных, не имеющих существенного значения
для бизнес-логики прикладного решения, например, для хранения каких-либо
настроек работы пользователей.
Хотя в системе не существует явного ограничения на размер данных,
хранящихся в полях типа ХранилищеЗначения, следует все-таки
осмотрительно относиться к объемам хранимой информации. Следует учитывать, что
помещение больших объемов в такие поля увеличивает общий объем информационной
базы, и это будет негативно сказываться на работе системы при выполнении
различных административных операций, таких как создание резервной копии базы
данных. Например, при хранении образов файлов, можно рекомендовать хранить в
таких полях данные, действительно необходимые в работе, но не использовать их
для хранения больших объемов файлов, не используемых в решаемой прикладной
задаче.
Объект типа ХранилищеЗначения создается следующей конструкцией
Хранилище = Новый ХранилищеЗначения(<Значение>, <АлгоритмСжатияДанных>)
Параметры:
- <Значение> (обязательный)Тип: Произвольный. Значение, которое должно быть помещено в хранилище.
- <АлгоритмСжатияДанных> (необязательный)Тип: СжатиеДанных. Задает степень сжатия данных.
- Если параметр не установлен, сжатие не используется.
Пример 1:
МояКартинка = Новый Картинка("C:Мои документыКартинка1.bmp");
Сжатие = Новый СжатиеДанных(6);
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка, Сжатие);
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();
Пример 2: Метод получить – К значению, хранящемуся в объекте, нельзя обращаться, его можно только извлечь из хранилища.
// Двоичные Данные текстового файла, сохраняемого в реквизите МоеХранилище документа
Хранилище= Заявка.МоеХранилище.Получить();
ВременныйФайл = ПолучитьИмяВременногоФайла("txt");
Хранилище.Записать(ВременныйФайл);
ТекстовыйДок= Новый ТекстовыйДокумент;
ТекстовыйДок.Прочитать(ВременныйФайл, КодировкаТекста.UTF8);
Пример 3 : Использование объект ДвоичныеДанные , значение которого считывается из файла и может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл.
МояКартинка = Новый ДвоичныеДанные("C:Мои документыКартинка1.bmp");
ХранилищеКартинки = Новый ХранилищеЗначения(МояКартинка);
// сохранение значения типа ХранилищеЗначения в базе данных
НовНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
НовНоменклатура.Наименование = "Диван ""Маргарита""";
// реквизит Изображение имеет тип ХранилищеЗначения
НовНоменклатура.Изображение = ХранилищеКартинки;
НовНоменклатура.Записать();
Пример 4 . Выгрузка значения типа ДвоичныеДанные из хранилища значений в файл
ИмяФайла = "C:Мои документыКартинка2.bmp";
Хранилище = НовНоменклатура.Изображение.Получить();
Хранилище.Записать(ИмяФайла);






