Передача таблицы значений с сервера на клиент

Назад в Статьи

Передача таблицы значений с сервера на клиент

Практика программирования на платформах 7.7, 8.0, 8.1 и 8.2 (обычные формы) приучила многих из нас к широкому применению объектов ТаблицаЗначений. При переводе старых разработок на управляемые форы регулярно встает вопрос изменения алгоритмов из-за невозможности использования их на стороне клиента

Могу предложить способ, как достаточно легко обойти часть ограничений

Несмотря на то,что то для объекта ТаблицаЗначений определена Доступность: “Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). “, известно  – “может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: ValueTable”

Используем возможность сериализации. На сервере таблицу значений опишем, получим соответствующий ей XML, передадим его как строку (или файл) на клиента, там заполним данные (почти так же как заполняли их в старых приложениях, в обычных формах), вернем на сервер и “в одно касание” получим обратно таблицу значений через СериализаторXDTO

Схема работы

1. В процедуре “НаСервере” создаем пустую таблицу значений нужной нам структуры

ТаблицаЗагрузки = Новый ТаблицаЗначений;
...
ТаблицаЗагрузки.Колонки.Добавить(...);
...

2. Сериализуем ее в XDTO и полученный XML возвращаем на клиента

ОбъектТаблицы = СериализаторXDTO.ЗаписатьXDTO(ТаблицаЗагрузки);

ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку(); // запись в строку
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектТаблицы);
ДанныеXML = ЗаписьXML.Закрыть(); // документ готов!

3. “НаКлиенте” работаем с XML – по полученному с сервера XML (шаблону) формируем новый xml :

3.1 Шапка (заголовок и описания столбцов) та же

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку(); // запись в строку

Пока ЧтениеXML.Прочитать() Цикл 
Если ЧтениеXML.Имя = "ValueTable" И ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Прервать;
КонецЕсли; 
Если ЧтениеXML.Имя = "row" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Прервать;
КонецЕсли; 

ЗаписьXML.ЗаписатьТекущий(ЧтениеXML);
КонецЦикла;

3.2 В цикле заполняем данные строк таблицы 

Для .... Цикл //по строкам
 
ЗаписьXML.ЗаписатьНачалоЭлемента("row");

Для ... Цикл //по колонкам

Значение = .... ;

СериализаторXDTO.ЗаписатьXML(
ЗаписьXML, Значение, "Value", "http://www.w3.org/2001/XMLSchema-instance",
НазначениеТипаXML.Явное);

КонецЦикла;

ЗаписьXML.ЗаписатьКонецЭлемента();

КонецЦикла;

3.3 Завершаем запись XML c данными

ЗаписьXML.ЗаписатьКонецЭлемента(); //ValueTable

ЧтениеXML.Закрыть();

СтрокаXML = ЗаписьXML.Закрыть(); // документ готов!

3.4 корректируем структуру XML (к моему большому сожалению, иначе пока не получилось )

СтрокаXML = СтрЗаменить(СтрокаXML, "xsi:Value", "Value");

Может быть, кто-нибудь подскажет, как без этого обойтись и заставить СериализаторXDTO.ЗаписатьXML сразу создавать записи вида 

<Value xsi:type=”xs:string”>1</Value>

в то время как сейчас 1С мне возвращает 

<xsi:Value xsi:type=”xs:string”>1</xsi:Value>

что потом не может быть прочитано в XDTO 

4. Полученный таким образом XML передаем на сервер и там получаем из него требуемую таблицу значений

&НаСервере
Процедура ЗагрузитьНаСервере(СтрокаXML)

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

Поделиться этой записью

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Назад в Статьи