Всем привет, поставили задачу по сохранению файла на компьютере с заявкой от клиента, что бы не искать в почте, а можно получить файл из формы. В интернете нашел некоторые решения, но почему то выдают ошибку. Может подскажите рабочий вариант
(4) По сути без разницы, у нас имеется общий диск для всех компьютеров. Вот на нем у будет храниться файл. Как получить путь к файлу разобрался, а теперь хочу понять как его Сохранить в нужной папке и возможность загрузизить из этого файла
У элемента поля имени файла ставишь КнопкаВыбора в "Да" - у тебя начнет работать ПриНачалеВыбора. Ставишь КнопкаОткрытия в "Да" - у тебя начнет работать ПриОткрытии. В обоих обработчиках сбрасываешь стандартную обработку и пишешь там то, что тебе надо... диалого выбора, обработку и т.п.
Я делаю так, средствами win, в твоем случае основную директорию нужно указать сетевой диск/папка и для каждого документа/контрагента сформировать свою папку.
Данный код в форме (команда), выполнять на клиенте
ОснДир = "E:\Общие документы";
Кат = ; //Придумываешь правила формирования адреса каталога
Прил = "%windir%\explorer.exe ";
//Создание каталога
СоздатьКаталог(ОснДир + "\" + Кат);
// далее открываешь директорию
КомандаСистемы(Прил + ОснДир + "\" + Кат);
(8) как выяснилось - самый простой способ сделать каталогизацию документов на общем диске, создаем каталог и открываем его, соответственно для просмотра файлов некоторым юзерам не обязательно открывать 1с.
Соответственно нужно проверять наличие каталога перед созданием и правильность формирования адреса каталога для предотвращения ошибок, тут только привел основные команды, все остальное - творчество автора. Работает этот метод как часы (с моими юзерами))
По сути мне нужно в управляемой форме
1) выбрать файл (это заявка)
2) сохранить ее в нужную директорию
3) В поле прописать путь к сохраненному файлу
Все это нужно, что бы не путаться в файлах. Получили заявку на почту, сохранили на компьютер, а через 1С в управляемой форме взяли данный файл и сохранили в нужную директорию, с сохранением данного пути, что бы можно было в любой момент, найти заявку
Реализовал такой код. Сначала выбираю нужный файл- заявка, которая пришла
&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
//Алена
АдресВХранилище = "";
ВыбранноеИмяФайла = "";
Если ПоместитьФайл(АдресВХранилище, , ВыбранноеИмяФайла, , УникальныйИдентификатор) Тогда
//Если НачатьПомещениеФайлаНаСервер(АдресВХранилище, ПараметрыДиалога, УникальныйИдентификаторФормы) Тогда
Файл = Новый Файл(ВыбранноеИмяФайла);
Имя = Файл.Имя;
СсылкаНаФайлВоВременномХранилище = АдресВХранилище;
Объект.Наименование = Файл.Имя; /// Что это такое
Модифицированность = Истина;
Объект.ИмяФайла = Имя;
КонецЕсли;
КонецПроцедуры
Все хорошо отрабатывает. Затем я сохраняю этот файл, в нужное место
&НаКлиенте
Процедура СохранитьФайл(Команда)
Если Объект.ИмяФайла = "" Тогда
Предупреждение("Не такого договора");
Иначе
СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(Объект.Ссылка, "Файл");
НачатьПолучениеФайлаССервера(СсылкаНаФайлВИБ, Объект.ИмяФайла);
КонецЕсли
КонецПроцедуры
Показать
НачатьПолучениеФайлаССервера Данная процедура отрабатывает, а потом ошибка
Ошибка при вызове метода контекста (ПолучитьФайл)
{Документ.ЗаявкаНаГальваническиеПокрытия.Форма.ФормаДокумента.Форма(1129)}: ПолучитьФайл(СсылкаНаФайлВИБ, Объект.ИмяФайла);
по причине:
Ошибка при выполнении файловой операции '/e1cib/data/Документ.ЗаявкаНаГальваническиеПокрытия.Файл?ref=99db005056a7852111ef44aa1ddb1122'. Значение данного типа невозможно преобразовать для передачи как файл. (Неопределено)
(14) я тебе предложил самый простой вариант создания директории и открытия проводника.
В твоем случае получается ты пытаешся это сделать силами самой 1с и её ресурсами, проганяя файл через временное хранилище (темп), что противоречит задаче из (13).
Вот простой пример открытия директорий
(15) Этот способ не подходит, потому что нужно в форме взять файл и сохранить в нужном месте, с сохранением пути к файлу, а у вас происходит конвертация и толку от этого. Я еще раз напишу. Приходит заявка, и эту заявку ПРОСТОЙ пользователь должен сохранить в нужное место, и в форме получить доступ к этому файлу в любое время
(16) у тебя какая ОС? у меня в вин10 и сервер2019 эта команда открывает проводник.
КомандаСистемы() выполняет виндовые команды. В "Выполнить" (win + R) запусти эту команду (%windir%\explorer.exe) и проверь что открывается. В (15) С:\Нужная папка - это пример пути, тебе нужно создать эту папку или указать существующую, эта команда только открывает папку, а не создает.
СоздатьКаталог() - создает каталог!
Аффтор. походу, хочет прикреплять файл к документу.
Для этого в 1Сах есть подсистема работы с файлами.
Там есть два подхода:
1. Справочник с именем "ИмяОбъектаПрикрепленныеФайлы". Такой справочник создается копированием любого другого такого же справочника и изменением его имени. Ну и в тип владельца надо прописать нужный документ.
2. Можно просто добавить в определяемый тип с файлами тип докумнета, к которому будет прикрепляться файл. Ну и еще пару-тройку моментов - об этом в документации к подсистеме неплохо так прописано.
В итоге на форме нужного документа появляется сцылка на прикрепленные файлы, где можно добавлять и убавлять файлы, открывать их, редактировать, обновлять при закрытии редактируемого файла. В общем вся мощь подсистемы управления файлами с минимальным количеством кликов.
Ну и для информации: файлы в подсистеме могут храниться по разному, например, в базе, в томах на диске (в папках), в СУБД. Это все настраивается в пользовательском интерфейсе.
(20) Да, согласен.
Тоже не понимаю, зачем все эти сложности с сохранением файлов под конкретный тип операционной системы, если постановка задачи вполне позволяет в большинстве типовых конфигурациях в администрировании указать что сохранять файлы на диск, указать куда и сохранять файл штатными средствами 1с. Даже ничего программировать не нужно и работает гарантированно на любой операционке. Разве что это не типовая конфигурация, а самопальная и подключить БСП сложнее чем писать код самому.
Все сделал, файл копируется в нужное место, с нужным именем. Ошибка была из за того что не ЗАПИСЫВАЛ, после загрузки.
Но остался вопрос по Процедуре НачатьПолучениеФайлаССервера(СсылкаНаФайлВИБ, Объект.ИмяФайла);
Как ни будь можно задать заранее путь к директории для Сохранения а для Загрузки другую директорию, а то сохраняется последняя выбранная директория.
Выше описанный метод не получает получить в коде место сохранения файла, стал искать другие варианты на https://infostart.ru/1c/tools/892130/ нашел код
&НаКлиенте
Процедура Загрузить(Команда)
Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
УстановитьРасширениеРаботыСФайлами();
КонецЕсли;
Адрес = "";
НачальноеИмяФайла = "";
ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьЗавершение", ЭтаФорма);
НачатьПомещениеФайла(ОписаниеОповещения, Адрес, НачальноеИмяФайла, Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьЗавершение(Результат, Адрес, ВыбранныйФайл, ДополнительныеПараметры) Экспорт
Если НЕ Результат Тогда
Возврат;
КонецЕсли;
Файл = Новый Файл(ВыбранныйФайл);
Объект.Имяфайла = Файл.ИмяБезРасширения;
Объект.РасшриениеФайла = Файл.Расширение;
Объект.Наименование = Файл.ИмяБезРасширения;
// для записи в реквизит с типом хранилище значения
АдресЗагруженногоФайла = Адрес;
КонецПроцедуры
//У нас есть адрес файла на сервере но нет доступа к реквизиту с типом "ХранилищеЗначений" на ////клиенте.
//Для записи в этот реквизит перед записью на сервере получим файл из временного хранилище и //положим в реквизит.
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если ЭтоАдресВременногоХранилища(АдресЗагруженногоФайла) Тогда
ЗагруженныйФайл = ПолучитьИзВременногоХранилища(АдресЗагруженногоФайла);
ЭлементХранилища = Новый ХранилищеЗначения(ЗагруженныйФайл);
ТекущийОбъект.Файл = ЭлементХранилища;
КонецЕсли;
КонецПроцедуры
//Загрузка файла в базу данных готова.
//Концепция выгрузки с сервера на клиента следующая:
//1. Файл достаем с реквизита и ложим во временное хранилище
//2. Передаем с сервера на клиент адрес
//3. Сохраняем файл на клиенте
//Для работы с файлами на клиенте нужно получить от пользователя разрешение на работу с его //////файловой системой.
//Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
// УстановитьРасширениеРаботыСФайлами();
//КонецЕсли;
//На сервере готовим метод который вытащит файл из реквизита и положит во временное хранилще
&НаСервере
Функция ПоместитьШаблонВоВременноеХранилище()
Реквизит = РеквизитФормыВЗначение("Объект");
ДвоичныйФайл = Реквизит.Файл.Получить();
Адрес = ПоместитьВоВременноеХранилище(ДвоичныйФайл, УникальныйИдентификатор);
возврат Адрес;
КонецФункции
//Используем типовой метод "НачатьПолучениеФайлов" для передачи файла с сервера на клиента.
//В него необходимо передать массив получаемых файлов.
//В этом массиве необходимо указать адреса нахождения файлов на сервере или адреса временных //хранилищ файлов.
//Во время работы файлы будут загружены по этим адресам и положены в массиве "ПолученныеФайлы" //во временные хранилища.
//На клиенте из этих хранилищ достаем файлы и сохраняем.
&НаКлиенте
Процедура Выгрузить(Команда)
Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
УстановитьРасширениеРаботыСФайлами();
КонецЕсли;
ВременнойФайл = ПолучитьИмяВременногоФайла();
Адрес = ПоместитьШаблонВоВременноеХранилище();
ИмяСРасширением = Объект.ИмяФайла + Объект.РасшриениеФайла;
ОписаниеОповещения = Новый ОписаниеОповещения("ВыгрузитьЗавершение", ЭтаФорма);
ПолучаемыеФайлы = Новый Массив;
ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(ИмяСРасширением, Адрес);
ПолучаемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
НачатьПолучениеФайлов(ОписаниеОповещения, ПолучаемыеФайлы, ДиалогВыбораФайла, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьЗавершение(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
Если ПолученныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого Файл из ПолученныеФайлы Цикл
СохраняемыйФайл = ПолучитьИзВременногоХранилища(Файл.Хранение);
СохраняемыйФайл.Записать(Файл.Имя);
ОбщегоНазначенияКлиент.ВывестиСообщение("Сохранен файл " + Файл.Имя);
КонецЦикла;
КонецПроцедуры
Показать
Но здесь процедура НачатьПолучениеФайловССервера(ПолучаемыеФайлы) выдает ошибку
Ошибка при выполнении файловой операции '/e1cib/tempstorage/322856be-836b-48bc-88ee-def84deeeae7?seanceId=ZjkzNmY0NzEtODljMi00YmU3LWExNWMtYzYyNTUxNzhlMjIzzyHkS2cO90a771MFV7DVxQAAAAA'. Значение данного типа невозможно преобразовать для передачи как файл. (Неопределено)