8.х Передача двумерного массива через веб-сервис

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Tasya, 10 фев 2017.

  1. TopicStarter Overlay
    Tasya
    Offline

    Tasya Опытный в 1С

    Регистрация:
    9 сен 2013
    Сообщения:
    157
    Симпатии:
    3
    Баллы:
    29
    Добрый день!

    Мобильное приложение 1С обменивается с центральным сервером по веб-сервисам. Необходимо из мобильного приложения с помощью веб-сервиса передать двумерный массив, а на центральном сервере принять его, обойти его и заполнить табличную часть его значениями.

    Со стороны мобильного приложения делаю так (передаю в веб-сервис ОбъектХDTO):

    Код:
    ОбъектXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core", "Array"));
    Для каждого Строка из СписокЗаказа Цикл
                                                  
        ТипКартридж = СериализаторXDTO.XMLТипЗнч(Строка.Картридж);
        ЗначениеКартридж = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ТипКартридж.URIПространстваИмен, ТипКартридж.ИмяТипа),XMLСтрока(Строка.Картридж));
                                                 
        ТипРабочееМесто = СериализаторXDTO.XMLТипЗнч(Строка.РабочееМесто);
        ЗначениеРабочееМесто = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ТипРабочееМесто.URIПространстваИмен, ТипРабочееМесто.ИмяТипа),XMLСтрока(Строка.РабочееМесто));
      
        ОбъектXDTO.value.Добавить(ЗначениеКартридж);
        ОбъектXDTO.value.Добавить(ЗначениеРабочееМесто);
                                         
    КонецЦикла;
    //..... далее подключаюсь к веб-сервису и передаю в него ОбъектXDTO      
    
    Со стороны центрального сервера принимаю ОбъектХDTO в параметр ActivList, который имеет тип: Array (http://v8.1c.ru/8.1/data/core). Обхожу циклом:
    Код:
    Для каждого Элемент из ActivList.Value Цикл
    Сообщить(Элемент);
    КонецЦикла;
    И получаю список значений элементов, то есть как одномерный массив.

    Подскажите, как правильно передать двумерный массив?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.900
    Симпатии:
    1.035
    Баллы:
    204
    Двумерный массив = массив массивов.
    Сформируйте массив массивов и сделайте один раз сериализацию этого массива. Смысла формировать врукопашную списокxdto вообще нет необходимости.
  3. TopicStarter Overlay
    Tasya
    Offline

    Tasya Опытный в 1С

    Регистрация:
    9 сен 2013
    Сообщения:
    157
    Симпатии:
    3
    Баллы:
    29
    Спасибо за ответ! Хорошо, я создам массив массивов, преобразую в xml и передам в веб-сервис xml. А на стороне веб-сервиса какой должен быть в этом случае тип принимаемого параметра?
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.900
    Симпатии:
    1.035
    Баллы:
    204
    Тип "Array" из пространства имен "http ://v8.1c.ru/8.1/data/core"
  5. TopicStarter Overlay
    Tasya
    Offline

    Tasya Опытный в 1С

    Регистрация:
    9 сен 2013
    Сообщения:
    157
    Симпатии:
    3
    Баллы:
    29
    Вроде все сделала. Но когда сообщаю СписокОбъектов выдает ошибку: Ошибка преобразования данных XML
    Код:
    &НаКлиенте
    Процедура Заказать(Команда)
       
        МассивМассивов = Новый Массив;
        Для Каждого Строка из СписокЗаказа Цикл
            Массив = Новый Массив;
            Массив.Добавить(Строка.Картридж);
            Массив.Добавить(Строка.РабочееМесто);
            Массив.Добавить(Строка.Количество);
            МассивМассивов.Добавить(Массив);
        КонецЦикла;
       
        ЗаказатьНаСервере(МассивМассивов);
       
    КонецПроцедуры
    
    &НаСервере
    Процедура ЗаказатьНаСервере(МассивМассивов)
       
        СписокОбъектов = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core", "Array"));
       
        Для каждого Элемент из МассивМассивов Цикл
            Тип = СериализаторXDTO.XMLТипЗнч(Элемент);
            Значение = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(Тип.URIПространстваИмен, Тип.ИмяТипа),XMLСтрока(Элемент));
            СписокОбъектов.value.Добавить(Значение);
        КонецЦикла;
       
        Сообщить (СписокОбъектов);
           
    КонецПроцедуры 
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.900
    Симпатии:
    1.035
    Баллы:
    204
    Значения

    Строка.Картридж
    Строка.РабочееМесто
    Строка.Количество

    имеют примитивные типы?

    Если да, то:

    Код:
    &НаСервере
    Процедура ЗаказатьНаСервере(МассивМассивов)
    
    ОбъектXDTO = СериализаторXDTO.Записать(ФабрикаXDTO, МассивМассивов);
    
    КонецПроцедуры
  7. TopicStarter Overlay
    Tasya
    Offline

    Tasya Опытный в 1С

    Регистрация:
    9 сен 2013
    Сообщения:
    157
    Симпатии:
    3
    Баллы:
    29
    Да, все они имеют тип Строка.

    СериализаторXDTO не имеет метода Записать, есть метод ЗаписатьXDTO и только с одним параметром ЗаписатьXDTO(<Значение>)

    Код:
    &НаСервере
    Процедура ЗаказатьНаСервере(МассивМассивов)
       
        СписокОбъектов = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core", "Array"));
        ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(СписокОбъектов, МассивМассивов);
        Сообщить (ОбъектXDTO);
       
    КонецПроцедуры 
    Выдает ошибку "Слишком много фактических параметров"
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.900
    Симпатии:
    1.035
    Баллы:
    204
    Вот так работает 100%:
    Код:
    Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
    ОбъектXDTO = Сериализатор.ЗаписатьXDTO(Значение);
  9. TopicStarter Overlay
    Tasya
    Offline

    Tasya Опытный в 1С

    Регистрация:
    9 сен 2013
    Сообщения:
    157
    Симпатии:
    3
    Баллы:
    29
    Да, все супер!!! Спасибо большое!