Имя: Пароль:
1C
1С v8
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
,
0 yyyuuu
 
29.10.18
02:52
Здравствуйте, уже перепробовал все. Сделал все что можно, и через временное храненилище и через массив да через все что угодно. Не работает все ровно ошибка.

{ВнешняяОбработка.ЗагрузкаЭлектроныхАдресовИзЭксель.Форма.Форма.Форма(64)}: Ошибка при вызове метода контекста (ПрочитатьЛистExcel)
    ТЗ = ПрочитатьЛистExcel(Объект.Поле);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: param    Форма: Элемент    Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTable'
1 yyyuuu
 
29.10.18
02:53
Файловая база.

Сам код


Функция ПрочитатьЛистExcel(Адрес, ТЗ = Неопределено, НомерЛиста = 1, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт
      
      ExcelApplication = Новый COMObject("Excel.Application");
      ФайлЭксель = ExcelApplication.WorkBooks.Open(Адрес);
      ЛистЭксель = ФайлЭксель.Sheets(НомерЛиста);
      
      Если ВсегоСтрок = 0 Тогда
          ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
      КонецЕсли;
      Если ВсегоКолонок = 0 Тогда
          ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
      КонецЕсли;
      Если ТЗ = Неопределено Тогда
          ТЗ =  Новый ТаблицаЗначений;
          Для Счетчик = 1 По ВсегоКолонок Цикл
              ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
          КонецЦикла;
      КонецЕсли;
      
      Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
          НоваяСтрока = ТЗ.Добавить();
      КонецЦикла;
      
      Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
      Данные = Область.Value.Выгрузить();
      
      Для Счетчик = 0 По ВсегоКолонок-1 Цикл
          ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
      КонецЦикла;
      
      ExcelApplication.DisplayAlerts = 0;
      
      ExcelApplication.Quit();
      ExcelApplication = Неопределено;
      
      //Возврат ТЗ;
      АдресХранилища = ПоместитьВоВременноеХранилище(ТЗ,УникальныйИдентификатор);
      ПротоколПереноса = ПолучитьИзВременногоХранилища(АдресХранилища);
      //Возврат ПротоколПереноса;
      //
      Адрес = ПоместитьВоВременноеХранилище(ТЗ ,Новый УникальныйИдентификатор);
      ЭтаФорма.Реквизит1 = Адрес;
      //Возврат
      ТекстТЗ = ЗначениеВСтрокуВнутр(ТЗ);
      ТаблицаЗначений = ЗначениеИзСтрокиВнутр(ТекстТЗ);
     //
КонецФункции

&НаКлиенте
Процедура ВыборФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    //
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберете excel - файл";
    Диалог.ПолноеИмяФайла = "C:\Users\Nikita.Vasilev\Documents\Эксель электронная почта";
    Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";
    //
    Если Диалог.Выбрать() Тогда
        //
        Объект.Поле = Диалог.ПолноеИмяФайла;
        //
    КонецЕсли;
    //
    ТЗ = ПрочитатьЛистExcel(Объект.Поле);
    //
    Данные = ПолучитьИзВременногоХранилища(ЭтаФорма.Реквизит1);
    Сообщить(ЭтаФорма.Реквизит1);
        
КонецПроцедуры
2 H A D G E H O G s
 
29.10.18
03:02
Функция ПрочитатьЛистExcel(Адрес, ТЗ = Неопределено, НомерЛиста = 1, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт

заменить на

Функция ПрочитатьЛистExcel(Адрес, Знач ТЗ = Неопределено, НомерЛиста = 1, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт
3 yyyuuu
 
29.10.18
03:09
О, немного продвинулся дальше. Спасибо, помогло. Буду теперь дальше разбираться)
4 yyyuuu
 
01.11.18
03:07
Поменял на Знач и в Массив. Кому поможет забирайте работает на файловом варианте.

Массив = Новый Массив();
      СтруктураСтрокой = "";
      НужнаЗапятая = Ложь;
      //
      Для Каждого Колонка Из ТЗ.Колонки Цикл
        //  
        Если НужнаЗапятая Тогда
            //
            СтруктураСтрокой = СтруктураСтрокой + ",";
            //
        КонецЕсли;
        //
        СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
        НужнаЗапятая = Истина;
      //    
      КонецЦикла;
      //
      Для Каждого Строка Из ТЗ Цикл
        //  
        НоваяСтрока = Новый Структура(СтруктураСтрокой);
        ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
        Массив.Добавить(НоваяСтрока);
        //
    КонецЦикла;
    //
    Возврат Массив;
5 H A D G E H O G s
 
01.11.18
04:07
(4) Откройте для себя магию белого.
Блин.
Магию общих модулей типовых конфигураций общего назначения.

ТаблицаЗначенийВМассивСтруктур() вроде функция зовётся.
6 hhhh
 
01.11.18
06:04
(5) Достаточно просто сделать реквизит формы типа ТЗ

Это будет массив структур

А РеквизитФормыВЗначение("ТЗ") : это будет таблица значений
7 yyyuuu
 
02.11.18
04:00
(5) у меня все пока костылями)))
8 yyyuuu
 
02.11.18
04:00
(6)
Ты предлагаешь на форме создать ТЗ и в нее все передать?
9 Chameleon1980
 
02.11.18
04:58
(3) а смысл то понял?
10 yyyuuu
 
02.11.18
05:30
(9) Таблицу значений передать с сервака на клиент запрщенно. Понял(
11 yyyuuu
 
02.11.18
07:53
А почему такое интересное поведение нет)
12 Cyberhawk
 
02.11.18
07:58
Значит не понял
13 yyyuuu
 
02.11.18
08:07
Смотря что понять надо было). Я если честно запутался в вопросе.
Я понял что нельзя передавать таблицу значений, ну запрщенно 1с.
Но можно передать массив.
Почему (2). улучшило общую ситуацию не понял
14 hhhh
 
02.11.18
08:13
(8) я предлагаю создать реквизит формы ТЗ и ничего никуда не передавать. С этим реквизитом можно спокойно работать и на клиенте и на сервере.
15 Cyberhawk
 
02.11.18
09:35
"Почему (2). улучшило общую ситуацию не понял" // Ну так визуально отличия видишь?
16 yyyuuu
 
02.11.18
10:07
(14) что создал просто реквизит и он сам понял, что туда тз мою надо пихать)?
17 yyyuuu
 
02.11.18
10:10
(15)
Выгружая ТЗ в массив и возращая или массив или строку, да что угодно. Выдавало ошибку, бла бла бла XTDO сервер клиент, шайтан машина отказывалась делать то что ей приказано.
Поставил знач, пошло поехало. И строка возращалась и массив и все шо угодно.
На серверном варианте все работает без присваиваниея "знач". Почему, если какие то обьяснения будут, Я вообще послушаю их с интересом.
18 yyyuuu
 
08.11.18
03:43
Если  кто нибудь когда нибудь будет читать мои темы и появятся вопросы пишите
https://t.me/Nikitaje
19 H A D G E H O G s
 
08.11.18
03:58
(17) Без ЗНАЧ функция возвращает на Клиент ТаблицуЗначений, созданную тобой на сервере через параметр ТЗ. Если указываем ЗНАЧ - на сервере создается копия переменной ТЗ, с которой работает код на сервере и которая не возвращается на Клиент.
20 yyyuuu
 
08.11.18
04:27
(19) Я что то подобное и думал. Ну это так, для общего развития больше)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший