Передача файла с клиента на сервер и с сервера на клиент. Управляемые формы

29.12.18

Разработка - Инструментарий разработчика

Не нашел в интернете устраивающего меня примера, потому привожу решение.

Скачать исходный код

Наименование Файл Версия Размер
Передача файла с клиента на сервер и с сервера на клиент. Управляемые формы:
.epf 7,91Kb
43
.epf 7,91Kb 43 Скачать

Молочников Олег Spb. 2018.

 

Не нашел в интернете устраивающего меня примера, потому привожу решение.

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

Обратите внимание на тонкость:  НачатьПомещениеФайла выполняется в неинтерактивном режиме, а не запускается при выборе файла. Это позволяет сохранять путь к файлу в настройках формы.

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

&НаКлиенте

Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

               ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

               ДиалогВыбораФайла.Заголовок = "Выберите файл для загрузки";

               ДиалогВыбораФайла.МножественныйВыбор =  Ложь;

               ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина;

               ДиалогВыбораФайла.Расширение = "txt";

               ДиалогВыбораФайла.Фильтр = "Файлы данных с разделителями (*.txt)|*.txt";

               ДиалогВыбораФайла.Показать(Новый ОписаниеОповещения("ПутьКФайлуНачалоВыбораЗавершение", ЭтаФорма, Новый Структура("ДиалогВыбораФайла", ДиалогВыбораФайла)));

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

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

Передача файла на сервер производится при  нажатии кнопки “загрузить данные из файла”:

АдресФайлаВоВременномХранилище-строковая переменная формы, на форму не выведена.

&НаКлиенте

Процедура ЗагрузитьДанныеИзФайла(Команда)

               ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьИПередатьФайлыНаСерверЗавершение", ЭтаФорма);

               НачатьПомещениеФайла(ОписаниеОповещения,,Отчет.ПутьКФайлу,Ложь,УникальныйИдентификатор);

               //  Открываем в немодальном режиме, диалог не нужен.

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

 

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

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

 
&НаСервере
Функция ЗагрузитьДанныеИзФайлаНаСервере(Адрес,ДокументДляЗагрузки,Месяц)
               ПутьКФайлуНаСервере = ПолучитьИмяФайлаСПутемНаСервере(Адрес,"txt"); 
               Т = Новый ТекстовыйДокумент;
               Т.Прочитать(ПутьКФайлуНаСервере);

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

 

 
 

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

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

АдресФайлаВоВременномХранилище-строковая переменная формы, на форму не выведена.

 

&НаКлиенте
Процедура ВыгрузитьДанныеВФайл(Команда)
               ИмяФайлаОбмена="";
               ВыгрузитьНаСервере(ИмяФайлаОбмена);
               
               Если АдресФайлаВоВременномХранилище = "" Тогда
                              Возврат;
               КонецЕсли;
               
               ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект);
               
               ПолучаемыеФайлы = Новый Массив;
               ПолучаемыеФайлы.Добавить(
               Новый ОписаниеПередаваемогоФайла(
               СокрЛП(ИмяФайлаОбмена), // куда сохранять на клиента
               АдресФайлаВоВременномХранилище // адрес в хранилище на сервере
               )
               );
               
               НачатьПолучениеФайлов(ОповещениеОЗавершении,ПолучаемыеФайлы,,Ложь );  // неинтерактивно
               ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Записан файл "+ СокрЛП(ИмяФайлаОбмена));
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПослеПолученияФайлов(ПолученныеФайлы,
    ДополнительныеПараметры) Экспорт
               //Для Каждого Файл Из ПолученныеФайлы Цикл
               //    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Получен " + Файл.Имя + " из " + Файл.Хранение);
               //КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ВыгрузитьНаСервере(ИмяФайлаОбмена)
               ИмяФайлаОбменаНаСервер = ПолучитьИмяВременногоФайла(".txt");            
               ИмяФайлаОбмена=Отчет.ПутьКФайлу;
               
               ФайлОбмена = Новый ТекстовыйДокумент;
               ФайлОбмена.УстановитьТекст(ТекстДок.ПолучитьТекст());
               
               
               ФайлОбмена.Записать(ИмяФайлаОбменаНаСервер, "windows-1251");
               Двоичное=Новый ДвоичныеДанные(ИмяФайлаОбменаНаСервер);
               АдресФайлаВоВременномХранилище=ПоместитьВоВременноеХранилище(Двоичное,ЭтаФорма.УникальныйИдентификатор);               
               Попытка
                               УдалитьФайлы(ИмяФайлаОбменаНаСервер);
               Исключение
                              //ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка удаления временного файла  "+ ИмяФайлаОбменаНаСервер);
               КонецПопытки;
КонецПроцедуры

 

Акция! Вы можете скачать эту разработку в  составе архива всех моих разработок, которые я предлагаю за StartMone, по Специальной  цене//infostart.ru/public/960899/#archive

Обработка с примером гарантированно работает на платформе 8.3 (тестировано на релизе 8.3.10.2580) с любыми конфигурациями только на управляемых формах.

