Платформа 8.3.10.25.61. Конфигурация самописная (на основе БСП). Управляемое приложение.
Задача: Необходимо загрузить данные из эксель и вывести их в табдок на форме.
Решение: файл из клиента через вр.хранилеще передается на сервер. Там обрабатывается и предаеться
на форму клиенту.
Вопрос: Не могу понять почему табдок не передается с сервера на клиента? На сервере он формируется.
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("РасширениеФайла", РасширениеФайла);
ДополнительныеПараметры.Вставить("ТабДок", Объект.ДанныеИзФайла);
//Сохранение файла во временное хранилище.
ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьФайлВХранилище", ЭтаФорма, ДополнительныеПараметры);
НачатьПомещениеФайла(ОписаниеОповещения, , ПолноеИмяФайла, Ложь, УникальныйИдентификатор);
//Загрузить файл с временного хранилища.
ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);
ИмяФайла = ПолучитьИмяВременногоФайла(ДополнительныеПараметры.РасширениеФайла);
ФайлВременногоХранилища.Записать(ИмяФайла);
УдалитьИзВременногоХранилища(АдресВХранилище);
ТабДокДанные = Новый ТабличныйДокумент;
Попытка
ТабДокДанные.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
УдалитьФайлы(ИмяФайла);
Исключение
УдалитьФайлы(ИмяФайла);
Возврат;
КонецПопытки;
//Преобразование табличного документа в таблицу значений
ТабЗначДанные = ПреобразоватьТабличныйДокументВТаблицуЗначений(ТабДокДанные);
ПреобразоватьСтрокуВДату(ТабЗначДанные);
ОпределитьКонечнуюДатуЗаявки(ТабЗначДанные);
//Разделение колонки "Работник" на две: "ИФ_Анг" и "ИОФ_Рус".
//Измененние колонки ИОФ_Рус на ФИО_Рус
РазделитьФИОРусскийАнглийский(ТабЗначДанные);
ПроверитьЗагруженныеДанные(ТабЗначДанные);
УдалитьПустыеКолонки(ТабЗначДанные);
ДополнительныеПараметры.ТабДок.Очистить();
ДополнительныеПараметры.ТабДок = ПреобразоватьТаблицуЗначенийВТабличныйДокумент(ТабЗначДанные);
logist @ Сегодня, 16:54
,
Выкладываю весь необходимый код (без обработки ТабЗначДанные):
&НаКлиенте
Процедура ЗагрузитьДанныеИзФайла(Команда)
Файл = Новый Файл(СокрЛП(Объект.ПутьКФайлу));
РасширениеФайла = Файл.Расширение;
ПолноеИмяФайла = Файл.ПолноеИмя;
Элементы.СформироватьЗаявкиНаОтпуск.Доступность = Ложь;
Если НЕ ЗначениеЗаполнено(ПолноеИмяФайла) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Вы не выбрали файл для загрузки.' "
+ "; en = 'You did not select a file to upload.' ");
Сообщение.Сообщить();
Возврат;
КонецЕсли;
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("РасширениеФайла", РасширениеФайла);
ДополнительныеПараметры.Вставить("ТабДок", Объект.ДанныеИзФайла);
//Сохранение файла во временное хранилище.
ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьФайлВХранилище", ЭтаФорма, ДополнительныеПараметры);
НачатьПомещениеФайла(ОписаниеОповещения, , ПолноеИмяФайла, Ложь, УникальныйИдентификатор);
//Кол = ДополнительныеПараметры.ТабДок.Области.Количество();
Если ДополнительныеПараметры.ТабДок.Области.Количество() > 0 Тогда
Объект.ДанныеИзФайла = ДополнительныеПараметры.ТабДок;
Элементы.ДанныеИзФайла.Показать();
//ЭтаФорма.ОбновитьОтображениеДанных(Элементы.ДанныеИзФайла);
Иначе
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Не удалось загрузить данные!' "
+ "; en = 'Failed to load data!' ");
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлВХранилище(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Не удалось открыть файл!' "
+ "; en = 'Could not open file!' ");
Сообщение.Сообщить();
Возврат;
КонецЕсли;
ЗагрузитьДанныеИзФайлаНаСервере(Адрес, ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьДанныеИзФайлаНаСервере(Знач АдресВХранилище,ДополнительныеПараметры)
//Загрузить файл с временного хранилища.
ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);
ИмяФайла = ПолучитьИмяВременногоФайла(ДополнительныеПараметры.РасширениеФайла);
ФайлВременногоХранилища.Записать(ИмяФайла);
УдалитьИзВременногоХранилища(АдресВХранилище);
ТабДокДанные = Новый ТабличныйДокумент;
Попытка
ТабДокДанные.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
УдалитьФайлы(ИмяФайла);
Исключение
УдалитьФайлы(ИмяФайла);
Возврат;
КонецПопытки;
//Преобразование табличного документа в таблицу значений
ТабЗначДанные = ПреобразоватьТабличныйДокументВТаблицуЗначений(ТабДокДанные);
ПреобразоватьСтрокуВДату(ТабЗначДанные);
ОпределитьКонечнуюДатуЗаявки(ТабЗначДанные);
//Разделение колонки "Работник" на две: "ИФ_Анг" и "ИОФ_Рус".
//Измененние колонки ИОФ_Рус на ФИО_Рус
РазделитьФИОРусскийАнглийский(ТабЗначДанные);
ПроверитьЗагруженныеДанные(ТабЗначДанные);
УдалитьПустыеКолонки(ТабЗначДанные);
ДополнительныеПараметры.ТабДок.Очистить();
ДополнительныеПараметры.ТабДок = ПреобразоватьТаблицуЗначенийВТабличныйДокумент(ТабЗначДанные);
КонецПроцедуры
Зачем вы вообще его гоняете между клиентом и сервером, если он доступен на сервере... Еще, вы сами придумали весь этот код? Просто вы делаете кучу бесполезных вещей, помещаете файл во временное хранилище, затем извлекаете его, сохраняете и потом читаете, не проще ли сразу прочитать файл в табдок? Ну и работать с полем табдока на сервере.
logist @ Вчера, 20:20
,
Изначально я так и думал сделать, но, метод прочитать не работает на тонком клиенте.
Может у кого есть ссылки как прочитать файл в табдок на клиенте?
В на сайтах где я смотрел методика одна - через врем. хранилище.
И все равно интересно, как именно в моем случае табдок передать на клиента?
Вообщем решил задачку. Проблема состояла в моем непонимании, что форма одновременно формируется как на клиенте
так и на сервере. Поэтому ничего на сервер (ДополнительныеПараметры.ТабДок) передавать не надо.
Может кому пригодится, выложу переделанный код:
&НаКлиенте
Процедура ЗагрузитьДанныеИзФайла(Команда)
Файл = Новый Файл(СокрЛП(Объект.ПутьКФайлу));
РасширениеФайла = Файл.Расширение;
ПолноеИмяФайла = Файл.ПолноеИмя;
Элементы.СформироватьЗаявкиНаОтпуск.Доступность = Ложь;
Если НЕ ЗначениеЗаполнено(ПолноеИмяФайла) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Вы не выбрали файл для загрузки.' "
+ "; en = 'You did not select a file to upload.' ");
Сообщение.Сообщить();
Возврат;
КонецЕсли;
//Сохранение файла во временное хранилище.
ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьФайлВХранилище", ЭтаФорма, РасширениеФайла);
НачатьПомещениеФайла(ОписаниеОповещения, , ПолноеИмяФайла, Ложь, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьФайлВХранилище(Результат, Адрес, ВыбранноеИмяФайла, РасширениеФайла) Экспорт
Если Не Результат Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Не удалось открыть файл!' "
+ "; en = 'Could not open file!' ");
Сообщение.Сообщить();
Возврат;
КонецЕсли;
ЗагрузитьДанныеИзФайлаНаСервере(Адрес, РасширениеФайла);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьДанныеИзФайлаНаСервере(Знач АдресВХранилище,РасширениеФайла)
Объект.ДанныеИзФайла.Очистить();
//Загрузить файл с временного хранилища.
ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);
ИмяФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
ФайлВременногоХранилища.Записать(ИмяФайла);
УдалитьИзВременногоХранилища(АдресВХранилище);
ТабДокДанные = Новый ТабличныйДокумент;
Попытка
ТабДокДанные.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
УдалитьФайлы(ИмяФайла);
Исключение
УдалитьФайлы(ИмяФайла);
Возврат;
КонецПопытки;
//Преобразование табличного документа в таблицу значений
ТабЗначДанные = ПреобразоватьТабличныйДокументВТаблицуЗначений(ТабДокДанные);
Если НЕ ЗначениеЗаполнено(ТабЗначДанные) Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = НСтр("ru = 'Не удалось загрузить данные!' "
+ "; en = 'Failed to load data!' ");
Сообщение.Сообщить();
Возврат;
КонецЕсли;
ПреобразоватьСтрокуВДату(ТабЗначДанные);
ОпределитьКонечнуюДатуЗаявки(ТабЗначДанные);
//Разделение колонки "Работник" на две: "ИФ_Анг" и "ИОФ_Рус".
//Измененние колонки ИОФ_Рус на ФИО_Рус
РазделитьФИОРусскийАнглийский(ТабЗначДанные);
ПроверитьЗагруженныеДанные(ТабЗначДанные);
УдалитьПустыеКолонки(ТабЗначДанные);
Объект.ДанныеИзФайла.Вывести(ПреобразоватьТаблицуЗначенийВТабличныйДокумент(ТабЗначДанные));
Элементы.СформироватьЗаявкиНаОтпуск.Доступность = Истина;
КонецПроцедуры
Сервер может находиться очень далеко, пользователи могут быть из разных стран. Поэтому проще закинуть
файл на сервер.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua