Имя: Пароль:
1C
1С v8
Результаты запроса в JSON.
0 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 что бы скопом засунуть результат запроса в массив, который потом можно сериализировать.
1 080808Ник
 
05.02.20
17:11
(0) ОбщегоНазначения.ТаблицаЗначенийВМассив(Запрос.Выполнить().Выгрузить());
2 080808Ник
 
05.02.20
17:11
//    Преобразует таблицу значений в массив.
//    Может использоваться для передачи на клиента данных, полученных
//    на сервере в виде таблицы значений в том случае, если таблица
//    значений содержит только такие значения, которые могут
//  быть переданы на клиента
//
//    Полученный массив содержит структуры, каждая из которых повторяет
//    структуру колонок таблицы значений.
//
//    Не рекомендуется использовать для преобразования таблиц значений
//    с большим количеством строк.
//
//    Параметры:
//    ТаблицаЗначений - ТаблицаЗначений
//
//    Возвращаемое значение:
//    Массив
3 080808Ник
 
05.02.20
17:19
(0) а зачем описывать структуру?
делаешь так:
РезультатЗапроса = Запрос.Выполнить();
ТаблицаДанных = РезультатЗапроса.Выгрузить();
ДЛя Каждого Стр из таблицаДанных Цикл
Структура = Новый Структура;
Для Каждого Колонка из РезультатЗапроса.Колонки Цикл
Структура.Вставить(Колонка.Имя,Стр[Колонка.Имя]);
КонецЦикла;
КонецЦикла;
4 unenu
 
05.02.20
17:34
(0) может вам к OData
https://its.1c.ru/db/fresh#content:19956692:1
5 Naps2
 
06.02.20
08:38
(1) Спасибо, идеально подходит.
Основная теорема систематики: Новые системы плодят новые проблемы.