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