Платформа 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!' ");
Сообщение.Сообщить();
Возврат;
КонецЕсли;
ЗагрузитьДанныеИзФайлаНаСервере(Адрес, ДополнительныеПараметры);
КонецПроцедуры&НаСервереПроцедура ЗагрузитьДанныеИзФайлаНаСервере(Знач АдресВХранилище,ДополнительныеПараметры)//Загрузить файл с временного хранилища.
ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);
ИмяФайла = ПолучитьИмяВременногоФайла(ДополнительныеПараметры.РасширениеФайла);
ФайлВременногоХранилища.Записать(ИмяФайла);
УдалитьИзВременногоХранилища(АдресВХранилище);
ТабДокДанные = Новый ТабличныйДокумент;
Попытка
ТабДокДанные.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
УдалитьФайлы(ИмяФайла);
Исключение
УдалитьФайлы(ИмяФайла);
Возврат;
КонецПопытки;
//Преобразование табличного документа в таблицу значений
ТабЗначДанные = ПреобразоватьТабличныйДокументВТаблицуЗначений(ТабДокДанные);
ПреобразоватьСтрокуВДату(ТабЗначДанные);
ОпределитьКонечнуюДатуЗаявки(ТабЗначДанные);
//Разделение колонки "Работник" на две: "ИФ_Анг" и "ИОФ_Рус".//Измененние колонки ИОФ_Рус на ФИО_Рус
РазделитьФИОРусскийАнглийский(ТабЗначДанные);
ПроверитьЗагруженныеДанные(ТабЗначДанные);
УдалитьПустыеКолонки(ТабЗначДанные);
ДополнительныеПараметры.ТабДок.Очистить();
ДополнительныеПараметры.ТабДок = ПреобразоватьТаблицуЗначенийВТабличныйДокумент(ТабЗначДанные);
КонецПроцедуры
В переменной ДополнительныеПараметры.ТабДок табличный документ существует (ДополнительныеПараметры.ТабДок.Области.Количество() = 5) и передается в процедуру ЗагрузитьФайлВХранилище. Но дальше не передается. И как передать на клиента я не пойму?
Про1С-ник
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2539 раз
Рейтинг: 0
Зачем вы вообще его гоняете между клиентом и сервером, если он доступен на сервере... Еще, вы сами придумали весь этот код? Просто вы делаете кучу бесполезных вещей, помещаете файл во временное хранилище, затем извлекаете его, сохраняете и потом читаете, не проще ли сразу прочитать файл в табдок? Ну и работать с полем табдока на сервере.
Личные бесплатные консультации не даю, для этого есть форум!
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С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!