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

29.12.18

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Передача файла с клиента на сервер и с сервера на клиент. Управляемые формы:
.epf 7,91Kb
50
50 Скачать (1 SM) Купить за 1 850 руб.

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

 

См. также

SALE! %

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

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

12000 10000 руб.

02.09.2020    163162    902    401    

880

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    9387    73    32    

83

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

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

22200 руб.

06.10.2023    15972    39    8    

75

SALE! %

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

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

15000 10000 руб.

10.11.2023    10870    40    27    

66

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

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

9360 руб.

17.05.2024    24324    73    45    

122

SALE! %

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

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

4800 3840 руб.

14.01.2013    189082    1144    0    

915

SALE! %

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

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

20000 15000 руб.

07.10.2021    17688    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

2220 руб.

21.02.2023    8008    8    36    

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


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

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

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

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