Как в управляемых формах можно Сохранять и Выгружать файлы PDF

1. user1979322 22.07.24 10:31 Сейчас в теме
Всем привет, поставили задачу по сохранению файла на компьютере с заявкой от клиента, что бы не искать в почте, а можно получить файл из формы. В интернете нашел некоторые решения, но почему то выдают ошибку. Может подскажите рабочий вариант
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. usershmuser 22.07.24 11:34 Сейчас в теме
Если win10 то печатать на принтер пдф и не сношать мозг т.к. это скорее всего необходимо для отправки файла по электронной почте.
3. user1979322 22.07.24 12:24 Сейчас в теме
Для начала Хотелось бы понять, почему не вызывается диалог для выбора файла и компьютера
Прикрепленные файлы:
4. usershmuser 22.07.24 12:53 Сейчас в теме
(3) это какая то самописная конфигурация?
Файл должен храниться в самой базе или в каком то файловом хранилище?
5. user1979322 22.07.24 13:04 Сейчас в теме
(4) По сути без разницы, у нас имеется общий диск для всех компьютеров. Вот на нем у будет храниться файл. Как получить путь к файлу разобрался, а теперь хочу понять как его Сохранить в нужной папке и возможность загрузизить из этого файла
6. user1880116 22.07.24 13:11 Сейчас в теме
(3)
Для начала Хотелось бы
А что ты уже сделал для того чтобы диалог вызывался?
9. user1979322 22.07.24 13:22 Сейчас в теме
(6) В свойствах поставил галочку, что то типа "Выбор"
11. user1880116 22.07.24 13:48 Сейчас в теме
(9)
что то типа
Ну вот оно у тебя и работает как-то

У элемента поля имени файла ставишь КнопкаВыбора в "Да" - у тебя начнет работать ПриНачалеВыбора. Ставишь КнопкаОткрытия в "Да" - у тебя начнет работать ПриОткрытии. В обоих обработчиках сбрасываешь стандартную обработку и пишешь там то, что тебе надо... диалого выбора, обработку и т.п.
7. usershmuser 22.07.24 13:18 Сейчас в теме
Я делаю так, средствами win, в твоем случае основную директорию нужно указать сетевой диск/папка и для каждого документа/контрагента сформировать свою папку.
Данный код в форме (команда), выполнять на клиенте
        ОснДир = "E:\Общие документы";
	Кат = ; //Придумываешь правила формирования адреса каталога   
	Прил = "%windir%\explorer.exe ";

//Создание каталога
СоздатьКаталог(ОснДир + "\" + Кат);

        // далее открываешь директорию 
        КомандаСистемы(Прил + ОснДир + "\" + Кат);
Показать
8. user1880116 22.07.24 13:21 Сейчас в теме
(7)
Прил = "%windir%\explorer.exe ";

/me запасся попкорном
10. usershmuser 22.07.24 13:36 Сейчас в теме
(8) как выяснилось - самый простой способ сделать каталогизацию документов на общем диске, создаем каталог и открываем его, соответственно для просмотра файлов некоторым юзерам не обязательно открывать 1с.
Соответственно нужно проверять наличие каталога перед созданием и правильность формирования адреса каталога для предотвращения ошибок, тут только привел основные команды, все остальное - творчество автора. Работает этот метод как часы (с моими юзерами))
12. user1880116 22.07.24 13:49 Сейчас в теме
(10)
простой способ сделать каталогизацию документов на общем диске, создаем каталог и открываем его
Офигеть.
13. user1979322 23.07.24 07:28 Сейчас в теме
По сути мне нужно в управляемой форме
1) выбрать файл (это заявка)
2) сохранить ее в нужную директорию
3) В поле прописать путь к сохраненному файлу

Все это нужно, что бы не путаться в файлах. Получили заявку на почту, сохранили на компьютер, а через 1С в управляемой форме взяли данный файл и сохранили в нужную директорию, с сохранением данного пути, что бы можно было в любой момент, найти заявку
14. user1979322 23.07.24 07:49 Сейчас в теме
Реализовал такой код. Сначала выбираю нужный файл- заявка, которая пришла

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

Все хорошо отрабатывает. Затем я сохраняю этот файл, в нужное место

&НаКлиенте
Процедура СохранитьФайл(Команда) 
	
Если Объект.ИмяФайла = "" Тогда
	Предупреждение("Не такого договора");
Иначе
	СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Файл"); 
	НачатьПолучениеФайлаССервера(СсылкаНаФайлВИБ, Объект.ИмяФайла);  
	КонецЕсли
	    
КонецПроцедуры      
Показать



НачатьПолучениеФайлаССервера Данная процедура отрабатывает, а потом ошибка

======================ОШИБКА===========================

Ошибка при вызове метода контекста (ПолучитьФайл)
{Документ.ЗаявкаНаГальваническиеПокрытия.Форма.ФормаДокумента.Форма(1129)}: ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайла);
по причине:
Ошибка при выполнении файловой операции '/e1cib/data/Документ.ЗаявкаНаГальваническиеПокрытия.Файл?ref=99db005056a7852111ef44aa1ddb1122'. Значение данного типа невозможно преобразовать для передачи как файл. (Неопределено)
15. usershmuser 23.07.24 09:04 Сейчас в теме
(14) я тебе предложил самый простой вариант создания директории и открытия проводника.
В твоем случае получается ты пытаешся это сделать силами самой 1с и её ресурсами, проганяя файл через временное хранилище (темп), что противоречит задаче из (13).
Вот простой пример открытия директорий
КомандаСистемы("%windir%\explorer.exe С:\Нужная папка");
16. user1979322 23.07.24 09:17 Сейчас в теме
(15) Этот способ не подходит, потому что нужно в форме взять файл и сохранить в нужном месте, с сохранением пути к файлу, а у вас происходит конвертация и толку от этого. Я еще раз напишу. Приходит заявка, и эту заявку ПРОСТОЙ пользователь должен сохранить в нужное место, и в форме получить доступ к этому файлу в любое время
Прикрепленные файлы:
17. usershmuser 23.07.24 09:33 Сейчас в теме
(16) у тебя какая ОС? у меня в вин10 и сервер2019 эта команда открывает проводник.
КомандаСистемы() выполняет виндовые команды. В "Выполнить" (win + R) запусти эту команду (%windir%\explorer.exe) и проверь что открывается. В (15) С:\Нужная папка - это пример пути, тебе нужно создать эту папку или указать существующую, эта команда только открывает папку, а не создает.
СоздатьКаталог() - создает каталог!
18. user1979322 23.07.24 09:50 Сейчас в теме
(17) Спасибо, но этот совет не подходит
19. usershmuser 23.07.24 10:06 Сейчас в теме
(18) Тогда, если пойдешь по своему пути - кури как работать с файлами и смотри как реализовано в типовых конфигурациях
20. starik-2005 3073 23.07.24 10:33 Сейчас в теме
Аффтор. походу, хочет прикреплять файл к документу.
Для этого в 1Сах есть подсистема работы с файлами.
Там есть два подхода:
1. Справочник с именем "ИмяОбъектаПрикрепленныеФайлы". Такой справочник создается копированием любого другого такого же справочника и изменением его имени. Ну и в тип владельца надо прописать нужный документ.
2. Можно просто добавить в определяемый тип с файлами тип докумнета, к которому будет прикрепляться файл. Ну и еще пару-тройку моментов - об этом в документации к подсистеме неплохо так прописано.

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

Ну и для информации: файлы в подсистеме могут храниться по разному, например, в базе, в томах на диске (в папках), в СУБД. Это все настраивается в пользовательском интерфейсе.
23. _f_d_v_ 23.07.24 11:58 Сейчас в теме
(20) Да, согласен.
Тоже не понимаю, зачем все эти сложности с сохранением файлов под конкретный тип операционной системы, если постановка задачи вполне позволяет в большинстве типовых конфигурациях в администрировании указать что сохранять файлы на диск, указать куда и сохранять файл штатными средствами 1с. Даже ничего программировать не нужно и работает гарантированно на любой операционке. Разве что это не типовая конфигурация, а самопальная и подключить БСП сложнее чем писать код самому.
21. user1979322 23.07.24 11:29 Сейчас в теме
Все сделал, файл копируется в нужное место, с нужным именем. Ошибка была из за того что не ЗАПИСЫВАЛ, после загрузки.

Но остался вопрос по Процедуре НачатьПолучениеФайлаССервера(СсылкаНаФайлВИБ, Объект.ИмяФайла);
Как ни будь можно задать заранее путь к директории для Сохранения а для Загрузки другую директорию, а то сохраняется последняя выбранная директория.
22. user1979322 23.07.24 11:42 Сейчас в теме
Или хотя бы получить путь куда сохранился файл
24. user1979322 24.07.24 12:15 Сейчас в теме
Выше описанный метод не получает получить в коде место сохранения файла, стал искать другие варианты на https://infostart.ru/1c/tools/892130/ нашел код

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

    Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
        УстановитьРасширениеРаботыСФайлами();
    КонецЕсли;

    Адрес = "";
    НачальноеИмяФайла = "";
    ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьЗавершение", ЭтаФорма);
    НачатьПомещениеФайла(ОписаниеОповещения, Адрес, НачальноеИмяФайла, Истина, УникальныйИдентификатор);
	
КонецПроцедуры

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

    Файл = Новый Файл(ВыбранныйФайл);
    Объект.Имяфайла = Файл.ИмяБезРасширения;
    Объект.РасшриениеФайла = Файл.Расширение;
    Объект.Наименование = Файл.ИмяБезРасширения;
    // для записи в реквизит с типом хранилище значения
    АдресЗагруженногоФайла = Адрес;
			
КонецПроцедуры
//У нас есть адрес файла на сервере но нет доступа к реквизиту с типом "ХранилищеЗначений" на ////клиенте.
//Для записи в этот реквизит перед записью на сервере получим файл из временного хранилище и //положим в реквизит.
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
    Если ЭтоАдресВременногоХранилища(АдресЗагруженногоФайла) Тогда
		
         ЗагруженныйФайл = ПолучитьИзВременногоХранилища(АдресЗагруженногоФайла);
         ЭлементХранилища = Новый ХранилищеЗначения(ЗагруженныйФайл);
         ТекущийОбъект.Файл = ЭлементХранилища;
		
    КонецЕсли;
	
КонецПроцедуры
//Загрузка файла в базу данных готова.
//Концепция выгрузки с сервера на клиента следующая:
//1. Файл достаем с реквизита и ложим во временное хранилище
//2. Передаем с сервера на клиент адрес
//3. Сохраняем файл на клиенте
//Для работы с файлами на клиенте нужно получить от пользователя разрешение на работу с его //////файловой системой.
//Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
//    УстановитьРасширениеРаботыСФайлами();
//КонецЕсли;
//На сервере готовим метод который вытащит файл из реквизита и положит во временное хранилще
&НаСервере
Функция ПоместитьШаблонВоВременноеХранилище()
	
    Реквизит = РеквизитФормыВЗначение("Объект");
    ДвоичныйФайл = Реквизит.Файл.Получить();
    Адрес = ПоместитьВоВременноеХранилище(ДвоичныйФайл, УникальныйИдентификатор);
	
    возврат Адрес;
	
КонецФункции
//Используем типовой метод "НачатьПолучениеФайлов" для передачи файла с сервера на клиента.
//В него необходимо передать массив получаемых файлов.
//В этом массиве необходимо указать адреса нахождения файлов на сервере или адреса временных //хранилищ файлов.
//Во время работы файлы будут загружены по этим адресам и положены в массиве "ПолученныеФайлы" //во временные хранилища.
//На клиенте из этих хранилищ достаем файлы и сохраняем.
&НаКлиенте
Процедура Выгрузить(Команда)
	
    Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
        УстановитьРасширениеРаботыСФайлами();
    КонецЕсли;
	
    ВременнойФайл = ПолучитьИмяВременногоФайла();
    Адрес = ПоместитьШаблонВоВременноеХранилище();

    ИмяСРасширением = Объект.ИмяФайла + Объект.РасшриениеФайла;
	
    ОписаниеОповещения = Новый ОписаниеОповещения("ВыгрузитьЗавершение", ЭтаФорма);
    ПолучаемыеФайлы = Новый Массив;
    ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(ИмяСРасширением, Адрес);
    ПолучаемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
	
    ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    ДиалогВыбораФайла.МножественныйВыбор = Ложь;
	
    НачатьПолучениеФайлов(ОписаниеОповещения, ПолучаемыеФайлы, ДиалогВыбораФайла, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузитьЗавершение(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
	
    Если ПолученныеФайлы = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Для Каждого Файл из ПолученныеФайлы Цикл
	    СохраняемыйФайл = ПолучитьИзВременногоХранилища(Файл.Хранение);
        СохраняемыйФайл.Записать(Файл.Имя);
        ОбщегоНазначенияКлиент.ВывестиСообщение("Сохранен файл " + Файл.Имя);
    КонецЦикла;
			
КонецПроцедуры

Показать


Но здесь процедура НачатьПолучениеФайловССервера(ПолучаемыеФайлы) выдает ошибку

Ошибка при выполнении файловой операции '/e1cib/tempstorage/322856be-836b-48bc-88ee-def84deeeae7?seanceId=ZjkzNmY0NzEtODljMi00YmU3LWExNWMtYzYyNTUxNzhlMjIzzyH­kS2cO90a771MFV7DVxQAAAAA'. Значение данного типа невозможно преобразовать для передачи как файл. (Неопределено)

Хотя все файлы загружены
Оставьте свое сообщение

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