Имя: Пароль:
1C
 
Обмен данными через Web-сервисы
,
0 mzelensky
 
05.09.14
08:43
Доброго всем. Пишу небольшую конфигурацию для мобильного приложения на 8.3. Разумеется планируется организовать обмен с центральной базой. Обмен буду делать через web-сервисы.

На данный момент обмениваться предполагается всего 2 объектами - справочник "Контрагенты" и документ "Посещение клиента" + несколько доп. параметров для администрирования, но возможно далее конфа будет расширяться и объектов для обмена станет больше. Поэтому нужно продуматьмаксимально удобный и расширяемый механизм.

А теперь вопрос - каким образом лучше перебрасывать информацию. Варианты:

1) Серриализовать\ДеСерриализовать Структуру с таблицами значений в которой будет нужная инфа.
2) Записать обычный XML-файл и перекинуть.

Сейчас меня смущает объем данных, которые будут перебрасываться, нормально ли их потянет механизм веб-сервисов. Для примера, первая выгрузка справочника контрагенты может содержать порядка тысячи элементов (далее естественно меньше)
1 quest
 
05.09.14
08:48
по размерам - а чем 1 раз передать 1000 элементов, лучше чем 1000 раз передать по 1 элементу?
по формату - читай про XDTO
2 mzelensky
 
05.09.14
08:52
(1) "по размерам - а чем 1 раз передать 1000 элементов, лучше чем 1000 раз передать по 1 элементу?" - а я про это и не говорил. Я буду за один раз перебрасывать все что мне нужно

"по формату - читай про XDTO" -  при работе через Web-сервисы я в любом случае буду XDTO пользоваться.
3 mzelensky
 
05.09.14
08:55
(2) Просто у меня есть видяшка видео-урока, где показан следующий механизм - создается таблица значений, заполняется нужными данными. Сериализуется. И как параметр отправляется в базу-приемник через Web-сервис. На строне приемника эта таблица получается как параметр, ДЕСериализуется и далее уже обрабатывается. Вроде все очень красиво и мне это нравится. Но я не знаю, что будет с этим механизмом, когда я в эту таблицу запишу, например, пару тысяч элементов.

Почему 1 раз 1000, а не 1000 раз по 1 - чтобы вызов сервера был 1 раз. Чтобы не рвать данные и сделать все в одной транзакции. Как в источнике, так и в приемнике.
4 quest
 
05.09.14
09:04
ну если есть видео, то да - мозг включать не нужно. и сервер поберечь тоже стоит - зачем его 1000 раз дергать, такты процессорные же экономить надо
5 mzelensky
 
05.09.14
09:16
(4) Не понимаю твою иронию.

1) Конкретные "ЗА" и "ПРОТИВ" есть?
2) Опыт передачи таблиц по веб-сервисам есть? Какой и как?
3) В принципе опыт переброски больших объемов данных между базами по веб-сервисам есть? Какой и как?
6 tan76
 
05.09.14
09:27
нормально передается, тз в 3500 строк из 10 колонок без проблем....
7 wms
 
05.09.14
09:27
(0)не делал, но в планах тоже интересно подобное сделать.отпишись.
единственное может не надо всех контрагентов передавать менеджеру, а только тех которые ему назначены
8 Широкий
 
05.09.14
09:34
(0) У операции веб сервиса сделай свойство типа двоичные данные ("ValueStorage (http://v8.1c.ru/8.1/data/core)";.

Для передачи у меня используется структура таблиц значений.
Сериализую так: "Новый ХранилищеЗначения(СтруктураДанныхОтвет,Новый СжатиеДанных(9));"
9 mzelensky
 
05.09.14
09:36
(7) Естественно только его. Всех и не нужно. Я спрашиваю на "вырост" + еще чуть-чуть, т.к. не хочется в один прерасный момент упереться в какое-то ограничение по объему передаваемых данных
10 mzelensky
 
05.09.14
09:37
(6) Спасибо. Обнадежил :)
11 mzelensky
 
05.09.14
09:38
(8) Замечательно. Спасибо.
12 tan76
 
05.09.14
09:39
сейчас попробовал, таблица в 11000 строк пролезла без проблем

(8) интересная мысля... как нибудь проверю на досуге велика ли выгода относительно передачи просто таблицы значений
13 Широкий
 
05.09.14
09:42
(12) Проверять :)
Убил бы на это столько времени как я - сам бы дошел
14 mzelensky
 
05.09.14
09:42
У меня вообще прикольная архитектура намечается:

Структура с таблицами значений структур

т.е. в каждом ключе стукрутры будет ТЗ с одной колонкой, в каждой строке которой будет структура с данными

:)
15 quest
 
05.09.14
09:42
(5)
Конкретно против передачи массива информации, там где можно обойтись передачей 1 параметра. Проще 1000 раз вызвать сервер с передачей 1 значения, чем в будущем заморачиваться с оборачиванием 1 значения в список. Или того хуже - заводить 2 метода для обмена - один для списка второй для элемента.

По ограничениям - 62 тыс строк пролезало без проблем, но в условиях локальной сети.
16 tan76
 
05.09.14
09:43
(13) Понял Шеф, принимаю как аксиому :)
17 mzelensky
 
05.09.14
09:44
(13) Кстати, попутный вопрос. Если плотно занимаетесь обменами - как реализуете (если реализуете) двухсторонний обмен ?

Я раньше вел свой регистр сведений, где хранил информацию по объектам созданным в источнике и затем ответно модифицированным и опять полученным.
18 Широкий
 
05.09.14
09:49
(17) Планы обмена, 3х-звенка.
Мобильное приложение - сервер мобильного приложения - боевая база
19 mzelensky
 
05.09.14
09:54
(18) я вчера тоже захотел на планах обмена попробовать. НО сразу косяк - автоматом создается УЗЕЛ текущей базы. А УЗЕЛ, в который будет выгружаться нужно создавать отдельно...для меня это не очень удобно.

Особенно учитывая, что у меня центральная база и порядка 20-25 мобильных устройств (баз). Следовательно 20-25 узлов плана.
20 Широкий
 
05.09.14
09:56
(19) Поэтому и нужна промежуточная база. У меня сейчас там 200 узлов, деградации производительности нет
21 mzelensky
 
05.09.14
10:01
(20) Не, не хочу...это все дело нужно обслуживать, следить, холить и лелеять.

Мне нужно нечто более автономное. В принципе мой старый вариант работает доволно неплохо.
22 Широкий
 
05.09.14
10:05
(21) Я тебя разве уговариваю? Автономность зависит от того как напишешь.
23 mzelensky
 
05.09.14
10:08
(22) Ну тут проде все сказанное: "принимаю как аксиому :)" (16)

:)
24 mzelensky
 
05.09.14
10:14
(22) Еще вопрос - используешь какой-нибудь механизм проверки прошел обмен или нет?

ну т.е. например выполняется обмен, производится передача данных через инет на веб-сервис и на середине процесса инет падает.

Это можно отловить?
25 Широкий
 
05.09.14
10:21
(24) У планов обмена уже есть штатный механизм - номера сообщений принято/отправлено.
Если инфа не дошла - при следующем обмене она должна отправится повторно
26 mzelensky
 
05.09.14
10:27
(25) понял, короче ты штатный механизм регистрации юзаешь.
27 Serginio1
 
05.09.14
14:43
Посмотри конфигурацию Управляемое приложение
там кстати есть пример вэб сервиса ОбменСМобильнымУстройством

Для примера отправка

Функция СформироватьПакетОбмена(УзелОбмена) Экспорт
    
    ЗаписьXML = Новый ЗаписьXML;
    
    ЗаписьXML.УстановитьСтроку("UTF-8");
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    
    ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
    ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);                    
    
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance";);
    ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8",  "http://v8.1c.ru/data";);
    
    ТипДанныхУдаления = Тип("УдалениеОбъекта");
    
    ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, ЗаписьСообщения.НомерСообщения);
    Пока ВыборкаИзменений.Следующий() Цикл
        
        Данные = ВыборкаИзменений.Получить();
        
        // Если перенос данных не нужен, то, возможно, необходимо записать удаление данных
        Если Не ОбменМобильныеПереопределяемый.НуженПереносДанных(Данные, УзелОбмена) Тогда
            
            // Получаем значение с возможным удалением данных
            УдалениеДанных(Данные);
            
        КонецЕсли;    
        
        // Записываем данные в сообщение
        ОбменМобильныеПереопределяемый.ЗаписатьДанные(ЗаписьXML, Данные);
        
    КонецЦикла;
    
    ЗаписьСообщения.ЗакончитьЗапись();
    
    Возврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(), Новый СжатиеДанных(9));
    
КонецФункции
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан