Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
25 ноя 2024, 12:09

Как сохранить файлы в базе?

Автор Walery100, 17 янв 2015, 19:16

0 Пользователей и 1 гость просматривают эту тему.

Walery100

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

MuI_I_Ika

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

Walery100

А почему нельзя хранить в реквизите документа?
Не могли бы Выпривестикусочек кода? (те, что в справке тестил)

MuI_I_Ika

В реквизите документа тоже можно. Но обычно загружают в справочник.

Ну вот так например для управляемой формы:

&НаКлиенте
Процедура ИзменитьКартинку(Команда)

АдресВременногоХранилища = "";
ВыбранноеИмя = "";
Если ПоместитьФайл(АдресВременногоХранилища, ВыбранноеИмя, , Истина, ЭтаФорма.УникальныйИдентификатор) Тогда
ПоместитьФайлОбъекта(АдресВременногоХранилища); //стандартная из демо
КонецЕсли;

ОбновитьИзображение();
КонецПроцедуры

&НаСервере
// Процедура извлекает данные объекта из временного хранилища,
// производит модификацию элемента справочника и записывает его.
//
// Параметры:
//  АдресВременногоХранилища – Строка – адрес временного хранилища.
//
// Возвращаемое значение:
//  Нет.
Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)

ОбъектФормы = РеквизитФормыВЗначение("Объект");

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);

РазмерИзображения = ДвоичныеДанные.Размер()/1024;

МаксимальныйРазмерАватара = КОнстанты.МаксимальныйРазмерАватара.Получить();
Если ЗначениеЗаполнено(МаксимальныйРазмерАватара) и МаксимальныйРазмерАватара>0 Тогда

Если РазмерИзображения > МаксимальныйРазмерАватара Тогда
ОбщегоНазначения.ВывестиОшибку("При загрузке аватара был выбран файл
|с размером выше допустимого ("+СокрЛП(МаксимальныйРазмерАватара)+" Кбайт).
|Выберите другой файл.");
Возврат;
КонецЕсли;

КонецЕсли;

ОбъектФормы.Хранилище = Новый ХранилищеЗначения(ДвоичныеДанные, Новый СжатиеДанных());
Файл = Новый Файл(АдресВременногоХранилища);

ОбъектФормы.Записать();
Модифицированность = Ложь;
УдалитьИзВременногоХранилища(АдресВременногоХранилища);

ЗначениеВРеквизитФормы(ОбъектФормы, "Объект");     

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

дфтын

МойФайл = Новый ДвоичныеДанные(ПолноеИмяФайла);
Хранилище = Новый ХранилищеЗначения(МойФайл,Новый СжатиеДанных(9));
Спр.Файл = Хранилище; // реквизит с типом - хранилище значений


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

Walery100

Давайте я подробнее опишу задачу, что бы получить верный ответ!
Есть желание, что бы работники филиалов предприятия, ежемесячно загружали через ВЭБ-интерфейс документ (например, таблицу), которая хранилась бы в базе и могла быть получена в с сервера. Я полагал, что это документ с реквизитом филиала и периода + хранилище значений. Такой документ легко отыскать и получить файл, только как туда (в реквизит) этот файл запихать?

дфтын

нуууу.. примерно так:
&НаСервереБезКонтекста
Процедура СохранитьВЫбранныйФайл(Адрес)
Спр = Справочники.МоиФайлы.СоздатьЭлемент();
Спр.ФайлХранилище = новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));
Спр.Записать();
КонецПроцедуры


&НаКлиенте
Процедура ВыборФайла(Команда)
Перем ВыбранноеИмя, НачальноеИмя;
Перем АдресВременногоХранилища;
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла",ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборФайла(результат, Адрес, ВыбранноеИмя, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕСЛИ;
СохранитьВЫбранныйФайл(Адрес);
КонецПроцедуры

skillful

Цитата: дфтын от 19 янв 2015, 21:42
нуууу.. примерно так:
&НаСервереБезКонтекста
Процедура СохранитьВЫбранныйФайл(Адрес)
Спр = Справочники.МоиФайлы.СоздатьЭлемент();
Спр.ФайлХранилище = новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));
Спр.Записать();
КонецПроцедуры


&НаКлиенте
Процедура ВыборФайла(Команда)
Перем ВыбранноеИмя, НачальноеИмя;
Перем АдресВременногоХранилища;
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла",ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборФайла(результат, Адрес, ВыбранноеИмя, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕСЛИ;
СохранитьВЫбранныйФайл(Адрес);
КонецПроцедуры


У меня такая же проблема. Пользователи загружают файл через веб-клиент в документ. Данный код очень помог сохранить файл в хранилище значения. А как этот файл затем сохранить на сервере где установлена связка Веб сервер + 1с???
Добавлено: 04 сен 2020, 20:38


Что-то я тупанул :dfbsdfbsdf: перепутав ПК. Вопрос снят...

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск