Добавление в базу файлов с расширением pdf и др.
Здравствуйте!
Создал справочник "СканыДокументов", с реквизитом "ДанныеКартинки" с типом "ХранилищеЗначения".
Создал форму документа. Добавил кнопки выгрузки и загрузки.
Добавил модуль работы кнопок:
Сохранить можно любой файл, но корректно можно получить только файлы формата jpg, т.е. графического формата.
Подскажите, пожалуйста, как корректно получать файлы формата, например, pdf?
Спасибо.
Создал справочник "СканыДокументов", с реквизитом "ДанныеКартинки" с типом "ХранилищеЗначения".
Создал форму документа. Добавил кнопки выгрузки и загрузки.
Добавил модуль работы кнопок:
&НаКлиенте
Процедура ВыбратьФайлКартинки(Команда)
//Создаем оповещение, именно процедура "ОбработатьВыборФайла" будет вызвана при закрытии окна выбора файла
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
//Открываем интерактивно окно для выбора файла
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
СсылкаНаКартинку = Адрес;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(СсылкаНаКартинку) Тогда
ТекущийОбъект.ДанныеКартинки = Новый ХранилищеЗначения( ПолучитьИзВременногоХранилища(СсылкаНаКартинку) );
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеКартинки");
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Диалог.Заголовок = "Выберите папку для сохранения";
Диалог.МножественныйВыбор = Ложь;
Если Диалог.Выбрать() Тогда
ПолучитьДанные(Диалог.Каталог);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПолучитьДанные(Каталог)
Если Прав(Каталог,1)="\" Тогда
ИмяФайла=Каталог+Объект.Наименование;
Иначе
ИмяФайла=Каталог+"\"+Объект.Наименование;
КонецЕсли;
//Знч=Объект.Ссылка.;
//Знч.Записать(ИмяФайла);
КонецПроцедуры
ПоказатьСохранить можно любой файл, но корректно можно получить только файлы формата jpg, т.е. графического формата.
Подскажите, пожалуйста, как корректно получать файлы формата, например, pdf?
Спасибо.
По теме из базы знаний
- Алкогольная декларация для 1С 8.1, 8.2, 8.3 (1, 2, 3, 4, 5, 6, 7, 8 формы) УТ10.2/10.3, УТ11, УПП, КА, БП2.0/3.0, БП КОРП, Розница 1.0/2.1, Далион, Астор, УТАП и др. с подписью и шифрованием, редакция 2.3
- Организованным быть важно!
- Книга доходов и расходов (КУДИР) и кассовая книга для 1С 8.х любой конфигурации для предприятий на УСН, ПСН, ЕСХН
- Универсальная печать по шаблонам Word (Печать договоров из 1С БП 3, УНФ 1.6, ЗУП 3, УТ 11, КА 2, ERP 2, ДО 3)
- 1С ЭДО: Диадок, СБИС, ЭДО Лайт, Такском, Signatura.pro, Астрал.ЭДО, Честный Знак и др. - расширение для работы. Для обычных форм - внешняя обработка. Поддержка Linux.
Найденные решения
Попробуйте
&НаКлиенте
Процедура ВыгрузитьВФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Показать(Новый ОписаниеОповещения("ПослеВыбораФайлаСохранения", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайлаСохранения(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
АдресВХранилище = ПолучитьДвоичныеДанные();
Если АдресВХранилище <> Неопределено Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
ДвоичныеДанные.Записать(ВыбранныеФайлы[0]);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьДвоичныеДанные()
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Т.ДанныеКартинки
|ИЗ
| Справочник.СканыДокументов КАК Т
|ГДЕ
| Т.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Неопределено
Иначе
ДвоичныеДанные = РезультатЗапроса.Выгрузить()[0][0].Получить();
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);
КонецЕсли;
КонецФункции
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Попробуйте
&НаКлиенте
Процедура ВыгрузитьВФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Показать(Новый ОписаниеОповещения("ПослеВыбораФайлаСохранения", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайлаСохранения(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
АдресВХранилище = ПолучитьДвоичныеДанные();
Если АдресВХранилище <> Неопределено Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
ДвоичныеДанные.Записать(ВыбранныеФайлы[0]);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьДвоичныеДанные()
Запрос = Новый Запрос(
"ВЫБРАТЬ
| Т.ДанныеКартинки
|ИЗ
| Справочник.СканыДокументов КАК Т
|ГДЕ
| Т.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Неопределено
Иначе
ДвоичныеДанные = РезультатЗапроса.Выгрузить()[0][0].Получить();
Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);
КонецЕсли;
КонецФункции
Показать
(8) Нет, двоичные данные файла у вас хранятся в самой базе - в любом случае придется их "скачивать" в файл на клиенте.
Но можно сделать 2 команды: на сохранение файла и на открытие. Разница будет лишь в том, что в первом случае мы даём возможность пользователю выбрать имя и место сохранения, а во втором - сохраняем скан во временный файл и открываем его средствами ОС:
Со стороны пользователя всё будет выглядеть так, как будто файл открывается непосредственно из базы.
Но можно сделать 2 команды: на сохранение файла и на открытие. Разница будет лишь в том, что в первом случае мы даём возможность пользователю выбрать имя и место сохранения, а во втором - сохраняем скан во временный файл и открываем его средствами ОС:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".pdf");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЗапуститьПриложение(ИмяВременногоФайла);
Со стороны пользователя всё будет выглядеть так, как будто файл открывается непосредственно из базы.
(9) Добавил кнопку "ОткрытьФайл". Прописал код:
Но я уверен что делаю неправильно, но не пойму как правильно.
&НаКлиенте
Процедура ОткрытьФайл(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимОткрытияФайла.Открыть);
Диалог.Показать(Новый ОписаниеОповещения("ПослеОткрытия", ЭтотОбъект));
КонецПроцедуры
&НаКлиенте
Процедура ПослеОткрытия(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы <> Неопределено Тогда
АдресВХранилище = ПолучитьДвоичныеДанные();
Если АдресВХранилище <> Неопределено Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".pdf");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЗапуститьПриложение(ИмяВременногоФайла);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ПоказатьНо я уверен что делаю неправильно, но не пойму как правильно.
(10) Диалог пользователю показывать не надо: имя файла сохранения присваивается программно (ПолучитьИмяВременногоФайла(".pdf") вернёт что-то типа "C:\Users\User\AppData\Local\Temp\v8_2B69_9.pdf")
&НаКлиенте
Процедура ОткрытьФайл(Команда)
АдресВХранилище = ПолучитьДвоичныеДанные();
Если АдресВХранилище <> Неопределено Тогда
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".pdf");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЗапуститьПриложение(ИмяВременногоФайла);
КонецЕсли;
КонецПроцедуры
Показать
* В вашем тексте так и не нашел команды
Записать(ИмяФайла)
* Закомментированный текст также не верен:
//Знч=Объект.Ссылка.;
//Знч.Записать(ИмяФайла);
* Сохранять можно только двоичные данные, а не Ссылка
ДвоичныеДанные = Объект.ДанныеКартинки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
Так что я в недоумении: что значит "картинки корректно, другие не корректно" ?
Записать(ИмяФайла)
* Закомментированный текст также не верен:
//Знч=Объект.Ссылка.;
//Знч.Записать(ИмяФайла);
* Сохранять можно только двоичные данные, а не Ссылка
ДвоичныеДанные = Объект.ДанныеКартинки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
Так что я в недоумении: что значит "картинки корректно, другие не корректно" ?
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот