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

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.

 

См. также

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

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

12000 руб.

02.09.2020    172319    964    403    

925

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

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

8400 руб.

20.08.2024    14832    109    46    

108

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

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

22200 руб.

06.10.2023    17408    44    15    

75

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

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

9360 руб.

17.05.2024    27432    96    48    

139

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

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

15000 руб.

10.11.2023    11989    45    33    

67

SALE! %

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

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

4800 3840 руб.

14.01.2013    191452    1153    0    

920

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

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

20000 руб.

07.10.2021    18137    7    32    

42

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1189    2    0    

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


Странно, всегда думал, что программисты это не "тупой" народ (скопировал, вставил), а творческий, да и что там писать, экономия времени минут 5-10 максимум.
10. milkers 2953 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 2953 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 2953 24.08.18 17:19 Сейчас в теме
(0) Более укороченный вариант кода, спасибо kadild , через НачатьПомещениеФайлов
22. daddy86 10.01.21 03:46 Сейчас в теме
(16)и где "примерчик"? Не говоря о том, что у автора - "НачатьПомещениеФайлов" используется.
18. shard 282 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
Оставьте свое сообщение