P.S.: Надеюсь, вам понравится эта и другие мои статьи и разработки на //infostart.ru/profile/48714/.

 

Очень жду ваших комментариев  и пожеланий.

 Молочников Олег Spb. 2018.

 

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    126521    685    389    

737

Infostart PrintWizard - создание и редактирование печатных форм в 1С 8.3

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 руб.

06.10.2023    8309    24    6    

45

Infostart УДиФ: Управление данными и формами 1С

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    4673    12    2    

38

SALE! %

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2280 руб.

14.01.2013    178863    1084    0    

862

Бустер Конвертации данных 3 (Infostart Toolkit)

Инструментарий разработчика 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 руб.

07.10.2021    15071    3    12    

37

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99796    239    97    

298

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28401    4    10    

16

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18493    6    8    

40
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Dream_kz 129 20.08.18 19:43 Сейчас в теме
4. milkers 2871 20.08.18 21:36 Сейчас в теме
(1) Я нашел очень много на эту тему, но код меня не устроил. Я уже много лет пользуюсь инфостартом как репозиторием, чтобы можно было быстро как из кубиков собирать код. Из тех кубиков которые были слово "счастье" никак не складывалось. Проще потрать ещё час и все задокументировать, чем потом снова тратить полдня.
3. androgin 20.08.18 21:32 Сейчас в теме
какой треш!!!
Это ж надо так размазать обычное получение файла ))
Hans; YanTsys; +2 Ответить
5. milkers 2871 20.08.18 21:41 Сейчас в теме
(3) Если Вы считаете, что здесь много лишнего, то буду только рад Вашим подсказкам.
6. Diagnostiks 17 21.08.18 11:48 Сейчас в теме
Простую передачу файла на сервер и обратно превратили прям в "никогда такого не было, и вот опять". Очередной велосипед.
7. milkers 2871 21.08.18 12:24 Сейчас в теме
(6) Я бы и сам был бы рад сократить код. К сожалению, нужно учитывать кучу вещей, таких как асинхронное взаимодействие, удаление временных файлов за собой, возможность сохранения имени файла в настройках и т.д. Плюс желательно сделать его легко переносимым из одной обработки в другую, ну и по возможности читаемым. Делал для себя, чтобы разобраться с этим один раз и больше не тратить времени. Еще один строительный кубик в коллекцию, чтобы быстрее писать код. Если понравится кому-то еще я только за.
Еще раз, я не претендую на оригинальность, это просто попытка сэкономить мое и чужое время на банальную в общем то задачу, которая, к моему сожалению, не так то и проста.
12. androgin 21.08.18 19:33 Сейчас в теме
(7) НачатьПомещениеФайлов - тут и асинхрон и временное хранилище и имена файлов и даже можно открыть с помощью диалога и фильтрами расширений
Bolnov; kild; +2 Ответить
8. Xershi 1484 21.08.18 12:30 Сейчас в теме
В вашей статье не учитывается работа на веб клиенте, у меня в заготовках это предусмотрено, так что подумайте над универсальностью!
milkers; Ганс; +2 Ответить
9. Diagnostiks 17 21.08.18 13:04 Сейчас в теме
Делал для себя, чтобы разобраться с этим один раз и больше не тратить времени


