Из запроса в Таблицу Значений

1. BARDER 37 20.02.19 21:32 Сейчас в теме
Доброго времени суток.

не могу понять в чем косяк:
Вот код:

На клиенте вызываю Функцию
&НаКлиенте
Процедура Сформировать(Команда)

	ТаблицаЗначенийДанные = ПолучитьДанныеВТЗ();

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


Далее на Сервере:
Функция ПолучитьДанныеВТЗ()
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Документ.Дата КАК Дата,
		|	Документ.Номер,
		|	Документ.СуммаОбщая
		|ИЗ
		|	Документ.Документ КАК Документ
		|ГДЕ
		|	Документ.Дата МЕЖДУ &ДатаНач И &ДатаКон
		|
		|УПОРЯДОЧИТЬ ПО
		|	Дата";
	
	Запрос.УстановитьПараметр("ДатаКон", КонецДня(Отчет.ДатаКон));
	Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Отчет.ДатаНач));
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыгруженныеДанные = РезультатЗапроса.Выгрузить();
	
	Возврат ВыгруженныеДанные;
	
	
КонецФункции
Показать


Но после выполнения на сервере и возврате ТЗ выдает ошибку:
{Отчет.МойОтчет.Форма.ФормаОтчета.Форма(100)}: Ошибка при вызове метода контекста (ПолучитьДанныеВТЗ)
		ТаблицаЗначенийДанные = ПолучитьДанныеВТЗ();
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: ret	Форма: Элемент	Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/core}ValueTable'
Показать
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alxarz 31 20.02.19 22:19 Сейчас в теме
(1)
не могу понять в чем косяк:
может, таблицу значений нельзя возвращать с сервера?
Raskad; BARDER; +2
7. BARDER 37 21.02.19 09:59 Сейчас в теме
(6)
А дальше самое интересное что я делаю:

Обрабатываю ТЗ и заношу в Excel который прислал Центробанк, просто ручками очень долго и нудно:

&НаКлиенте
Процедура ЗагрузитьВExcel(Команда)
	
Попытка
		Эксель = Новый COMОбъект("Excel.Application");
Исключение
		Сообщить(ОписаниеОшибки());
		Возврат;
КонецПопытки;	
	    Книга = Эксель.WorkBooks.Open(ПутьКФайлу);
		Лист = Книга.WorkSheets(1);
		ТЗВСтроке = ПолучитьДанныеВТЗ();
	    ТЗ = ЗначениеИзСтрокиВнутр(ТЗВСтроке);
		НомерСтроки = 10;
		Для Каждого Строка Из ТЗ Цикл
			Лист.Cells(НомерСтроки, 2).Value = Строка.Дата;	
			Лист.Cells(НомерСтроки, 3).Value = Строка.Номер;	
			Лист.Cells(НомерСтроки, 4).Value = Строка.Дата;	
			Лист.Cells(НомерСтроки, 5).Value = Строка.Номер;	
			Лист.Cells(НомерСтроки, 6).Value = Строка.СуммаОбщая;	
			Лист.Cells(НомерСтроки, 7).Value = 30;	
			Лист.Cells(НомерСтроки, 9).Value = Строка.ПроцВДень*365;	
			Лист.Cells(НомерСтроки, 8).Value = "Потребительские займы с обеспечением в виде залога иного имущества";	
			
			
			НомерСтроки = НомерСтроки+1;
		КонецЦикла;
		Попытка
			Книга.SaveAs(ПутьКФайлу);
		Исключение
			Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
		КонецПопытки;
		Эксель.Application.Quit();
КонецПроцедуры
Показать
+
8. dhurricane 21.02.19 10:28 Сейчас в теме
(7) Вы где-то схитрили. :)
Метод "ЗначениеИзСтрокиВнутр" не доступен на клиенте в управляемых формах. Равно как и "ТаблицаЗначений".
Release; +1
9. BARDER 37 21.02.19 11:05 Сейчас в теме
(8) у меня работает, и довольно хорошо
Единственное только с толстым клиентом работает
+
11. signum2009 1029 21.02.19 12:26 Сейчас в теме
(9) Потому что на тонком клиенте ТаблицаЗначений не доступна
+
20. herfis 498 21.02.19 14:05 Сейчас в теме
(7) А зачем это делать на клиенте? Можно на сервере, если сервер виндовый. Тогда и таблицу не надо будет передавать.
Если упрешься в медленные поячеечные операции экселя, то есть возможность присваивать ячейки пакетно с помощью COMSafeArray (это безотносительно остального).
Хотя самый кошерный способ - редактировать xlsx напрямую, как xml. Сам не делал, но люди вроде делают и материала на эту тему на инфостарте тоже вроде есть.
+
3. BARDER 37 20.02.19 22:35 Сейчас в теме
Пока тема была на модерции нашел решение:
Передаем с сервера:
ЗначениеВСтрокуВнутр


а затем на клиенте:
ЗначениеИзСтрокиВнутр
+
5. alxarz 31 20.02.19 22:57 Сейчас в теме
(3)
нашел решение:
хорошее решение :)
+
4. BARDER 37 20.02.19 22:38 Сейчас в теме
Если кому интересно будет:

&НаКлиенте
Процедура Сформировать(Команда)

    ТаблицаЗначенийДанные = ЗначениеИзСтрокиВнутр(ПолучитьДанныеВТЗ());

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


&НаСервере
Функция ПолучитьДанныеВТЗ()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Документ.Дата КАК Дата,
        |    Документ.Номер,
        |    Документ.СуммаОбщая
        |ИЗ
        |    Документ.Документ КАК Документ
        |ГДЕ
        |    Документ.Дата МЕЖДУ &ДатаНач И &ДатаКон
        |
        |УПОРЯДОЧИТЬ ПО
        |    Дата";
    
    Запрос.УстановитьПараметр("ДатаКон", КонецДня(Отчет.ДатаКон));
    Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Отчет.ДатаНач));
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыгруженныеДанные = РезультатЗапроса.Выгрузить();
    
    Возврат ЗначениеВСтрокуВнутр(ВыгруженныеДанные);
    
    
КонецФункции
Показать
Туки Туки; acanta; alxarz; +3
6. dhurricane 21.02.19 07:33 Сейчас в теме
(4) Уточните, пожалуйста, а что Вы планируете делать с полученной строкой дальше? Зачем она передается на клиент, если там обработка таблицы не планируется?
+
10. Kovekh 21.02.19 12:22 Сейчас в теме
Избитая же уже тема. Здесь куча уже методов, которые преобразовывают таблицу для передачи с клиента на сервер) Обычно в массив преобразовывают и на клиенте обратно. Но ЗначениеИзСтрокиВнутр тоже не вариант, потому что на тонком клиенте отпадёт всё)
+
15. BARDER 37 21.02.19 12:52 Сейчас в теме
(10)
Массив это беспредел будет, темболее тогда надо передавать несколько переменных массива
+
17. Kovekh 21.02.19 12:59 Сейчас в теме
(15)
Где несколько-то переменных? Таблица преобразуется в массив, массив один возвращается на клиент в количестве одной штуки, судя Вашей формулировке. И Вы если попробуете до создания тем погуглить, то большинство методов как раз на таком способе и основаны)
+
12. signum2009 1029 21.02.19 12:29 Сейчас в теме
Как вариант, создайте таблицу значений как реквизит формы, выгружайте в нее в серверном контексте , а потом используйте в клиентском контексте
graforlow; Raskad; +2
13. Boneman 298 21.02.19 12:37 Сейчас в теме
и нафига такие извраты, в такой простой задаче.
На сервере, вывести в табличный документ построителем отчета эту таблицу значений, или сразу запрос в нем и выполнить,
на клиента вернуть табдок, который просто сохранить в формате экселя.

Никаких ком объектов, и экселей не нужно установленных, работать будет на любом клиенте, хоть в толстом хоть в тонком, да и количество кода меньше будет
+
14. BARDER 37 21.02.19 12:48 Сейчас в теме
(13)
У меня задача состоит в том, что бы открыть документ ексель и его заполнить данными, так что табдок отпадает
+
16. Boneman 298 21.02.19 12:56 Сейчас в теме
(14) ничего не отпадает,
выгружаешь этот файл в формате экселя,
а дальше делаешь ЗапуститьПриложение(ПутькФайлу),
и все, откроется твой файл экселем или опен офисом, смотря что установлено на компе
+
18. BARDER 37 21.02.19 13:45 Сейчас в теме
(16)
Мне нужно изменять файл который прислали, тоесть заполнить ячейки. А сохранять в своем не вариант, там на некоторые поля пароль стоит, ЦБ требует этот же файл заполнять а не самописные, у них там скрытые макросы для выгрузки в Их базу
+
19. Boneman 298 21.02.19 13:51 Сейчас в теме
(18) ну ладно-ладно, убедил.
Задачу решил и ладно.
+
22. Ditron 184 23.02.19 14:54 Сейчас в теме
(18)не пойму в чем проблема выполнить это на сервере, передайте на сервер (при вызове функции ПолучитьДанныеВТЗ) параметром адрес с двоичными данными, сохраните его на сервере как временный файл, запускайте ком объект и делайте с ним что хотите, НО НА СЕРВЕРЕ, после опять в хранилище (возврат адреса результат функции) и сохраняйте его на место откуда взяли на клиенте!
+
21. coollerinc 186 21.02.19 21:53 Сейчас в теме
Вообще смотрите как сделано в типовых УТ, по заполнению шаблонов, на основе WORD. Там идет запрос на сервер, получают структуру данных. таблицы передаются массивом структур. В БСП есть функция в обменданнымиСервер: ТаблицаВМассивСтруктур


Функция ТаблицаВМассивСтруктур(Знач ТаблицаЗначений)
	Результат = Новый Массив;
	
	ИменаКолонок = "";
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		ИменаКолонок = ИменаКолонок + "," + Колонка.Имя;
	КонецЦикла;
	ИменаКолонок = Сред(ИменаКолонок, 2);
	
	Для Каждого Строка Из ТаблицаЗначений Цикл
		СтруктураСтроки = Новый Структура(ИменаКолонок);
		ЗаполнитьЗначенияСвойств(СтруктураСтроки, Строка);
		Результат.Добавить(СтруктураСтроки);
	КонецЦикла;
	
	Возврат Результат;
КонецФункции
Показать
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот