Имя: Пароль:
1C
 
1С Rest OData $expand реквизита строки табличной части. Реально ли?
0 tabarigen
 
03.07.21
11:26
Все добра.
Получаю документ по Odata в формате json. Запрос имеет слндующий url данные получаются.

&НаСервере
Процедура ЗаполнитьДокументПоСсылке(UID)

    Сообщение = Новый СообщениеПользователю;
    // Установить имя сервера.
    СерверИсточник =Константы.АдресСервера.Получить();
    
    Попытка
        // Создать HTTP-соединение с сервером localhost.
        HTTPСоединение = Новый HTTPСоединение(СерверИсточник,80,"tsd","89288713000",,Ложь);
        
    Исключение
        // Вывести сообщение об ошибке соединения с сервером.
        Сообщение.Текст = "Не удалось соединиться с сервером: " + СерверИсточник;
        Сообщение.Сообщить();
        Сообщение.Текст = ОписаниеОшибки();
        Сообщение.Сообщить();
        Возврат;
    КонецПопытки;
    
    
    // Создать HTTP-запрос на основе URL.
    АдресРесурса = "/*******/odata/standard.odata/Document_РеализацияТоваров(guid'" + UID + "')?$format=json";
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
    
    Попытка
        // Получить ответ сервера в виде объекта HTTPОтвет.
        Результат = HTTPСоединение.Получить(HTTPЗапрос);
        Если Результат.КодСостояния = 200 Тогда
            //получить содержимое ответа сервера в виде строки
            ТекстJSON = Результат.ПолучитьТелоКакСтроку();
            ЧтениеJSON = Новый ЧтениеJSON();
            ЧтениеJSON.УстановитьСтроку(ТекстJSON);
            Док = ПрочитатьJSON(ЧтениеJSON,Истина,"Date");
            Если Док.Получить("Ref_Key") = UID Тогда
                ТоварыНакладной = Док.Получить("Товары");
                Если ТоварыНакладной.Количество() > 0 Тогда
                    Для каждого Товар Из ТоварыНакладной Цикл
                        нСтр = Товары.Добавить();
                        нСтр.Номенклатура =  Товар.Получить("Номенклатура_Key");
                        нСтр.Характеристика = Товар.Получить("Характеристика_Key");
                        нСтр.Количество = Товар.Получить("Количество");
                        нСтр.Цена = Товар.Получить("Цена");
                    КонецЦикла;    
                Иначе     
                    Сообщить("Документ пуст");            
                КонецЕсли;    
    
            КонецЕсли;
        Иначе
            // Вывести сообщение об ошибке при получении ответа сервера.
            Сообщение.Текст = "Ответ сервера: " + Результат.КодСостояния + Символы.ПС + ОписаниеОшибки();
            Сообщение.Сообщить();
        КонецЕсли;    
        
    Исключение
        // Вывести сообщение об ошибке при получении ответа сервера.
        Сообщение.Текст = ОписаниеОшибки();
        Сообщение.Сообщить();
    КонецПопытки;        

КонецПроцедуры


Проблема в том, что у меня в возвращаемых данных для табличной части есть только ссылки на номенклатуру Номеклатура_Key а мен нужно подтянуть наименование как минимум.
Насколько я понял из документации параметр $expand  не умеет разворачивать реквизиты ТЧ. Так как тогда быть в моем случае?? Для каждой строки делать отдельный запрос? А что если строк пару сотен? А что если откроется одновременно 10 таких документов по несколько сотен строк?


Документация с ИТС..
Ограничения параметра $expand:

● Не поддерживается расширение реквизитов табличных частей.

● Не поддерживается расширение при запросе одиночных сущностей (сущность, строки табличной части, запись регистра).

● Расширение ссылочных и составных типов виртуальных таблиц не соответствует протоколу OData версии 3.

Запрос, в котором будет выполняться расширение измерения виртуальной таблицы будет выглядеть следующим образом


Помогите собраться с мыслями.
1 Ёпрст
 
03.07.21
11:42
ну и собери все номенклатуры и сделай один запрос на них.
2 tabarigen
 
03.07.21
11:47
(1) то есть для получения всех номенуклатура применить $filter=.
Но разве умеет искать вхождение в массив? Или все условия передавать через OR в параметрах get запроса?
3 Ёпрст
 
03.07.21
11:56
(2) нужно смотреть, что оно там умеет в фильтр. Простые условия, типа не группа, не пометка удаления точно могёт, на счет списка ..не помню.
Я с этим уг сталкивался один раз
4 Ёпрст
 
03.07.21
11:56
Поищи статьи на нимфостарте, наверняка кто-то распинался, что оно там умеет, или итс почитать.
Да и устаревший одата 3..
5 tabarigen
 
03.07.21
12:09
(4) ок. щас проштудирую ИТС
6 серый КТУЛХУ
 
03.07.21
15:36
вторым oData - запросом получить нужные Номеклатура_Desc по Номеклатура_Key - не судьба?
7 Ёпрст
 
03.07.21
18:42
(6) тут вопрос, можно ли сразу сдалать 1 запрос на нужный список Номеклатура_Key, или пидётся куеву тучу для каждой номенклатуры.
8 серый КТУЛХУ
 
03.07.21
21:32
(7) а через or натулить - нэ?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан