Версия для печати темы (https://pro1c.org.ua/index.php?s=3cfc74a70c78fa57085c1a91d70ab16b&showtopic=42745)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Не выводится табличный документ на форме

Автор: vet07 16.12.17, 13:42

Платформа 8.3.10.25.61. Конфигурация самописная (на основе БСП). Управляемое приложение.
Задача: Необходимо загрузить данные из эксель и вывести их в табдок на форме.
Решение: файл из клиента через вр.хранилеще передается на сервер. Там обрабатывается и предаеться
на форму клиенту.
Вопрос: Не могу понять почему табдок не передается с сервера на клиента? На сервере он формируется.

    ДополнительныеПараметры = Новый Структура;
    ДополнительныеПараметры.Вставить("РасширениеФайла", РасширениеФайла);
    ДополнительныеПараметры.Вставить("ТабДок", Объект.ДанныеИзФайла);
    
    //Сохранение файла во временное хранилище.
    ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьФайлВХранилище", ЭтаФорма, ДополнительныеПараметры);    
    НачатьПомещениеФайла(ОписаниеОповещения, , ПолноеИмяФайла, Ложь, УникальныйИдентификатор);


Объект.ДанныеИзФайла - это реквизит обработки с типом табдок.
Далее на сервере обрабатывется и формируется табдок. Но через ДополнительныеПараметры.ТабДок не передаеться на клиента.

//Загрузить файл с временного хранилища.
    ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);    
    ИмяФайла = ПолучитьИмяВременногоФайла(ДополнительныеПараметры.РасширениеФайла);
    ФайлВременногоХранилища.Записать(ИмяФайла);
    УдалитьИзВременногоХранилища(АдресВХранилище);
    
    ТабДокДанные = Новый ТабличныйДокумент;
    Попытка
        ТабДокДанные.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
        УдалитьФайлы(ИмяФайла);
    Исключение
        УдалитьФайлы(ИмяФайла);
        Возврат;
    КонецПопытки;
    
    //Преобразование табличного документа в таблицу значений    
    ТабЗначДанные =  ПреобразоватьТабличныйДокументВТаблицуЗначений(ТабДокДанные);
    ПреобразоватьСтрокуВДату(ТабЗначДанные);
    
    ОпределитьКонечнуюДатуЗаявки(ТабЗначДанные);
        
    //Разделение колонки "Работник" на две: "ИФ_Анг" и "ИОФ_Рус".
    //Измененние колонки ИОФ_Рус на ФИО_Рус
    РазделитьФИОРусскийАнглийский(ТабЗначДанные);    
    
    ПроверитьЗагруженныеДанные(ТабЗначДанные);    
    
    УдалитьПустыеКолонки(ТабЗначДанные);
    
    ДополнительныеПараметры.ТабДок.Очистить();    
    ДополнительныеПараметры.ТабДок = ПреобразоватьТаблицуЗначенийВТабличныйДокумент(ТабЗначДанные);

Автор: logist 16.12.17, 16:54

Цитата(vet07 @ 16.12.17, 13:42) *
Но через ДополнительныеПараметры.ТабДок не передаеться на клиента.

А где код который это делает?

Автор: vet07 16.12.17, 17:56

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)
и передается в процедуру ЗагрузитьФайлВХранилище. Но дальше не передается. И как передать на клиента я не пойму?

Автор: logist 16.12.17, 20:20

Зачем вы вообще его гоняете между клиентом и сервером, если он доступен на сервере... Еще, вы сами придумали весь этот код? Просто вы делаете кучу бесполезных вещей, помещаете файл во временное хранилище, затем извлекаете его, сохраняете и потом читаете, не проще ли сразу прочитать файл в табдок? Ну и работать с полем табдока на сервере.

Автор: vet07 17.12.17, 6:50

logist @ Вчера, 20:20 * ,
Изначально я так и думал сделать, но, метод прочитать не работает на тонком клиенте.
Может у кого есть ссылки как прочитать файл в табдок на клиенте?
В на сайтах где я смотрел методика одна - через врем. хранилище.
И все равно интересно, как именно в моем случае табдок передать на клиента?

Автор: vet07 17.12.17, 9:39

