Имя: Пароль:
1C
1С v8
Как получить двумерный массив из веб-сервиса?
0 ETurdymuratov
 
28.07.15
08:32
Привет все! Делал как описано в примере http://codenotes-1c.blogspot.com/2013/06/1-8_18.html?showComment=1438061337137#c8037017510524313498
Задался целью вернуть не простой массив, а двумерный. Когда переделал код под себя возвращается ошибка {WebСервис.WebСервис.Модуль(23)}: Получение элемента по индексу для значения не определено. Проверял в SoapUI. Подскажите пожалуйста как правильно переделать?
1 ETurdymuratov
 
28.07.15
08:47
Функция ВозвратитьМассив(IdTov, CntInt)
    ТипXDTOТипОбъекта1 = ФабрикаXDTO.Тип("http://ghostaz.no-ip.org";, "ТипОбъекта1");  
    ТипОбъекта1 = ФабрикаXDTO.Создать(ТипXDTOТипОбъекта1);
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
                   |    ТоварыНаСкладахОстатки.Номенклатура.Код как Код
                   |ИЗ
                   |    РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура.Код = &КодТовара) КАК ТоварыНаСкладахОстатки";
                                  
    Запрос.УстановитьПараметр("КодТовара", IdTov);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    i = 0;
    Если Выборка.Следующий() Тогда
        Если CntInt <= Выборка.КоличествоОстаток Тогда
            СтатусТовара = "Ok"
        Иначе
            СтатусТовара = "Error"
        КонецЕсли;
        
        ТипОбъекта1[i][0] = СтатусТовара;
        ТипОбъекта1[i][1] = Выборка.КоличествоОстаток;
        ТипОбъекта1[i][2] = Выборка.Код;
        
        i=i+1;
    
    КонецЕсли;
    
    Возврат ТипОбъекта1;
КонецФункции
2 Остап Сулейманович
 
28.07.15
08:53
(0) Ошибка не имеет никакого отношения именно к ВЕБ-сервису. Разве что возникает в его модуле. Чисто одноэсная ошибка.

ЗЫ. Хоть бы примерно намекнул что же представляет из себя строка 23.
3 ETurdymuratov
 
28.07.15
09:05
(2) ТипОбъекта1[i][0] = СтатусТовара;
4 hhhh
 
28.07.15
09:17
(3) там неправильно

Для Ай = 0 по 3 Цикл
5 ETurdymuratov
 
28.07.15
09:47
(4) не понял?
6 ETurdymuratov
 
28.07.15
09:49
Сам пример по ссылке работает у меня, просто решил для своих целей переделать эту функцию. Мне возвратить двумерный массив, примерно что я хочу привел в моем коде
7 ETurdymuratov
 
28.07.15
09:50
Мне сказали что в веб сервисах можно только вложенные структуры создавать, массивы нельзя
8 Serginio1
 
28.07.15
10:34
Можешь сериализовать массив массивов.

Массив=Новый Массив(2);
Массив[0]=Новый Массив(2);
Массив[1]=Новый Массив(2);

ОбъектXdto=СериализаторXDTO.ЗаписатьXDTO(Массив);

Добавь к вэб сервису пакет http://v8.1c.ru/8.1/data/core
И сделай возвращаемое значение Array
9 ETurdymuratov
 
29.07.15
06:31
(8) Ошибка проверки модели XDTO: xdto-model-1    пакет: http://v8.1c.ru/8.1/data/core
Дублирование определений пакетов типов для пространства имен 'http://v8.1c.ru/8.1/data/core'
10 Serginio1
 
29.07.15
10:34
Значит он уже добавлен. Установи возвращаемому значению тип Array из пакета http://v8.1c.ru/8.1/data/core
11 Serginio1
 
29.07.15
11:11
(9) То есть открываешь твой Вэб сервис. У него есть поле ПакетыXDTO отмечаешь http://v8.1c.ru/8.1/data/core

У тебя в какой момент происходит ошибка?
Второй вариант можешь сериализовать в строку.

Метод ЗначениеВСтрокуВнутр
12 ETurdymuratov
 
30.07.15
08:55
(11) Сделал возвращаемое значение типа Array из пакета http://v8.1c.ru/8.1/data/core

дальше в модуле:

Функция ВозвратитьМассив(IdTov, CntInt)
    
    Массив = Новый Массив(2);
    Массив[0]=Новый Массив(2);
    Массив[1]=Новый Массив(2);
    
    Массив[0].Добавить("1", "2");
    Массив[1].Добавить("3", "4");
    ОбъектXdto=СериализаторXDTO.ЗаписатьXDTO(Массив);
    Возврат ОбъектXdto;
КонецФункции

выдает ошибку:
<detail>Неизвестная ошибка. {WebСервис.WebСервис.Модуль(34)}: Индекс находится за границами массива
по причине:
{WebСервис.WebСервис.Модуль(34)}: Индекс находится за границами массива</detail>
13 Serginio1
 
30.07.15
10:21
Массив = Новый Массив(2);
    Массив[0]=Новый Массив(2);
    Массив[1]=Новый Массив(2);
    
    Массив[0][0]="1";
    Массив[0][1]="2";
    Массив[1][0]="3";
    Массив[1][1]="4";

    ОбъектXdto=СериализаторXDTO.ЗаписатьXDTO(Массив);
    ПоказатьОбъект(ОбъектXdto);
14 Serginio1
 
30.07.15
10:23
Но проще использовать ТаблицуЗначений. Там можно типизировать поля. Смотри 11
15 ETurdymuratov
 
30.07.15
10:59
(14) Заработало!!!! Благодарю уважаемый!!!