Имя: Пароль:
1C
1С v8
Скопировать файл в другую папку. Веб клиент.
0 antihacker
 
15.12.16
09:30
Всем привет !

Не могу на веб клиенте скопировать полученный файл в другой файл.


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

        КлючЗаписиРег = РегистрыСведений.ФайлыДоговоров.Получить(Объект.ДатаИзмененияДоговора,Отбор);

        ДвоичныеДанные = КлючЗаписиРег.ДвоичныеДанныеФайла.Получить();

        
        ВременныйАдресФайла   =  ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
        
        
        возврат ВременныйАдресФайла;

КонецФункции


ФайлИсточник = ВернутьАдресХранилище();
ФайлПриемник = "C:\Users\User1\Documents\888.docx";

КопироватьФайл(ФайлИсточник , ФайлПриемник);


Ошибку показывает.
А вот так

ПолучитьФайл(ВернутьАдресХранилище(),"777.docx", Истина);

Файл открываеться. Вообщем мне нужно получить локальный путь скаченного файла, что бы отправиьт обратно в базу на сервере. Что пропутсил ?
1 Fragster
 
гуру
15.12.16
09:39
если это оба - файлы внутри 1с, то зачем вообще на клиенте что-то делать?
2 Fragster
 
гуру
15.12.16
09:41
ну и да - почему до сих пор не на БСП?
3 antihacker
 
15.12.16
09:58
Нее есть только один файл на сервере. Клиент себе скачивает и редактирует. Просто не знаю как уловить путь к файлу после открытия, что бы при нажатие на кнопку "Закончить редактирование", скинуть измененную версию в базу.
4 Fragster
 
гуру
15.12.16
10:00
печально. слава богу, что в типовых используют БСП, и там нет этих проблем.
5 antihacker
 
15.12.16
10:05
Если честно. мне нужно знать как это делается. БСП конечно хорошо. Но я так и не понял как он это делает.
6 antihacker
 
15.12.16
10:52
Fragster , а ты пробовал разобраться без БСП ?
7 Fragster
 
гуру
15.12.16
10:56
ну так  же писал - без расширения для работы с файлами у тебя ничего про файлы клиентского компьютера узнать не получится
8 Fragster
 
гуру
15.12.16
10:56
я же писал
9 Cyberhawk
 
15.12.16
10:58
Если бы браузеры "из коробки" такое умели, это был бы ахтунг
10 antihacker
 
15.12.16
11:10
Fragster , не очень понял про - "ну так  же писал - без расширения для работы с файлами у тебя ничего про файлы клиентского компьютера узнать не получится"

Чем расширение тут поможет ?

  Cyberhawk, но как то люди делают же. Я не говорю про то, что надо уловить момент закрытия ворд файла.

Провбовал создать чистый файл и скопирвать туда содержимое из сервера. Но метод Файл.Записать() не работает на веб клиенте (с***а). На этои и тормознул. Эххх все работает у меня на тонком клиенте. Вот на веб клиенте проблема. Одни ограничения.
11 Cyberhawk
 
15.12.16
11:24
(10) На веб-клиенте нужно использовать расширение для работы с файлами, просто так браузер тебе не даст этого сделать - только через расширение
12 antihacker
 
15.12.16
11:25
Ой я думал расширение файла.

Ты про это
13 antihacker
 
15.12.16
11:26
#Если ВебКлиент Тогда
            Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда
                    УстановитьРасширениеРаботыСФайлами();
                    ПодключитьРасширениеРаботыСФайлами();
            КонецЕсли;    
        #КонецЕсли
14 Cyberhawk
 
15.12.16
11:29
(13) Ну это подготовка к использованию этого расщирения. Начало верное.
15 antihacker
 
15.12.16
12:12
ОповещениеВыгрузитьФайлНаКлиент = Новый ОписаниеОповещения("ВыгрузитьФайлНаКлиент", ЭтотОбъект);
    
НачатьУстановкуРасширенияРаботыСФайлами(ОповещениеВыгрузитьФайлНаКлиент);



&НаКлиенте

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

    сообщить(Результат);
    сообщить(Адрес);
    
КонецПроцедуры

Но

сообщить(Результат);
сообщить(Адрес);

возвращает пустой резултат
16 antihacker
 
15.12.16
12:42
Синтаксис:

ПолучитьФайл(<Адрес>, <ИмяФайла>, <Интерактивно>)
Параметры:

<Адрес> (обязательный)

Тип: Строка.
Расположение данных во временном хранилище или в информационной базе.
<ИмяФайла> (необязательный)

Тип: Строка.
Путь к файлу, в который будут сохранены данные из информационной базы.
В неинтерактивном режиме необходимо указать значение параметра, иначе будет вызвано исключение.
В интерактивном режиме может быть не задан.
Значение по умолчанию: Пустая строка.
<Интерактивно> (необязательный)

Тип: Булево.
Истина - режим, в котором пользователю показывается диалог, в котором он может выбрать действие с получаемым файлом: запустить его или сохранить по выбранному расположению.
В веб-клиенте параметр должен быть равен Истина. В противном случае будет сгенерировано сообщение об ошибке.
Значение по умолчанию: Истина.
Возвращаемое значение:

Тип: Булево; Неопределено.
Ложь - пользователь отменил операцию сохранения файлов (в интерактивном режиме).
В режиме запуска "Веб-клиент" всегда возвращает Неопределено.
Описание:

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

Доступность:

Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).
Вызов метода выполняет обращение к серверу.

Примечание:

Если используется интерактивный режим, а параметр <ИмяФайла> не указан, то операция открытия файла не доступна.
В веб-клиенте код на встроенном языке продолжает выполнение, не дожидаясь окончания загрузки файла.
Результат выполнения кэшируется в разрезе значений параметров метода. Если данные в файле были изменены, выполняется обращение к серверу.
В интерактивном режиме при открытии полученного файла выполняется проверка наличия приложения, ассоциированного с типом файла. Проверка выполняется по расширению файла. Если подходящее приложение не найдено, то отображается системный диалог выбора приложения для открытия файла. После выбора приложения файл открывается в нем. Отказ от выбора приложения приводит к отмене открытия файла.

ЧТО ОЗНАЧАЕТ - "Если данные в файле были изменены, выполняется обращение к серверу."

Он обратно на сервер скидывает измененные файлы ? Если да, то куда ?
17 antihacker
 
11.01.17
06:12
Оказываеться много слов тут.

Решил вот  так


Как открыть файл для редактирования и обратно скинуть на сервер после редактирования на веб интерфейсе.

Открываем вот так.

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

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


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


Отредактированный файл скидываем в базу вот так

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

                   ПомещаемыеФайлы = Новый Массив;
                   ПомещаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ЛокальныйПутьКФайлу));
                   ПомещенныеФайлы = Новый Массив;
    
                   ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ЭтаФорма.УникальныйИдентификатор);        
    
               СохранитьВерсиюИсполнителя(ПомещенныеФайлы[0].Хранение,ЛокальныйПутьКФайлу,ЗагружаемыйФайл.Размер());
               Объект.ДоговорРедактируеться = Ложь;

           Иначе
              
              сообщить("Редактируемый файл не найден в каталоге !");
              
          КонецЕсли;
    Исключение
              сообщить(ОписаниеОшибки());
    КонецПопытки;
          
КонецПроцедуры

Процедура СохранитьВерсиюИсполнителя(вхВременныйАдрес,вхИмяФайла,вхРазмерФайла)
    
          Если вхВременныйАдрес <> НеОпределено Тогда
              
               //----Ищем в временном хранилище--------------
                  НайденныйФайлВВременномХранилище=РегистрыСведений.ВременноеХранилищеФайлов.СоздатьНаборЗаписей();
               НайденныйФайлВВременномХранилище.Отбор.ВладелецФайла.Установить(Объект.Ссылка);
               НайденныйФайлВВременномХранилище.Прочитать();
              
               Если НайденныйФайлВВременномХранилище.Количество() = 0 Тогда //Если не существует
                                     
                    НовоеИмяФайла = "(V1) " + ОбщиеФункцииСервер.ВернутьИмяФайла(вхИмяФайла);
              
                       ВремяПериода = ТекущаяДата();

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

         КонецЕсли;

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

Таким образом все тут решает один оператор.

Этот - ПоместитьФайлы. Просто надо уметь передавать ему правильный параметр