Как передать Диаграмму через Web-сервисы на планшет?

1. olgita_n 04.09.17 15:31 Сейчас в теме
Всем привет. Помогите разобраться)
Пишу мобильное приложение. Нужно на планшет вывести отчет в виде диаграммы по данным с сервера.
На сервере создаю отчет с типом диаграмма. Затем создаю web-сервис с операцией Получить отчет(), тип возвращаемого значения: Chart.
В модуле web-сервиса прописываю следующий код:

Функция ПолучитьОтчет(Отбор)
	ОтчетТест = Отчеты.Отчет1.Создать();
	ТабличныйДок = Новый ТабличныйДокумент;
	ОтчетТест.СкомпоноватьРезультат(ТабличныйДок);
	Возврат СериализаторXDTO.ЗаписатьXDTO(ТабличныйДок);
КонецФункции

Функция Сериализовать(ОбъектСериализации)
	ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку();
	ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
	Возврат МойXML.Закрыть();
КонецФункции

Функция Десериализовать(XMLСтруктураСериализованногоОбъекта)
	ЧтениеXMLДанных = Новый ЧтениеXML;
	ЧтениеXMLДанных.УстановитьСтроку(XMLСтруктураСериализованногоОбъекта);
	ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
	ЧтениеXMLДанных.Закрыть();
	Возврат ТЗ;
КонецФункции


Затем на клиенте создаю обработку. через которую вызываю отчет. 
На форме создаю реквизит с типом ТабличныйДокумент и кнопку СформироватьОтчет.
В модуле обработки прописываю следующий код:

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

&НаСервере
Процедура СформироватьОтчетНаСервере()
	Попытка 
		ВСОпределение = Новый WSОпределения("http://192.168.56.1/QWertyy/ws/ОбменДанными.1cws?wsdl");
		ВСервис = ВСОпределение.Сервисы.Получить("DataTransfer","ОбменДанными");
		ВТочкаВхода = ВСервис.ТочкиПодключения.Получить("ОбменДаннымиSoap");
		ВОперация = ВТочкаВхода.Интерфейс.Операции.Получить("ПолучитьОтчет");
		
		ДанныеXDTO = ВСОпределение.ФабрикаXDTO.Создать(ВОперация.Параметры.Получить("Отбор").Тип,"");
		
		ВСПрокси = Новый WSПрокси(ВСОпределение,"DataTransfer","ОбменДанными","ОбменДаннымиSoap") ;
		ТабличныйДокументОтвет = ВСПрокси.ПолучитьОтчет(ДанныеXDTO);
		ТабличныйДокумент = СериализаторXDTO.ПрочитатьXDTO(ТабличныйДокументОтвет);	
	Исключение
		Сообщить(ОписаниеОшибки());		
	КонецПопытки;
КонецПроцедуры

Функция Сериализовать(ОбъектСериализации)
	ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку();
	ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
	Возврат МойXML.Закрыть();
КонецФункции

Функция Десериализовать(XMLСтруктураСериализованногоОбъекта)
	ЧтениеXMLДанных = Новый ЧтениеXML;
	ЧтениеXMLДанных.УстановитьСтроку(XMLСтруктураСериализованногоОбъекта);
	ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеXMLДанных);
	ЧтениеXMLДанных.Закрыть();
	Возврат ТЗ;
КонецФункции
Показать



Если запустить клиента с ПК, то диаграмма отображается. А если запускаем на планшете, то выдает ошибку(прикрепила ниже).

P.s: Делала по видео уроку, где в отчете передавали таблицу. В моем случае оставила код без изменений, изменила только в операции web-сервиса тип возвращаемого значения с SpreadsheetDocument на Chart.
Прикрепленные файлы:
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Dream_kz 129 04.09.17 16:09 Сейчас в теме
(1) Почему бы не использовать тип возвращаемого значения - хранилищезначения. Прекрасно сериализуется, внутрь можно помещать все что угодно, в том числе и табличный документ.
olgita_n; +1 Ответить
3. olgita_n 05.09.17 15:36 Сейчас в теме
(2)спасибо за совет. Попробовала сделать через хранилище значений, но что-то не получается(((

В web-сервисе у операции изменила тип на ValueStorage и прописала следующий код:
Функция ПолучитьОтчет(Отбор)
	ОтчетПоРасходам = Отчеты.СчетаНаОплату.Создать();
	ТД = Новый ТабличныйДокумент;
	ХранилищеЗн = Новый ХранилищеЗначения(ТД, Новый СжатиеДанных(9));
	СтрокаДляПередачи = Сериализовать(ХранилищеЗн);
	
	Возврат СтрокаДляПередачи;	
КонецФункции

Функция Сериализовать(ОбъектСериализации)
	ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
	МойXML = Новый ЗаписьXML;
	ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
	Возврат МойXML.Закрыть();
КонецФункции


На клиенте в модуле обработки написала так:
&НаКлиенте                                                   
Процедура СформироватьОтчет(Команда)
	СформироватьОтчетНаСервере();
КонецПроцедуры

&НаСервере
Процедура СформироватьОтчетНаСервере()
	Попытка 
		ВСОпределение = Новый WSОпределения("http://192.168.56.1/day3/ws/ОбменДанными.1cws?wsdl");
		ВСервис = ВСОпределение.Сервисы.Получить("DataTransfer","ОбменДанными");
		ВТочкаВхода = ВСервис.ТочкиПодключения.Получить("ОбменДаннымиSoap");
		ВОперация = ВТочкаВхода.Интерфейс.Операции.Получить("ПолучитьОтчет");
		
		ДанныеXDTO = ВСОпределение.ФабрикаXDTO.Создать(ВОперация.Параметры.Получить("Отбор").Тип,
"");
		
		ВСПрокси = Новый WSПрокси(ВСОпределение,"DataTransfer","ОбменДанными","ОбменДаннымиSoap") ;
		ХранилищеЗн = ВСПрокси.ПолучитьОтчет(ДанныеXDTO);
		Хранилище = Десериализовать(ХранилищеЗн);
		ТД = Хранилище;
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

Функция Десериализовать(XMLСтруктураСериализованногоОбъекта)
	ЧтениеХМЛДанных = Новый ЧтениеXML;
 	ЧтениеХМЛДанных.УстановитьСтроку(XMLСтруктураСериализованногоОбъекта);
	ТЗ = СериализаторXDTO.ПрочитатьXML(ЧтениеХМЛДанных);
	ЧтениеХМЛДанных.Закрыть();
	Возврат ТЗ;
КонецФункции
Показать
Прикрепленные файлы:
4. Dream_kz 129 06.09.17 08:41 Сейчас в теме
(3)
ХранилищеЗн = Новый ХранилищеЗначения(ТД, Новый СжатиеДанных(9));
СтрокаДляПередачи = Сериализовать(ХранилищеЗн);

Возврат СтрокаДляПередачи;

Не так, хранилище надо возвращать, то есть тип передаваемого значения должен быть ValueStorage, не надо его сериализовать, только то, что внутри

Примерно так, на сервере
Возврат Новый ХранилищеЗначения(Сериализовать(Ответ),Новый СжатиеДанных(9));


И так на клиенте:
Возврат Десериализовать(Ответ.Получить());
olgita_n; +1 Ответить
5. olgita_n 06.09.17 09:26 Сейчас в теме
(4) На сервере переделала так:
Функция ПолучитьОтчет(Отбор)
	ОтчетПоРасходам = Отчеты.СчетаНаОплату.Создать();
	ТД = Новый ТабличныйДокумент;
	Возврат Новый ХранилищеЗначения(Сериализовать(ТД),Новый СжатиеДанных(9));
КонецФункции


Функция Сериализовать(ОбъектСериализации)
	ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
	МойXML = Новый ЗаписьXML;
	ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
	Возврат МойXML.Закрыть();
КонецФункции
Показать

Выдает ошибку при сериализации в строчке: ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
Прикрепленные файлы:
6. Dream_kz 129 06.09.17 09:30 Сейчас в теме
(5) Попробуйте так

Функция Сериализовать(ОбъектСериализации) Экспорт
	ДеревоВОбъектеXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектСериализации);
	МойXML = Новый ЗаписьXML;
	МойXML.УстановитьСтроку();
	ФабрикаXDTO.ЗаписатьXML(МойXML, ДеревоВОбъектеXDTO);
	Возврат МойXML.Закрыть();
КонецФункции
olgita_n; +1 Ответить
7. olgita_n 06.09.17 09:46 Сейчас в теме
(6) Спасибо большое, очень помогли) можно еще вопрос) в хранилище значений я передавала табличный документ, в настройках схемы компоновки данных выводила таблицу. Так все работает, но если меняю на вид Диаграмма выдает ошибку(причем, если запускать клиент с ПК, то работает), с чем это может быть связано?
Прикрепленные файлы:
8. Dream_kz 129 06.09.17 10:06 Сейчас в теме
(7) Платформа не понимает тип ТипМаркераДиаграммы вида Авто, попробуйте поставить другой, может это баг платформы, укажите конкретный

(7)
причем, если запускать клиент с ПК, то работает

Тонкий клиент это нечто другое, так тестировать не стоит, все же мобильная платформа со своими "фишками"
9. olgita_n 06.09.17 10:33 Сейчас в теме
(8) Подскажите пожалуйста как это сделать?
10. Dream_kz 129 06.09.17 10:51 Сейчас в теме
(9)
Подскажите пожалуйста как это сделать?

В настройках скд тип маркера посмотреть
11. olgita_n 06.09.17 11:03 Сейчас в теме
(10) Так и не нашла(
Прикрепленные файлы:
12. olgita_n 06.09.17 11:04 Сейчас в теме
(10)
Прикрепленные файлы:
Оставьте свое сообщение

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