Имя: Пароль:
1C
 
Как правильно сформировать JSON-ответ в HTTP-сервисе 1С для мобилка в 1с?
(1) Tahallus
13 февраля 2020 г.
10:52
Ребята, пытаюсь сделать REST API на 1С, но не понимаю, как правильно сформировать JSON-ответ. Мне нужно выгружать список товаров. Кто-нибудь делал что-то подобное?
(2) PixelGuru
13 февраля 2020 г.
11:15
Конечно! Тут важно корректно сериализовать данные в JSON. У тебя структура JSON вложенная или простая?
(3) DimR_71
13 февраля 2020 г.
12:46
Попробуй этот вариант, он рабочий:
Показать спойлер
Функция СписокТоваровGET(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	// Получить из запроса параметр URL *.

	Выборка = Справочники.ТоварыИУслуги.Выбрать();
	// В цикле обхода выборкизаписать в JSON список сотрудников.
	// Создать объект записи и записать строковое значение в строку JSON.
	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку();
	// Записать начало корневого объекта.
	Запись.ЗаписатьНачалоОбъекта();
	Пока Выборка.Следующий() Цикл
		Запись.ЗаписатьИмяСвойства("Товар" + Выборка.Код);
		Запись.ЗаписатьНачалоОбъекта();
		Запись.ЗаписатьИмяСвойства("Код");
		Запись.ЗаписатьЗначение(Выборка.Код); 
		Запись.ЗаписатьИмяСвойства("Наименование");
		Запись.ЗаписатьЗначение(Выборка.Наименование);	
		Запись.ЗаписатьИмяСвойства("ЭтоУслуга");
		Запись.ЗаписатьЗначение(Выборка.ЭтоУслуга);			
		Запись.ЗаписатьИмяСвойства("Цена");
		Запись.ЗаписатьЗначение(Строка(Выборка.Цена));
		Запись.ЗаписатьКонецОбъекта();
	КонецЦикла;
	// Записать конец корневого объекта.

	Запись.ЗаписатьКонецОбъекта();
	// Записать результат записи в строку JSON.
	Результат = Запись.Закрыть();
	// Установить тело ответа из строки Результат.
	Ответ.УстановитьТелоИзСтроки(Результат); 
	Ответ.Заголовки.Вставить("Content-type", "application/json");
	Возврат Ответ;
КонецФункции


(4) ProCoder77
5 мая 2021 г.
14:29
Кстати, этот метод у меня висит на /products, так что он должен выдавать список товаров по GET-запросу.
(5) LogiMaster
6 мая 2021 г.
5:05
http-сервис с корнем home, а потом шаблонURL с url /products. А потом гоняешь запрос в мобилке к url
ВыполнитьЗапрос("GET", "InfoBase16/hs/home/products/", "");
(6) PixelWarrior
6 мая 2021 г.
7:25
В мобилке я потом таким образом загрузку делаю. Кнопку на форму и запрос к url, получение JSON и его обработка с помощью ПростоеЧтениеJSON, а дальше всего навсего разложить в новый обхект и записать.
Показать спойлер
&НаКлиенте
Процедура ЗагрузитьТовары(Команда)
	ВыполнитьЗапрос("GET", "InfoBase16/hs/home/products/", "");
КонецПроцедуры


&НаСервере
Процедура ВыполнитьЗапрос(ИмяМетода, АдресРесурса, СтрокаТелаЗапроса)
	// Установить имя сервера.
	СерверИсточник = "192.168.2.79";
	Сообщение = Новый СообщениеПользователю;
	Попытка
		// Создать HTTP-соединение с сервером localhost.
		HTTPСоединение = Новый HTTPСоединение(СерверИсточник);
		
	Исключение
		// Вывести сообщение об ошибке соединения с сервером.
		Сообщение.Текст = "Не удалось соединиться с сервером: " + СерверИсточник;
		Сообщение.Сообщить();
		Сообщение.Текст = ОписаниеОшибки();
		Сообщение.Сообщить();
		Возврат;
	КонецПопытки; 
	
	// Создать HTTP-запрос на основе URL.
	HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
	
	Попытка
		// Получить ответ сервера в виде объекта HTTPОтвет.
		Результат = HTTPСоединение.ВызватьHTTPМетод(ИмяМетода, HTTPЗапрос);
		ДанныеВJson = Результат.ПолучитьТелоКакСтроку();
		Сообщить(ДанныеВJson);
		СтруктураДанные = ПростоеЧтениеJSON(ДанныеВJson);    
		//Сообщить(СтруктураДанные);
		//Сообщить(СтруктураДанные.Количество());
		Для каждого Элемент Из СтруктураДанные Цикл
			//Элемент.Значение - это структура товара, дальше по реквизитам справочника обращаемся				
			НовыйТовар = Справочники.ТоварыИУслуги.СоздатьЭлемент();    
			НовыйТовар.Код = Элемент.Значение.Код;
			НовыйТовар.Наименование = Элемент.Значение.Наименование;
			НовыйТовар.ЭтоУслуга =  Элемент.Значение.ЭтоУслуга;    
			НовыйТовар.Цена = Элемент.Значение.Цена;    
			НовыйТовар.Записать();
			
		КонецЦикла;   
		Сообщить("Товары загружены");
	Исключение
		// Вывести сообщение об ошибке при получении ответа сервера.
		Сообщение.Текст = ОписаниеОшибки();
		Сообщение.Сообщить();
		Возврат;
	КонецПопытки; 
КонецПроцедуры   

Функция ПростоеЧтениеJSON(Данные)
	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(Данные);
	Возврат ПрочитатьJSON(ЧтениеJSON);
КонецФункции


(7) AutoAns
6 мая 2021 г.
16:05
Да, тогда всё логично. Главное, чтобы сервер правильно принимал запрос и возвращал JSON. Если используешь веб-сервер 1С, убедись, что у тебя заголовки правильно выставлены (Content-type: application/json).
(8) 1Снеговик
6 мая 2021 г.
17:11
ЛОЛ, JSON в 1С? Это же как ковыряться в коде DOS на 486-м! Используйте нормальные языки, а не этот ваш каменный век!
(9) Fedor-1971
7 мая 2021 г.
15:01
Для заказчиков делать так
Показать спойлер
Функция СписокКлиентовGET(Запрос)
	Ответ = Новый HTTPСервисОтвет(200);
	// Получить из запроса параметр URL *.

	Выборка = Справочники.Клиенты.Выбрать();
	// В цикле обхода выборки записать в JSON список сотрудников.
	// Создать объект записи и записать строковое значение в строку JSON.
	Запись = Новый ЗаписьJSON;
	Запись.УстановитьСтроку();
	// Записать начало корневого объекта.
	Запись.ЗаписатьНачалоОбъекта();
	Пока Выборка.Следующий() Цикл
		Запись.ЗаписатьИмяСвойства(Выборка.Наименование);
		Запись.ЗаписатьНачалоОбъекта();
		Запись.ЗаписатьИмяСвойства("Код");
		Запись.ЗаписатьЗначение(Выборка.Код);
		Запись.ЗаписатьИмяСвойства("Телефон");
		Запись.ЗаписатьЗначение(Строка(Выборка.Телефон));
		Запись.ЗаписатьИмяСвойства("Email");
		Запись.ЗаписатьЗначение(Строка(Выборка.Email));
		Запись.ЗаписатьИмяСвойства("Менеджер");
		Запись.ЗаписатьЗначение(Строка(Выборка.Менеджер));
		Запись.ЗаписатьИмяСвойства("Комментарий");
		Запись.ЗаписатьЗначение(Строка(Выборка.Комментарий));
		Запись.ЗаписатьКонецОбъекта();

	КонецЦикла;
	// Записать конец корневого объекта.

	Запись.ЗаписатьКонецОбъекта();
	// Записать результат записи в строку JSON.
	Результат = Запись.Закрыть();
	// Установить тело ответа из строки Результат.
	Ответ.УстановитьТелоИзСтроки(Результат);
	Ответ.Заголовки.Вставить("Content-type", "application/json");
	Возврат Ответ;
КонецФункции

Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс
Для создания новых тем нужно войти или зарегистрироваться