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

29.12.18

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

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

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

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

Молочников Олег 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    130298    704    390    

754

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

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

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

18000 руб.

06.10.2023    9171    26    6    

49

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

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

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

10000 руб.

10.11.2023    5310    14    2    

39

SALE! %

PowerTools

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

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

3600 2880 руб.

14.01.2013    179817    1093    0    

868

OneDebugger - инструмент для отладки кода без использования режима конфигуратора

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

5400 руб.

17.05.2024    5505    10    12    

36

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

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

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

15000 руб.

07.10.2021    15384    3    12    

38

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

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

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

5000 руб.

07.02.2018    100311    240    97    

299

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

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

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

2040 руб.

27.12.2017    28691    4    10    

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


Странно, всегда думал, что программисты это не "тупой" народ (скопировал, вставил), а творческий, да и что там писать, экономия времени минут 5-10 максимум.
10. milkers 2878 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 2878 24.08.18 16:18 Сейчас в теме
(13) Разговор был бы предметнее, если бы вы привели рабочий вариант кода. Если он окажется лучше, я только рад буду использовать Ваш вариант.
19. makfromkz 35 29.06.19 09:16 Сейчас в теме
(15) Присоединяюсь , (13) мог бы показать кошерный код.
Лично я на эту публикацию вышел из яндекса, мне нужно было быстрее решить траблу.
А рассуждать об оптимальности кода можно только после приобретения опыта в этой области и более глубокого изучения. К сожалению на это обычно не бывает времени.
gubanoff; +1 Ответить
17. МимохожийОднако 142 25.08.18 07:47 Сейчас в теме
(13) Сбрось сюда примерчик
23. daddy86 10.01.21 03:46 Сейчас в теме
(13)где гениальный пример?
16. milkers 2878 24.08.18 17:19 Сейчас в теме
(0) Более укороченный вариант кода, спасибо kadild , через НачатьПомещениеФайлов
22. daddy86 10.01.21 03:46 Сейчас в теме
(16)и где "примерчик"? Не говоря о том, что у автора - "НачатьПомещениеФайлов" используется.
18. shard 280 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 80 25.04.24 07:13 Сейчас в теме
(24) Подскажите пож. как загрузить несколько файлов - пакет. Например из выбранной папки или выбрать помощью ctr ?
31. ssn5810 80 29.04.24 05:10 Сейчас в теме
25. aster-x 14.12.21 18:03 Сейчас в теме
(24) на веб-клиенте, мне кажется, вылетит с ошибкой, ибо там не будет .Файл

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

Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'v':
форма: Элемент
имя: {http://v8.1c.ru/8.2/uobjects}v
Оставьте свое сообщение