На собеседовании попросили сделать смешную простую задачку. Каюсь, "тупанул не по детски" )))). Часть функций не вспомнил.
Делюсь простым решением, может кому пригодиться.
Условия(самое главное):
1. Клиент без EXCEL(это уже как правило сейчас);
2. Никто не запрещает трафик на сервер (раньше был ЗАПРЕЩЁН(!) трафик на сервер без необходимости в любых тестах).
&НаСервереБезКонтекста
Функция ПолучитьВерсиюБСП()
Возврат СтандартныеПодсистемыСервер.ВерсияБиблиотеки();
КонецФункции
&НаКлиенте
Процедура Загрузить(Команда)
Попытка
Версия = ПолучитьВерсиюБСП();
// БСП можно оценить версию
ПараметрыДиалога = Новый Структура;
ПараметрыДиалога.Вставить("Заголовок", НСтр("ru = 'Выберите файл XLSX'"));
ПараметрыДиалога.Вставить("Фильтр", НСтр("ru='Файл XML (*.XLSX)|*.XLSX'"));
Оповещение = Новый ОписаниеОповещения("ЗагрузитьФайлЗавершениеБСП", ЭтотОбъект);
ОбменДаннымиКлиент.ВыбратьИПередатьФайлНаСервер(Оповещение, ПараметрыДиалога, УникальныйИдентификатор);
Исключение
// без БСП
// Описание процедуры, которая будет вызвана после закрытия окна выбора файла
ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект);
// Описание диалога выбора файла
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок ="Выбитите файл";
Диалог.МножественныйВыбор=Ложь;
Диалог.Фильтр = "Файл XLS (*.xlsx)|*.xlsx";//НСтр("ru=’Файл XLS (*.xlsx)|*.xlsx'");
// Начало помещение файла из файловой системы во временное хранилище
НачатьПомещениеФайла(ОписаниеОповещения, , Диалог, Истина, УникальныйИдентификатор);
КонецПОпытки;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлЗавершениеБСП(Знач РезультатПомещенияФайлов, Знач ДополнительныеПараметры) Экспорт
Адрес = РезультатПомещенияФайлов.Хранение;
ТекстОшибки = РезультатПомещенияФайлов.ОписаниеОшибки;
ИмяВыбранногоФайла = РезультатПомещенияФайлов.Имя;
Если ПустаяСтрока(ТекстОшибки) И ПустаяСтрока(Адрес) Тогда
ТекстОшибки = НСтр("ru = 'Ошибка передачи файла на сервер'");
КонецЕсли;
Если НЕ ПустаяСтрока(ТекстОшибки) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
Возврат;
КонецЕсли;
ВыполнитьЗагрузкуНаСервере(Адрес);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
// Файл выбран
ВыполнитьЗагрузкуНаСервере(Адрес);
Иначе
// Пользователь отказался от выбора файла
Сообщить("Файл не был выбран");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВыполнитьЗагрузкуНаСервере(Адрес)
// Получение данных из временного хранилища
Данные = ПолучитьИзВременногоХранилища(Адрес);
// Получение имени временного файла
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
// Сохранение данных во временный файл
Данные.Записать(ИмяВременногоФайла);
// Тело - Табличный документ на форме
Тело.Прочитать(ИмяВременногоФайла);
// Обработка файла…
// Хорошим тоном будет удалить временный файл
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Показать