Вообщем решил задачку. Проблема состояла в моем непонимании, что форма одновременно формируется как на клиенте
так и на сервере. Поэтому ничего на сервер (ДополнительныеПараметры.ТабДок) передавать не надо.
Может кому пригодится, выложу переделанный код:

&НаКлиенте
Процедура ЗагрузитьДанныеИзФайла(Команда)
        
    Файл = Новый Файл(СокрЛП(Объект.ПутьКФайлу));
    РасширениеФайла =  Файл.Расширение;
    ПолноеИмяФайла = Файл.ПолноеИмя;
    
    Элементы.СформироватьЗаявкиНаОтпуск.Доступность = Ложь;
    
    Если НЕ ЗначениеЗаполнено(ПолноеИмяФайла) Тогда
        Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = НСтр("ru = 'Вы не выбрали файл для загрузки.' "
        + "; en = 'You did not select a file to upload.' ");
        Сообщение.Сообщить();            
        Возврат;
    КонецЕсли;    
        
    //Сохранение файла во временное хранилище.
    ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьФайлВХранилище", ЭтаФорма, РасширениеФайла);    
    НачатьПомещениеФайла(ОписаниеОповещения, , ПолноеИмяФайла, Ложь, УникальныйИдентификатор);
        
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьФайлВХранилище(Результат, Адрес, ВыбранноеИмяФайла, РасширениеФайла) Экспорт
    
    Если Не Результат Тогда
        Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = НСтр("ru = 'Не удалось открыть файл!' "
        + "; en = 'Could not open file!' ");
        Сообщение.Сообщить();                    
        Возврат;    
    КонецЕсли;
    
    ЗагрузитьДанныеИзФайлаНаСервере(Адрес, РасширениеФайла);    
            
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьДанныеИзФайлаНаСервере(Знач АдресВХранилище,РасширениеФайла)            
    
    Объект.ДанныеИзФайла.Очистить();
    
    //Загрузить файл с временного хранилища.
    ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(АдресВХранилище);    
    ИмяФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
    ФайлВременногоХранилища.Записать(ИмяФайла);
    УдалитьИзВременногоХранилища(АдресВХранилище);
    
    ТабДокДанные = Новый ТабличныйДокумент;
    Попытка
        ТабДокДанные.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
        УдалитьФайлы(ИмяФайла);
    Исключение
        УдалитьФайлы(ИмяФайла);
        Возврат;
    КонецПопытки;
    
    //Преобразование табличного документа в таблицу значений    
    ТабЗначДанные =  ПреобразоватьТабличныйДокументВТаблицуЗначений(ТабДокДанные);
    
    Если НЕ ЗначениеЗаполнено(ТабЗначДанные) Тогда
        Сообщение = Новый СообщениеПользователю();
        Сообщение.Текст = НСтр("ru = 'Не удалось загрузить данные!' "
        + "; en = 'Failed to load data!' ");
        Сообщение.Сообщить();
        Возврат;
    КонецЕсли;
    
    ПреобразоватьСтрокуВДату(ТабЗначДанные);
    
    ОпределитьКонечнуюДатуЗаявки(ТабЗначДанные);
        
    //Разделение колонки "Работник" на две: "ИФ_Анг" и "ИОФ_Рус".
    //Измененние колонки ИОФ_Рус на ФИО_Рус
    РазделитьФИОРусскийАнглийский(ТабЗначДанные);    
    
    ПроверитьЗагруженныеДанные(ТабЗначДанные);    
    
    УдалитьПустыеКолонки(ТабЗначДанные);
        
    Объект.ДанныеИзФайла.Вывести(ПреобразоватьТаблицуЗначенийВТабличныйДокумент(ТабЗначДанные));
    Элементы.СформироватьЗаявкиНаОтпуск.Доступность = Истина;
        
КонецПроцедуры

Автор: logist 17.12.17, 17:55

Цитата(vet07 @ 17.12.17, 6:50) *
Может у кого есть ссылки как прочитать файл в табдок на клиенте?

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

Автор: vet07 18.12.17, 8:55

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

Автор: Vofka 18.12.17, 9:34

vet07, код надо вставлять между тегами [ code ] КОД [ /code ], а не [ code ][ /code ] КОД [ code ][ /code ]

Автор: vet07 18.12.17, 10:00

Vofka @ Сегодня, 9:34 * ,
Понял. Исправлюсь. icon_beer17.gif

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua