Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Результаты запроса в JSON.

Результаты запроса в JSON.
Я
   Naps2
 
05.02.20 - 17:06
Пару лет назад написал небольшой внутренний веб-сервис, дабы скрестить 1С с со СКУД и в целом иметь оперативный доступ к некоторым данным. Тогда конфигурация была Аренда и управление недвижимостью 1.6 и данные я брал напрямую из базы SQL.
Теперь прешли на трёшку, в ней есть удобные http сервисы и логично брать данные через них. Накидал простейшее расширение, которое отдаёт чуть-чуть данных.

Функция tenantsGetget(Запрос)
    Запрос = Новый Запрос("ВЫБРАТЬ
    |Контрагенты.Наименование КАК Наименование,
    |МАКСИМУМ(АР_ЗаключениеДоговораАренды.ДатаОкончанияДоговора) КАК ДатаОкончанияДоговора,
    |Контрагенты.Код КАК Код
    |ИЗ  
    |Документ.АР_ЗаключениеДоговораАренды КАК АР_ЗаключениеДоговораАренды
    |    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    |        ПО (ДоговорыКонтрагентов.Владелец = Контрагенты.Ссылка)
    |    ПО (АР_ЗаключениеДоговораАренды.ДоговорКонтрагента = ДоговорыКонтрагентов.Ссылка)
    |ГДЕ
    |ДоговорыКонтрагентов.АР_АрендныйДоговор = Истина
    |СГРУППИРОВАТЬ ПО
    |Контрагенты.Наименование,
    |Контрагенты.Код
    |УПОРЯДОЧИТЬ ПО
    |    Наименование;");
    тзРезультат = Запрос.Выполнить().Выгрузить();
    

    
    мОтвет = Новый Массив;
    
    Для Каждого ТекСтрока Из тзРезультат Цикл
        Структура = Новый Структура;
        Структура.Вставить("Name",ТекСтрока.Получить(0));
        Структура.Вставить("Finish",ТекСтрока.Получить(1));
        Структура.Вставить("Code",ТекСтрока.Получить(2));
        мОтвет.Добавить(Структура);
    КонецЦикла;
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб));
    ЗаписатьJSON(ЗаписьJSON, мОтвет);
    
    Ответ = Новый HTTPСервисОтвет(200);
    
    Ответ.Заголовки.Вставить("Accept-Charset", "utf-8");
    Ответ.Заголовки.Вставить("Content-Type", "application/json;charset=utf-8");
    Ответ.Заголовки["Cache-Control"] = "no-cache";
    

    Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть());
    
    Возврат Ответ;

КонецФункции


Всё работает, но вот каждый раз описывать структуру может быть лень когда полей станет сильно больше.
На php это выглядело бы так:

$Q=DB->prepare("ЗАПРОС");
$Q->execute();
$data=$Q->fetchAll();
return(json_encode($data));


Собственно вопрос, есть ли в 1С аналог fetchAll что бы скопом засунуть результат запроса в массив, который потом можно сериализировать.
 
 
   080808Ник
 
1 - 05.02.20 - 17:11
(0) ОбщегоНазначения.ТаблицаЗначенийВМассив(Запрос.Выполнить().Выгрузить());
   080808Ник
 
2 - 05.02.20 - 17:11
//    Преобразует таблицу значений в массив.

//    Может использоваться для передачи на клиента данных, полученных
//    на сервере в виде таблицы значений в том случае, если таблица

//    значений содержит только такие значения, которые могут
//  быть переданы на клиента

//
//    Полученный массив содержит структуры, каждая из которых повторяет

//    структуру колонок таблицы значений.
//

//    Не рекомендуется использовать для преобразования таблиц значений
//    с большим количеством строк.

//
//    Параметры: 

//    ТаблицаЗначений - ТаблицаЗначений
//

//    Возвращаемое значение: 
//    Массив
   080808Ник
 
3 - 05.02.20 - 17:19
(0) а зачем описывать структуру?
делаешь так:
РезультатЗапроса = Запрос.Выполнить();
ТаблицаДанных = РезультатЗапроса.Выгрузить();
ДЛя Каждого Стр из таблицаДанных Цикл
 Структура = Новый Структура;
Для Каждого Колонка из РезультатЗапроса.Колонки Цикл
Структура.Вставить(Колонка.Имя,Стр[Колонка.Имя]);
КонецЦикла;
КонецЦикла;
   unenu
 
4 - 05.02.20 - 17:34
   Naps2
 
5 - 06.02.20 - 08:38
(1) Спасибо, идеально подходит.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.