Странно, всегда думал, что программисты это не "тупой" народ (скопировал, вставил), а творческий, да и что там писать, экономия времени минут 5-10 максимум.
10. milkers 2871 21.08.18 13:47 Сейчас в теме
(9) Вы абсолютно правы, но чтобы найти время на интересные и творческие моменты, это время надо сэкономить не тратя лишних 15 минут на автоматизацию рутинной операции, которая ещё несколько лет назад до перехода на управляемые формы и асинхронную модель делалась одним движением мышки.
14. kild 89 24.08.18 11:09 Сейчас в теме
(9) Программисты не "тупой", поэтому собирают проект из заготовок. Сидеть творить над каждым функционалом недопустимо дорого, особенно во франчази.
11. Diagnostiks 17 21.08.18 14:10 Сейчас в теме
Отлично. Но тогда все Ваши "шаблоны" кода надо где-то централизовано хранить. А можно сделать проще - шаблоны текста сделать уж тогда.
13. kild 89 24.08.18 10:53 Сейчас в теме
Используйте НачатьПомещениеФайлов и читайте напрямую из двоичных данных без создания временных файлов (8.3.9).
Функционал в пару строк у вас превратился в лапшу с кучей процедур.
В целом хорошо, что делитесь информацией.
15. milkers 2871 24.08.18 16:18 Сейчас в теме
(13) Разговор был бы предметнее, если бы вы привели рабочий вариант кода. Если он окажется лучше, я только рад буду использовать Ваш вариант.
19. makfromkz 35 29.06.19 09:16 Сейчас в теме
(15) Присоединяюсь , (13) мог бы показать кошерный код.
Лично я на эту публикацию вышел из яндекса, мне нужно было быстрее решить траблу.
А рассуждать об оптимальности кода можно только после приобретения опыта в этой области и более глубокого изучения. К сожалению на это обычно не бывает времени.
gubanoff; +1 Ответить
17. МимохожийОднако 141 25.08.18 07:47 Сейчас в теме
(13) Сбрось сюда примерчик
23. daddy86 10.01.21 03:46 Сейчас в теме
(13)где гениальный пример?
16. milkers 2871 24.08.18 17:19 Сейчас в теме
(0) Более укороченный вариант кода, спасибо kadild , через НачатьПомещениеФайлов
22. daddy86 10.01.21 03:46 Сейчас в теме
(16)и где "примерчик"? Не говоря о том, что у автора - "НачатьПомещениеФайлов" используется.
18. shard 279 14.01.19 14:39 Сейчас в теме
хочу дополнить: при чтении табличного документа из файлов xls, xlsx, ods при получении имени временного файла указывать расширение обязательно, иначе будет "Ошибка при выполнении файловой операции"
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
	ДиалогФыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	
	ДиалогФыбораФайла.Фильтр                      = "Файл Excel (*.xls, *.xlsx)|*.xls?";
	ДиалогФыбораФайла.Заголовок                   = "Выберите файл для загрузки данных";
	ДиалогФыбораФайла.ПредварительныйПросмотр     = Ложь;
	ДиалогФыбораФайла.ИндексФильтра               = 0;
	ДиалогФыбораФайла.ПроверятьСуществованиеФайла = Истина;
	
	НачатьПомещениеФайла(Новый ОписаниеОповещения("ВыполнитьЗагрузку",ЭтаФорма),,ДиалогФыбораФайла,истина,УникальныйИдентификатор); 
КонецПроцедуры

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

	Расширение=СтрЗаменить(ВыбранноеИмяФайла,".",Символы.ПС);
	Расширение=СтрПолучитьСтроку(Расширение,СтрЧислоСтрок(Расширение));
	ЗагрузитьНаСервере(Адрес,Расширение); 
	//Сообщить("Завершили");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗагрузитьНаСервере(Знач Адрес,Расширение) 
	ФайлВременногоХранилища=ПолучитьИзВременногоХранилища(Адрес);
	ИмяФайла=ПолучитьИмяВременногоФайла(Расширение);
	ФайлВременногоХранилища.Записать(ИмяФайла);
	УдалитьИзВременногоХранилища(Адрес);
	MXL=Новый ТабличныйДокумент;
	MXL.Прочитать(ИмяФайла);
	УдалитьФайлы(ИмяФайла);
КонецПроцедуры
Показать
Demlan; as7bs; Мах; rbaoi; AlexeyPapanov; +5 Ответить
20. gubanoff 63 06.08.19 16:28 Сейчас в теме
(0) помогло, хороший пример для быстрого старта!
21. YanTsys 12 09.10.20 18:35 Сейчас в теме
Какая большая куча мусора...
Процедура ВыбратьИПередатьФайлыНаСерверЗавершение должна быть экспортной, оповещения не могут работать с локальными процедурами...
24. insurgut 207 04.10.21 18:33 Сейчас в теме
Так как Яндекс постоянно в топе выдает данную тему, оставлю на всякий случай, как с минимальным кодом файл клиента загрузить на сервер.

&НаСервереБезКонтекста
Функция ЗагрузкаФайла(АдресДокументаВХранилище, ИмяФайла)
	ДанныеДокумента = ПолучитьИзВременногоХранилища(АдресДокументаВХранилище);
	ПолноеИмяФайла = "C:\TEMP\" + ИмяФайла;
	Попытка
		ДанныеДокумента.Записать(ПолноеИмяФайла);
		Возврат Истина;
	Исключение
		Возврат Ложь;
	КонецПопытки;
КонецФункции

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

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


P.S. НачатьПомещениеФайлаНаСервер доступен, начиная с версии 8.3.15.
ssn5810; psa247; +2 Ответить
28. ssn5810 79 25.04.24 07:13 Сейчас в теме
(24) Подскажите пож. как загрузить несколько файлов - пакет. Например из выбранной папки или выбрать помощью ctr ?
25. aster-x 14.12.21 18:03 Сейчас в теме
(24) на веб-клиенте, мне кажется, вылетит с ошибкой, ибо там не будет .Файл

в принципе, все что нужно есть в ОписаниеПомещенногоФайла.СсылкаНаФайл, только там Имя сразу с расширением
26. insurgut 207 14.12.21 20:41 Сейчас в теме
(25) ну я под управляемыми формами всегда понимаю, как минимум тонкий клиент. А веб-клиент, ну такое, как им можно постоянно в работе пользоваться я вообще не понимаю.
27. ssn5810 79 25.04.24 07:12 Сейчас в теме
(26)Вопрос, как загрузить несколько файлов - пакет. Например из выбранной папки или выбрать помощью ctr ?
Оставьте свое сообщение