Практика программирования на платформах 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);
....
КонецПроцедуры