Таблицы значений "&НаКлиенте" в Управляемом приложении

26.09.16

Разработка - Механизмы платформы 1С

Способ обойти ограничения платформы и передать с клиента на сервер таблицу значений. Используются возможности XDTO-сериализации

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

Таблица значений Управляемые формы XDTO XML

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4484    dsdred    53    

71

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5284    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6401    dsdred    36    

111

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18466    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12086    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8804    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6273    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15974    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. nixel 1403 27.09.16 01:06 Сейчас в теме
Чём не устраивает массив структур?
GonziK_KIV; Marat62; A7758735; TreeDogNight; slawanix; sulfur17; Lok`Tar; shard; CherryCold; 7OH; Dementor; Gorus; kirillkr; olbu; +14 Ответить
2. Makushimo 160 27.09.16 05:56 Сейчас в теме
(1) nixel,
Да ладно ))
Это ж прикольно.
только отладить такой код на клиенте трудновато будет.
3. l1ike 27.09.16 09:56 Сейчас в теме
Может быть, кто-нибудь подскажет, как без этого обойтись и заставить СериализаторXDTO.ЗаписатьXML сразу создавать записи вида
<Value xsi:type="xs:string">1</Value>

Попробуйте сериализатору указать либо пустое пространство имен, либо пространство имен по умолчанию
4. Aphanas 92 27.09.16 10:22 Сейчас в теме
Можно сделать еще лучше. Выдернуть схему {http://v8.1c.ru/8.1/data/core} ValueTable из стандартной фабрики, десериализовать XDTO на клиенте и работать нормально как с объектом без всяких ЧтениеXML и ЗаписьXML.
user1050439; swiss-garant; dour-dead; +3 Ответить
5. bulpi 215 27.09.16 11:30 Сейчас в теме
А гланды рвать не пробовали ? :)
6. tatyana_schukina 28.09.16 08:23 Сейчас в теме
8. tarassov 111 28.09.16 08:57 Сейчас в теме
(6) tatyana_schukina,
Это не ссылка! Это имя схемы
7. sulfur17 59 28.09.16 08:39 Сейчас в теме
два раза перечитал, но так и не понял в чем проблема. Таблицы значений между клиентом и сервером передаются через
ТЗСтрокой = ЗначениеВСтрокуВнутр(ТЗ);

и
ТЗ = ЗначениеИзСтрокиВнутр(ТЗСтрокой);

Объясните пожалуйста, зачем вся эта сериализация/десериализация, корректировки, массивы структур и т.д.?

9. Dementor 1015 28.09.16 09:39 Сейчас в теме
(7) sulfur17, не смотря на многолетние уговоры представители 1С держат круговую оборону и отказываются переносить таблицу значений в функциональность клиентской части. Ваше "ЗначениеИзСтрокиВнутр(ТЗСтрокой);" на клиенте просто не будет работать. Из-за этого все стали использовать массив структур (а некоторые структуру массивов, когда не нужно делать обходы ДляКаждого). Автор предлагает альтернативный, хоть и не очень эффективный новых подход. Согласен, что не понятно для чего нужна сериализация, когда можно спокойно работать со строковым внутренним представлением таблицы - структура таких представлений довольно простая и не нужно морочиться с XML.
sulfur17; +1 Ответить
11. Boneman 298 28.09.16 10:53 Сейчас в теме
(7) sulfur17,
Объясните пожалуйста, зачем вся эта сериализация/десериализация, корректировки, массивы структур и т.д.?

СП
Глобальный контекст (Global context)
ЗначениеВСтрокуВнутр (ValueToStringInternal)
Синтаксис:

ЗначениеВСтрокуВнутр(<Значение>)
Параметры:

<Значение> (обязательный)

Тип: Произвольный.
Преобразуемое значение.
Возвращаемое значение:

Тип: Строка.
Системное представление значения в информационной базе.
Описание:

Получает системное строковое представление переданного значения.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Показать

в тонком клиенте, данный метод не работает
swiss-garant; sulfur17; +2 Ответить
10. Boneman 298 28.09.16 10:48 Сейчас в теме
оригинальное решение. Правда в реальной жизни нафиг не нужное,
но, если сильно хочется поизвращаться и усложнить читаемость кода (а иногда это действительно нужно), то вполне можно применить.
За идею +
15. tarassov 111 28.09.16 14:57 Сейчас в теме
12. HanterVol 8 28.09.16 11:27 Сейчас в теме
Вопрос только есть...
А НАФИГА?
Создавать таблицу на сервере, передавать на клиента, чтобы потом снова передать на сервер?
Передавайте данные с клиента на сервер, а там уже и таблицаЗначений вам доступна и проч.
14. tarassov 111 28.09.16 14:29 Сейчас в теме
(12) HanterVol,

У мня это решение родилось, когда потребовалось быстро переделать чужую обработку, написанную для обычных форм в формы управляемые. "Дешевле" показалось не менять структуры, а "одним махом" передать с клиента на сервер образ таблицы значений. Главный выигрыш для себя видел в конструкции
ТаблицаЗагрузки = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);

13. пользователь 28.09.16 11:27
Сообщение было скрыто модератором.
...
16. mickey.1cx 397 13.10.16 23:17 Сейчас в теме
Допустим, Т - реквизит формы с типом ТаблицаЗначений.

&НаКлиенте
Процедура ПередатьТаблицу()
	
	ДанныеОбработки = ОбработатьТаблицуНаСервере(Т);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ОбработатьТаблицуНаСервере(Знач Т)
	
	//Т - копия реквизита с данными, тип ДанныеФормаКоллекция
	//если необходимо, получаем таблицу значений
	ТЗ = Т.Выгрузить(); 
	
	//Обработка таблицы значений
	//...
	
	//можно вернуть результат обратно
	Т.Загрузить(ТЗ);
	
	Возврат Т;
	
КонецФункции
Показать


Пример здесь
pridecom; user774630; +2 Ответить
Оставьте свое сообщение