Поиск по блогу

пятница, 13 февраля 2015 г.

Передача файла с клиента на сервер или почему метод Прочитать у табличного документа работает на сервере.

Описание проблемы


Табличный документ - предназначен для формирования печатных форм первичных документов, отчетов, при размещении на форме также может использоваться в качестве средства интерактивного ввода данных. Табличные документы вида "Макет" служат прообразами для других табличных документов. Макеты могут содержать параметры, предназначенные для заполнения конкретными данными. Перед выводом области макета в результирующую таблицу параметрам можно присвоить значения и результаты выражений. Также макеты могут иметь параметры расшифровки, значения которых задаются аналогично параметрам. Расшифровка не влияет на внешний вид результирующей таблицы и используется для создания связанных отчетов, открытия форм или иных действий.
Создал реквизит формы с типом ТабличныйДокумент, вынес на форму сам реквизит и его командную панель и ужаснулся, команда Сохранить есть, а команда Открыть отсутствует.
Стандартные команды табличного документа
Ладно, сам напишу открытие файла табличного документа. Создал команду формы, быстренько накидал код с диалогом выбора файла и вызовом метода табличного документа Прочитать. Запускаю в режиме отладки тонкий клиент (управляемые формы), начинаю тестировать и бац, ошибка! Оказывается метод прочитать доступен только на клиенте.

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

Пишем код для команды, которая выполняется на клиенте


&НаКлиенте
Процедура ЗагрузитьПечатнуюФорму(Команда)

Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Текст = "ru = ""Табличный документ""; en = ""Spreadsheet document""";
Фильтр = НСтр(Текст)+"(*.mxl)|*.mxl";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл табличного документа";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ВыбраныйФайл = ДиалогОткрытияФайла.ПолноеИмяФайла;
АдресВременногоХранилища = "";
ПоместитьФайл(АдресВременногоХранилища, ВыбраныйФайл, , Ложь, ЭтаФорма.УникальныйИдентификатор);
ПечатнаяФормаПрочитать(АдресВременногоХранилища);
КонецЕсли;

КонецПроцедуры


Подготавливаем диалог выбора файла и вызываем функцию ПоместитьФайл. После передаем выполнение кода на сервер вызовом процедуры ЗагрузитьПечатнуюФорму.

Создаем процедуру для вызова метода Прочитать, которая выполняется на сервере


&НаСервере
Процедура ПечатнаяФормаПрочитать(АдресВременногоХранилища)

ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("mxl");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ЭтаФорма.ПечатнаяФорма.Прочитать(ИмяВременногоФайла);

Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
КонецПопытки;

КонецПроцедуры // ПечатнаяФормаПрочитать()


Получаем из временного хранилища двоичные данные файла, сохраняем их во временный файл и вызываем метод Прочитать.

Все просто, единственный минус, это передача файла с клиента на сервер, и чем больше файл и меньше скорость интернета, тем дольше будет выполняться загрузка табличного документа.

Комментариев нет:

Отправить комментарий