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

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) Вы где-то схитрили. :)
Метод "ЗначениеИзСтрокиВнутр" не доступен на клиенте в управляемых формах. Равно как и "ТаблицаЗначений".
9. BARDER 37 21.02.19 11:05 Сейчас в теме
(8) у меня работает, и довольно хорошо
Единственное только с толстым клиентом работает
11. signum2009 1026 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 1026 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 185 21.02.19 21:53 Сейчас в теме
Вообще смотрите как сделано в типовых УТ, по заполнению шаблонов, на основе WORD. Там идет запрос на сервер, получают структуру данных. таблицы передаются массивом структур. В БСП есть функция в обменданнымиСервер: ТаблицаВМассивСтруктур


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

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)