Передача файлов с сервера на клиент

1. user1536836 02.09.21 09:28 Сейчас в теме
Доброго времени суток!
Только начинаю программировать, прошу пожалуйста подсказать в решении проблемы:
Перенос обработки с обычных на УФ,
При выполнении, выдает ошибку:
"Ошибка при выполнении файловой операции D:\Файлы\ПримерВыгрузки\Выгрузка данных водителя 00856 от 05072021-05072021.xls"
Данная ошибка выходит по причине того что запись Табличного документа в файл Excel происходит на сервере, а не на клиенте. у серверной машины нет доступа к ПК клиента(Расшарить папку для сервера нет возможности, так как пользователи работают в домене, а сервер находится не домене).
Возможно как то можно реализовывать через механизм временного хранилища(ПоместитьВоВременноеХранилище(),ПолучитьИзВременногоХранилища()) и двоичные данные, только не знаю как это сделать:(

Примечания по коду:
//представленный код процедуры выполняется на сервере
//переменная Каталог, указывается путь к папке на форме
Результат = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	ТабДок = Новый ТабличныйДокумент;
	
	ОбъектОбработки = РеквизитФормыВЗначение("Объект");	
	Макет = ОбъектОбработки.ПолучитьМакет("МакетВыгрузки");
	ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ОбластьШапка");
	
	ТабДок.Очистить();
	ТабДок.Вывести(ОбластьШапкаТаблицы);
	
	Нач = Строка(Формат(НачалоПериода,"ДФ=дд"))+Строка(Формат(НачалоПериода,"ДФ=ММ"))+Строка(Формат(НачалоПериода,"ДФ=гггг"));
	Кон = Строка(Формат(ОкончаниеПериода,"ДФ=дд"))+Строка(Формат(ОкончаниеПериода,"ДФ=ММ"))+Строка(Формат(ОкончаниеПериода,"ДФ=гггг"));
	
	КолСотрудников = 0;
	
	Пока Результат.Следующий() Цикл 	
		КолСотрудников = КолСотрудников+1;
		ТабДокВодитель = Новый ТабличныйДокумент;		
		ТабДокВодитель.Очистить();
		ТабДокВодитель.Вывести(ОбластьШапкаТаблицы);
		
		Стр = Результат.Выбрать();
		Пока Стр.Следующий() Цикл 
			ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("ОбластьДанные");
			
			ОбластьДетальныхЗаписей.Параметры.Заполнить(Стр);
			ТабДокВодитель.Вывести(ОбластьДетальныхЗаписей);
			
			ТабДок.Вывести(ОбластьДетальныхЗаписей);
		КонецЦикла;
		Путь = ?(Лев(Каталог,СтрДлина(Каталог)-1)="\",Каталог,Каталог+"\")+"Выгрузка данных водителя "+Строка(Результат.Водитель)+" от "+Нач+"-"+Кон+".xls";
		ТабДокВодитель.Вывод=ИспользованиеВывода.Разрешить;
		ТабДокВодитель.Записать(Путь, ТипФайлаТабличногоДокумента.XLS97);
		
	КонецЦикла;
	ВремКаталог = Каталог;
	СоздатьКаталог(ВремКаталог);                                                                    
	Путь = ?(Лев(Каталог,СтрДлина(Каталог)-1)="\",Каталог,Каталог+"\")+"Выгрузка данных водителей "+Нач+"-"+Кон+".xls";
	ТабДок.Вывод=ИспользованиеВывода.Разрешить;
	Если КолСотрудников>1 Тогда 
		ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLS97);
	КонецЕсли;
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Alexei_Siva 203 02.09.21 09:40 Сейчас в теме
Добрый день, нужно записывать временный файл на сервере, помещать его во временное хранилище и передавать на клиент. Так, например, делается в обработке "Универсальный обмен данными в формате XML"
4. Alexei_Siva 203 02.09.21 09:48 Сейчас в теме
(2)Вот пример, если поможет
&НаСервере
Функция ВыгрузитьНаСервере()
	
	...
	АдресФайлаДанных = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ВремИмяФайла), УникальныйИдентификатор);
	УдалитьФайлы(ВремИмяФайла);
	
	Возврат АдресФайлаДанных;
КонецФункции
Показать


&НаКлиенте
Процедура Выгрузить(Команда)
	АдресФайлаДанныхВХранилище = ВыгрузитьНаСервере();
	ДвДанные = ПолучитьИзВременногоХранилища(АдресФайлаДанныхВХранилище); //, ВремИмяФайла
	ДвДанные.Записать(ИмяФайла);
КонецПроцедуры
Nikola_N; bolegb17; user1536836; +3 Ответить
3. Азбука Морзе 106 02.09.21 09:45 Сейчас в теме
Самое простое - сделать реквизит формы типа Табличный документ, который будет доступен как на клиенте так и на сервере и через него осуществлять обмен.
5. user1536836 02.09.21 09:53 Сейчас в теме
(3)Тоже об этом думал, но в цикле могут формироваться несколько табличных документов, что думаю усложнит задачу.
6. Азбука Морзе 106 02.09.21 10:02 Сейчас в теме
(5) усложнит конечно, но проблемы решаются))
7. user1536836 02.09.21 14:17 Сейчас в теме
В общем разобрался, через механизм временного хранилища,
На форме создал 3 реквизита для временных хранилищ с типом "строка", и 3 реквизита уникальных идентификатора с типом "уникальный идентификатор";


Код:
&НаКлиенте

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

		
		ТабДок = ПолучитьИзВременногоХранилища(АдресПутиОбщейВыгрузки);
		ВремКаталог = Каталог;
		СоздатьКаталог(ВремКаталог); 
		Путь = ?(Лев(Каталог,СтрДлина(Каталог)-1)="\",Каталог,Каталог+"\")+"Выгрузка данных водителей "+Нач+"-"+Кон+".xls";
		ТабДок.Вывод=ИспользованиеВывода.Разрешить;
		ТабДок.Записать(Путь, ТипФайлаТабличногоДокумента.XLS97);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПолучитьДанныеДляВыгрузкиНаСервере()
		
	Запрос = Новый Запрос;
        Запрос.Текст = ".....";
	Запрос.Параметры(.....);
	Результат = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	ТабДок = Новый ТабличныйДокумент;
	
	ОбъектОбработки = РеквизитФормыВЗначение("Объект");	
	Макет = ОбъектОбработки.ПолучитьМакет("МакетВыгрузки");
	ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ОбластьШапка");
	
	ТабДок.Очистить();
	ТабДок.Вывести(ОбластьШапкаТаблицы);
	
	Нач = Строка(Формат(НачалоПериода,"ДФ=дд"))+Строка(Формат(НачалоПериода,"ДФ=ММ"))+Строка(Формат(НачалоПериода,"ДФ=гггг"));
	Кон = Строка(Формат(ОкончаниеПериода,"ДФ=дд"))+Строка(Формат(ОкончаниеПериода,"ДФ=ММ"))+Строка(Формат(ОкончаниеПериода,"ДФ=гггг"));
	
	КолСотрудников = 0;
	
	МассивФайлов = Новый Массив;
	МассивНаименованийФайлов = Новый Массив;
	Пока Результат.Следующий() Цикл 	
		КолСотрудников = КолСотрудников+1;
		ТабДокВодитель = Новый ТабличныйДокумент;		
		ТабДокВодитель.Очистить();
		ТабДокВодитель.Вывести(ОбластьШапкаТаблицы);
		
		Стр = Результат.Выбрать();
		Пока Стр.Следующий() Цикл 
			ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("ОбластьДанные");
			
			ОбластьДетальныхЗаписей.Параметры.Заполнить(Стр);
			ТабДокВодитель.Вывести(ОбластьДетальныхЗаписей);
			
			ТабДок.Вывести(ОбластьДетальныхЗаписей);
		КонецЦикла;
		
		Путь = ?(Лев(Каталог,СтрДлина(Каталог)-1)="\",Каталог,Каталог+"\")+"Выгрузка данных водителя "+Строка(Результат.Водитель)+" от "+Нач+"-"+Кон+".xls";
		ИмяФайла = "Выгрузка данных водителя "+Строка(Результат.Водитель)+" от "+Нач+"-"+Кон+".xls";
		
		//Сохраняем ТабДокументы и пути их сохранения в массивы
		МассивФайлов.Добавить(ТабДокВодитель);
		МассивНаименованийФайлов.Добавить(Путь);	
	КонецЦикла;
	
	//Помещаем массивы чтобы получить их позже на клиенте
	ЭтаФорма.АдресХранилищаТабДокументов = ПоместитьВоВременноеХранилище((МассивФайлов), ЭтаФорма.УникальныйИдентификаторФайлов);
	ЭтаФорма.АдресХранилищаНаименованийДокументов = ПоместитьВоВременноеХранилище((МассивНаименованийФайлов), ЭтаФорма.УникальныйИдентификаторНаименований);	
	
	Если КолСотрудников>1 Тогда
		//сохраняем ТабДокумент с водителями во врем.хранилище чтобы позже получить его на клиенте
		ЭтаФорма.АдресПутиОбщейВыгрузки = ПоместитьВоВременноеХранилище(ТабДок, ЭтаФорма.УникальныйИдентификаторОбщейВыгрузки);
	КонецЕсли;
	
КонецПроцедуры
Показать
user1988332; +1 Ответить
8. user1988332 22.02.24 14:52 Сейчас в теме
(7) Спасибо! Кое-что конечно пришлось переделать, но в целом с реквизами на форме и перемещение через хранилище четко отработало !
Оставьте свое сообщение

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