Имя: Пароль:
1C
1С v8
HTTP-сервисы, передача данных
0 Paimiji
 
19.01.21
12:34
Здравствуйте. Пытаюсь научиться работать с HTTP-сервисами. Подскажите, если я хочу по http обратиться к своей базе и получить данные из регистра, то я должен в 1С создать Шаблон URL, у которого определить метод GET? И потом с помощью этого метода обращаться к базе и получать данные?
И если я потом захочу отдать какие то данные в ответ, то какой метод http для этого необходимо определять?
1 ДенисЧ
 
19.01.21
12:38
2 butterbean
 
19.01.21
12:42
(0) по получению данных - да, порядок такой.
что значит "отдать какие то данные в ответ"? если это в смысле в 1С что-то записать в базу, то тогда POST-запрос, хотя в принципе можно в базу и по get-запросу записи делать
3 Paimiji
 
19.01.21
12:49
(2) "отдать какие то данные в ответ" я подразумеваю, что я подключился к своей базе по get запросу и хочу отправить в ответ какой нибудь набор данных: выборку, таблицу значений или еще что нибудь
4 butterbean
 
19.01.21
13:08
(3) ну дык в теле ответа на свой get-запрос ты и отправляй что хочешь, зачем еще какой-то запрос определять?
5 BaZZiL
 
19.01.21
13:30
(3)
когда "подключился к базе по get запросу", это и означает что в ответ нужно отправить какие-то данные, которые надо в этом ответе сформировать

Например, создал URLшаблон GET "НоменклатураПоШтрихкоду" с адресом /goods/{BarCode}
В шаблоне создал метод GET c обработчиком НоменклатураGET

Функция НоменклатураGET(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    Штрихкод = Запрос.ПараметрыURL.Получить("BarCode");
    
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку(ПараметрыЗаписиJSON);
        
    Номенклатура = НайтиНоменклатуруПоШтрихкоду(Штрихкод);
    Если Номенклатура <> Неопределено Тогда
        ДанныеОтвет = Новый Структура;
        ДанныеОтвет.Вставить("Номенклатура",Номенклатура.Наименование);
    Иначе
        Ответ = Новый HTTPСервисОтвет(404);
        ДанныеОтвет ="Номенклатура со штрихкодом "+Штрихкод+" не найдена";
    КонецЕсли;

    ЗаписатьJSON(Запись, ДанныеОтвет);
    Результат = Запись.Закрыть();
    Ответ.УстановитьТелоИзСтроки(Результат);
    Ответ.Заголовки.Вставить("Content-type", "application/json");
    Возврат Ответ;
КонецФункции
6 Paimiji
 
19.01.21
13:32
(4) (5) Ага, понял, спасибо огромное! Можно еще небольшой вопрос? У меня получилось написать GET и получить строку. Теперь хочу попробовать передать массив, но когда я прописываю

(КодыТест - это массив, заполненный)
Результат = КодыТест;
Ответ.УстановитьТелоИзСтроки(Результат,КодировкаТекста.UTF8);    
Ответ.Заголовки.Вставить("Content-Type","text/html; charset=utf-8");

То получаю просто слово "Массив" в результате. А как сделать, чтобы значения массива передались?
7 BaZZiL
 
19.01.21
13:37
РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        ТЗ = РезультатЗапроса.Выгрузить();
    Иначе    
        Ответ = Новый HTTPСервисОтвет(404);
        Ответ.УстановитьТелоИзСтроки("бла-бла-бла не найдено");
        Ответ.Заголовки.Вставить("Content-type", "application/json");
        Возврат Ответ;
    КонецЕсли;

    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку(ПараметрыЗаписиJSON);
    
    ТабНакл = Новый Массив;
    Для Каждого Стр Из ТЗ Цикл
        Накл = Новый Структура;
        Накл.Вставить("Товар",Товар);
        Накл.Вставить("Количество",Количество);
        ТабНакл.Добавить(Накл);
    КонецЦикла;    
    ЗаписатьJSON(Запись,ТабНакл);
    Результат = Запись.Закрыть();
    Ответ.УстановитьТелоИзСтроки(Результат);
    Ответ.Заголовки.Вставить("Content-type", "application/json");
    Возврат Ответ;
8 BaZZiL
 
19.01.21
13:40
Разумеется

Стр.Товар
Стр.Количество
9 Paimiji
 
19.01.21
13:46
(7) Спасибо Вам большое за помощь и советы! Все получилось:)
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший