Добавление в базу файлов с расширением pdf и др.

1. AndrewUs 11 01.06.18 15:55 Сейчас в теме
Здравствуйте!
Создал справочник "СканыДокументов", с реквизитом "ДанныеКартинки" с типом "ХранилищеЗначения".
Создал форму документа. Добавил кнопки выгрузки и загрузки.

Добавил модуль работы кнопок:

&НаКлиенте
Процедура ВыбратьФайлКартинки(Команда)
	//Создаем оповещение,   именно  процедура  "ОбработатьВыборФайла"  будет вызвана при закрытии окна выбора файла
 Оповещение  =  Новый ОписаниеОповещения("ОбработатьВыборФайла",   ЭтотОбъект);
//Открываем интерактивно  окно для выбора файла
НачатьПомещениеФайла(Оповещение,   ,   ,   Истина,   УникальныйИдентификатор);

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


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

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	 СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "ДанныеКартинки"); 
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузитьФайл(Команда)
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    Диалог.Заголовок = "Выберите папку для сохранения";
    Диалог.МножественныйВыбор = Ложь;
	Если Диалог.Выбрать() Тогда
	    ПолучитьДанные(Диалог.Каталог);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПолучитьДанные(Каталог)
    Если Прав(Каталог,1)="\" Тогда
        ИмяФайла=Каталог+Объект.Наименование;
    Иначе
        ИмяФайла=Каталог+"\"+Объект.Наименование;
    КонецЕсли;
	//Знч=Объект.Ссылка.;
	//Знч.Записать(ИмяФайла);
КонецПроцедуры
Показать


Сохранить можно любой файл, но корректно можно получить только файлы формата jpg, т.е. графического формата.
Подскажите, пожалуйста, как корректно получать файлы формата, например, pdf?
Спасибо.
По теме из базы знаний
Найденные решения
2. SlavaKron 01.06.18 16:15 Сейчас в теме
Попробуйте
&НаКлиенте
Процедура ВыгрузитьВФайл(Команда)
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Показать(Новый ОписаниеОповещения("ПослеВыбораФайлаСохранения", ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораФайлаСохранения(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если ВыбранныеФайлы <> Неопределено Тогда
		АдресВХранилище = ПолучитьДвоичныеДанные();
		Если АдресВХранилище <> Неопределено Тогда
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
			ДвоичныеДанные.Записать(ВыбранныеФайлы[0]);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьДвоичныеДанные()
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	Т.ДанныеКартинки
	|ИЗ
	|	Справочник.СканыДокументов КАК Т
	|ГДЕ
	|	Т.Ссылка = &Ссылка");
	Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
	РезультатЗапроса = Запрос.Выполнить();
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Неопределено
	Иначе
		ДвоичныеДанные = РезультатЗапроса.Выгрузить()[0][0].Получить();
		Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);
	КонецЕсли;
КонецФункции
Показать
AndrewUs; +1 Ответить
6. SlavaKron 04.06.18 11:11 Сейчас в теме
(5) Перед показом диалога можно настроить его фильтр.
Диалог.Фильтр = "Файлы PDF (*.pdf)|*.pdf";
AndrewUs; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 01.06.18 16:15 Сейчас в теме
Попробуйте
&НаКлиенте
Процедура ВыгрузитьВФайл(Команда)
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Показать(Новый ОписаниеОповещения("ПослеВыбораФайлаСохранения", ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораФайлаСохранения(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	Если ВыбранныеФайлы <> Неопределено Тогда
		АдресВХранилище = ПолучитьДвоичныеДанные();
		Если АдресВХранилище <> Неопределено Тогда
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
			ДвоичныеДанные.Записать(ВыбранныеФайлы[0]);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьДвоичныеДанные()
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	Т.ДанныеКартинки
	|ИЗ
	|	Справочник.СканыДокументов КАК Т
	|ГДЕ
	|	Т.Ссылка = &Ссылка");
	Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
	РезультатЗапроса = Запрос.Выполнить();
	Если РезультатЗапроса.Пустой() Тогда
		Возврат Неопределено
	Иначе
		ДвоичныеДанные = РезультатЗапроса.Выгрузить()[0][0].Получить();
		Возврат ПоместитьВоВременноеХранилище(ДвоичныеДанные);
	КонецЕсли;
КонецФункции
Показать
AndrewUs; +1 Ответить
5. AndrewUs 11 04.06.18 10:58 Сейчас в теме
(2) Сделал так как вы указали. Файл выгружается, но при выгрузке нет возможности выбрать тип файла. Можно ли этот момент как-то указать, например всегда при выгрузке файл должен сохраняться в формате pdf?
6. SlavaKron 04.06.18 11:11 Сейчас в теме
(5) Перед показом диалога можно настроить его фильтр.
Диалог.Фильтр = "Файлы PDF (*.pdf)|*.pdf";
AndrewUs; +1 Ответить
7. AndrewUs 11 04.06.18 11:42 Сейчас в теме
(6) Вот спасибо, огромное. Помогли.
8. AndrewUs 11 04.06.18 14:40 Сейчас в теме
(6) А скажите, можно ли не скачивая файл открывать его?
9. SlavaKron 04.06.18 16:13 Сейчас в теме
(8) Нет, двоичные данные файла у вас хранятся в самой базе - в любом случае придется их "скачивать" в файл на клиенте.
Но можно сделать 2 команды: на сохранение файла и на открытие. Разница будет лишь в том, что в первом случае мы даём возможность пользователю выбрать имя и место сохранения, а во втором - сохраняем скан во временный файл и открываем его средствами ОС:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".pdf");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЗапуститьПриложение(ИмяВременногоФайла);

Со стороны пользователя всё будет выглядеть так, как будто файл открывается непосредственно из базы.
10. AndrewUs 11 06.06.18 08:25 Сейчас в теме
(9) Добавил кнопку "ОткрытьФайл". Прописал код:
&НаКлиенте
Процедура ОткрытьФайл(Команда)
	Диалог = Новый ДиалогВыбораФайла(РежимОткрытияФайла.Открыть);
	Диалог.Показать(Новый ОписаниеОповещения("ПослеОткрытия", ЭтотОбъект));
КонецПроцедуры

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


Но я уверен что делаю неправильно, но не пойму как правильно.
11. SlavaKron 06.06.18 09:10 Сейчас в теме
(10) Диалог пользователю показывать не надо: имя файла сохранения присваивается программно (ПолучитьИмяВременногоФайла(".pdf") вернёт что-то типа "C:\Users\User\AppData\Local\Temp\v8_2B69_9.pdf")
&НаКлиенте
Процедура ОткрытьФайл(Команда)
	АдресВХранилище = ПолучитьДвоичныеДанные();
	Если АдресВХранилище <> Неопределено Тогда
		ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла(".pdf");
		ДвоичныеДанные.Записать(ИмяВременногоФайла);
		ЗапуститьПриложение(ИмяВременногоФайла);
	КонецЕсли;
КонецПроцедуры
Показать
12. AndrewUs 11 06.06.18 09:25 Сейчас в теме
(11) Ошибку дает:

"{Справочник.СканыДокументов.Форма.ФормаЭлемента.Форма(80)}: Ошибка при вызове метода контекста (ЗапуститьПриложение)
ЗапуститьПриложение(ИмяВременногоФайла);
по причине:
Использование синхронных методов на клиенте запрещено!"
3. Dnki 4 03.06.18 13:58 Сейчас в теме
* В вашем тексте так и не нашел команды
Записать(ИмяФайла)
* Закомментированный текст также не верен:
//Знч=Объект.Ссылка.;
//Знч.Записать(ИмяФайла);
* Сохранять можно только двоичные данные, а не Ссылка
ДвоичныеДанные = Объект.ДанныеКартинки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);

Так что я в недоумении: что значит "картинки корректно, другие не корректно" ?
4. ArchLord42 83 03.06.18 19:30 Сейчас в теме
(3) вся магия в начатьпомещениефайла почитайте справку на досуге
13. AndrewUs 11 06.06.18 09:30 Сейчас в теме
Нашёл ошибку. Нужно было в свойствах конфигурации включить "Использовать" в поле "Режим использования синхронных вызовов расширений платформы и внешних компонент".
14. AndrewUs 11 06.06.18 09:30 Сейчас в теме
Только интересно, на что данное изменение повлияет, если я его раньше не использовал, а теперь включил.
15. AndrewUs 11 06.06.18 09:53 Сейчас в теме
С базой работают еще рез веб. Скажите, как поправить ошибку?
Прикрепленные файлы:
16. AndrewUs 11 06.06.18 09:53 Сейчас в теме
Данная проблема возникает только при использовании веб-интерфейса.
17. vynosmozga 5 06.06.18 09:56 Сейчас в теме
(16) Наверно проблема в том, что данная процедура не видна с Веб-интерфейса. Обращение идет откуда?
18. AndrewUs 11 06.06.18 09:59 Сейчас в теме
Из формы справочника.
19. AndrewUs 11 06.06.18 10:34 Сейчас в теме
Может быть это связано с тем, что для метода "ПолучитьИмяВременногоФайла "

Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). ?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот