Как подключиться по API (к яндекс маркету / маркетплейсу)

1. Fleasy 12.09.23 15:29 Сейчас в теме
Столкнулся с такой бедой, что в интернете конкретного примера как это сделать нету, поэтому я решил это исправить.
По теме из базы знаний
Найденные решения
2. Fleasy 12.09.23 15:35 Сейчас в теме
&НаКлиенте
Процедура ПолучитьДанные(Команда)
	ПолучитьДанныеНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ПолучитьДанныеНаСервере()   
	

	ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
	Соединение = Новый HTTPСоединение("api.partner.market.yandex.ru",,,,,,ЗащищенноеСоединение);
	
	Токен = "Bearer <ТОКЕН>";
	ИдКомпании = "<id Компании>";  
	 
	АдресЗапроса = СтрШаблон("campaigns/%1/stats/skus", ИдКомпании);  
	
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Authorization", Токен);
	
	Запрос = Новый HTTPЗапрос(АдресЗапроса, Заголовки);
	
	МассивАртикулов = ПолучитьМассивАртикулов();
	
	Если МассивАртикулов = Неопределено Тогда
		Возврат;	
	КонецЕСли;
	
	ДанныеСтруктура = Новый Структура;
	ДанныеСтруктура.Вставить("shopSkus", МассивАртикулов);
	
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ДанныеСтруктура);
	СтрокаJSON = ЗаписьJSON.Закрыть(); 
	
	Запрос.УстановитьТелоИзСтроки(СтрокаJSON);
	
	Попытка
		Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не удалось получить данные: " + ОписаниеОшибки();
		Сообщение.Сообщить();
		Возврат;
	КонецПопытки;  
		
	Если Ответ.КодСостояния = 200 Тогда
		ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
		ДанныеПоТоварам = ПрочитатьJSON(ЧтениеJSON, Истина);
	Иначе
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = СтрШаблон("Не удалось получить данные, код: %1, ответ: %2", Ответ.КодСостояния, Ответ.ПолучитьТелоКакСтроку());
		Сообщение.Сообщить();
		Возврат;	
	КонецЕСлИ;    
	
	
	Если ДанныеПоТоварам["result"]["shopSkus"].Количество() > 0 Тогда 
		
		МассивТоваров = ДанныеПоТоварам["result"]["shopSkus"];  
		
		МассивТоваровДляТЗ = Новый Массив;
		
		Для каждого Товар из МассивТоваров Цикл   
			
			Для каждого Склад из Товар["warehouses"] Цикл   
				
				ТоварСтруктура = Новый Структура;
				
				ТоварСтруктура.Вставить("Артикул", Товар["shopSku"]);
				ТоварСтруктура.Вставить("Товар", Товар["name"]);
                ТоварСтруктура.Вставить("Склад", Склад["name"]); 
				
				Для каждого ТипОстатка из Склад["stocks"] Цикл
					Если ТипОстатка["type"] = "AVAILABLE" Тогда
						ТоварСтруктура.Вставить("Количество", ТипОстатка["count"]);
						МассивТоваровДляТЗ.Добавить(ТоварСтруктура);
					КонецЕСли;
				КонецЦикла;
				
			КонецЦикла;			
		КонецЦикла;
		
		
		Если МассивТоваровДляТЗ.Количество() > 0 Тогда
			НаборЗаписей = РегистрыСведений.Progress_АктуальныеОстаткиТоваровНаСкладах.СоздатьНаборЗаписей();
			НаборЗаписей.Отбор.Маркетплейс.Установить("Yandex");
			НаборЗаписей.Записать(); 	
			
			ТЗ = ПреобразованиеМассивВТаблицуЗначений(МассивТоваровДляТЗ);   
			
			МассивДанных = ПодготовитьДанныеДляЗаписиВРегистр(ТЗ);    
			
			Для каждого Товар из МассивДанных Цикл
				МЗ = РегистрыСведений.Progress_АктуальныеОстаткиТоваровНаСкладах.СоздатьМенеджерЗаписи();
				
				МЗ.Маркетплейс = "Yandex";
				МЗ.Номенклатура = Товар.Номенклатура;
				МЗ.Артикул = Товар.Артикул;
				МЗ.Склад = Товар.Склад;
				МЗ.Количество = Товар.Количество; 
				МЗ.Записать();	
				
			КонецЦикла; 	
				
		КонецЕсли;		   
	КонецЕСлИ;
	
КонецПроцедуры  

&НаСервере
Функция ПреобразованиеМассивВТаблицуЗначений(Массив)

   ТЗ = Новый ТаблицаЗначений;

   Для Каждого СтрокаМассива Из Массив Цикл

	   Если ТЗ.Колонки.Количество() = 0 Тогда 
		   
		   СписокТипов = Новый Массив;
		   СписокТипов.Добавить(Тип("Строка"));
		   СписокТипов.Добавить(Тип("Число"));
		   ОписаниеСоставногоТипа = Новый ОписаниеТипов(СписокТипов);
		   
		   КвалификаторыСтроки = Новый КвалификаторыСтроки(250);
		   КвалификаторыЧисла = Новый КвалификаторыЧисла(15, 3, ДопустимыйЗнак.Любой);
           Для Каждого ЭлементМассива Из СтрокаМассива Цикл
               ТЗ.Колонки.Добавить(ЭлементМассива.Ключ, Новый ОписаниеТипов(ОписаниеСоставногоТипа, ,,КвалификаторыЧисла,КвалификаторыСтроки));
           КонецЦикла;
       КонецЕсли;

       НоваяСтрока = ТЗ.Добавить();
       Для Каждого ЭлементМассива Из СтрокаМассива Цикл
           НоваяСтрока[ЭлементМассива.Ключ] = ЭлементМассива.Значение;
       КонецЦикла;
   КонецЦикла;

   Возврат ТЗ;

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

&НаСервере
Функция ПодготовитьДанныеДляЗаписиВРегистр(ТЗ)
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ДанныеССервера.Артикул КАК Артикул,
	|	ДанныеССервера.Склад КАК Склад,
	|	ДанныеССервера.Количество КАК Количество
	|ПОМЕСТИТЬ вт_ДанныеССервера
	|ИЗ
	|	&ДанныеССервера КАК ДанныеССервера
	|;
    |
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	Беру_SKUТоваров.Номенклатура КАК Номенклатура,
	|	вт_ДанныеССервера.Артикул КАК Артикул,
	|	вт_ДанныеССервера.Склад КАК Склад,
	|	вт_ДанныеССервера.Количество КАК Количество
	|ИЗ
	|	вт_ДанныеССервера КАК вт_ДанныеССервера
	|ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Беру_SKUТоваров КАК Беру_SKUТоваров
	|	ПО (вт_ДанныеССервера.Артикул = Беру_SKUТоваров.shopSku)";
	
	Запрос.УстановитьПараметр("ДанныеССервера", ТЗ);  
	
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	МассивДанных = Новый Массив;
	
	Пока Выборка.Следующий() Цикл  
		СтруктураДанных = Новый Структура;
		СтруктураДанных.Вставить("Номенклатура", Выборка.Номенклатура);
		СтруктураДанных.Вставить("Артикул", Выборка.Артикул);
		СтруктураДанных.Вставить("Склад", Выборка.Склад);
		СтруктураДанных.Вставить("Количество", Выборка.Количество);
		
		МассивДанных.Добавить(СтруктураДанных);
	КонецЦикла;
	
	Возврат МассивДанных;
	
КонецФункции

&НаСервере
Функция ПолучитьМассивАртикулов()
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	Беру_SKUТоваров.shopSku КАК shopSku
	|	ИЗ
	|	РегистрСведений.Беру_SKUТоваров КАК Беру_SKUТоваров";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если не РезультатЗапроса.Пустой() Тогда   
		
		МассивАртикулов = Новый Массив;
		Выборка = РезультатЗапроса.Выбрать();
		
		Пока Выборка.Следующий() Цикл
			МассивАртикулов.Добавить(Выборка.shopSku);	
		КонецЦикла; 
		
		Возврат МассивАртикулов;
		
	КонецЕСлИ;
	
	Возврат Неопределено;
КонецФункции
Показать
starik-2005; +1 2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. coollerinc 189 12.09.23 15:37 Сейчас в теме
(1) Вот что поиск предлагает: там судя по всему это готовое решение от самого Яндекса.

https://yandex.ru/support/marketplace-module-1c/install.html
IzendeevS; +1 Ответить
2. Fleasy 12.09.23 15:35 Сейчас в теме
&НаКлиенте
Процедура ПолучитьДанные(Команда)
	ПолучитьДанныеНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ПолучитьДанныеНаСервере()   
	

	ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
	Соединение = Новый HTTPСоединение("api.partner.market.yandex.ru",,,,,,ЗащищенноеСоединение);
	
	Токен = "Bearer <ТОКЕН>";
	ИдКомпании = "<id Компании>";  
	 
	АдресЗапроса = СтрШаблон("campaigns/%1/stats/skus", ИдКомпании);  
	
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("Authorization", Токен);
	
	Запрос = Новый HTTPЗапрос(АдресЗапроса, Заголовки);
	
	МассивАртикулов = ПолучитьМассивАртикулов();
	
	Если МассивАртикулов = Неопределено Тогда
		Возврат;	
	КонецЕСли;
	
	ДанныеСтруктура = Новый Структура;
	ДанныеСтруктура.Вставить("shopSkus", МассивАртикулов);
	
	
	ЗаписьJSON = Новый ЗаписьJSON;
	ЗаписьJSON.УстановитьСтроку();
	ЗаписатьJSON(ЗаписьJSON, ДанныеСтруктура);
	СтрокаJSON = ЗаписьJSON.Закрыть(); 
	
	Запрос.УстановитьТелоИзСтроки(СтрокаJSON);
	
	Попытка
		Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
	Исключение
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Не удалось получить данные: " + ОписаниеОшибки();
		Сообщение.Сообщить();
		Возврат;
	КонецПопытки;  
		
	Если Ответ.КодСостояния = 200 Тогда
		ТелоОтвета = Ответ.ПолучитьТелоКакСтроку();
		ЧтениеJSON = Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(ТелоОтвета);
		ДанныеПоТоварам = ПрочитатьJSON(ЧтениеJSON, Истина);
	Иначе
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = СтрШаблон("Не удалось получить данные, код: %1, ответ: %2", Ответ.КодСостояния, Ответ.ПолучитьТелоКакСтроку());
		Сообщение.Сообщить();
		Возврат;	
	КонецЕСлИ;    
	
	
	Если ДанныеПоТоварам["result"]["shopSkus"].Количество() > 0 Тогда 
		
		МассивТоваров = ДанныеПоТоварам["result"]["shopSkus"];  
		
		МассивТоваровДляТЗ = Новый Массив;
		
		Для каждого Товар из МассивТоваров Цикл   
			
			Для каждого Склад из Товар["warehouses"] Цикл   
				
				ТоварСтруктура = Новый Структура;
				
				ТоварСтруктура.Вставить("Артикул", Товар["shopSku"]);
				ТоварСтруктура.Вставить("Товар", Товар["name"]);
                ТоварСтруктура.Вставить("Склад", Склад["name"]); 
				
				Для каждого ТипОстатка из Склад["stocks"] Цикл
					Если ТипОстатка["type"] = "AVAILABLE" Тогда
						ТоварСтруктура.Вставить("Количество", ТипОстатка["count"]);
						МассивТоваровДляТЗ.Добавить(ТоварСтруктура);
					КонецЕСли;
				КонецЦикла;
				
			КонецЦикла;			
		КонецЦикла;
		
		
		Если МассивТоваровДляТЗ.Количество() > 0 Тогда
			НаборЗаписей = РегистрыСведений.Progress_АктуальныеОстаткиТоваровНаСкладах.СоздатьНаборЗаписей();
			НаборЗаписей.Отбор.Маркетплейс.Установить("Yandex");
			НаборЗаписей.Записать(); 	
			
			ТЗ = ПреобразованиеМассивВТаблицуЗначений(МассивТоваровДляТЗ);   
			
			МассивДанных = ПодготовитьДанныеДляЗаписиВРегистр(ТЗ);    
			
			Для каждого Товар из МассивДанных Цикл
				МЗ = РегистрыСведений.Progress_АктуальныеОстаткиТоваровНаСкладах.СоздатьМенеджерЗаписи();
				
				МЗ.Маркетплейс = "Yandex";
				МЗ.Номенклатура = Товар.Номенклатура;
				МЗ.Артикул = Товар.Артикул;
				МЗ.Склад = Товар.Склад;
				МЗ.Количество = Товар.Количество; 
				МЗ.Записать();	
				
			КонецЦикла; 	
				
		КонецЕсли;		   
	КонецЕСлИ;
	
КонецПроцедуры  

&НаСервере
Функция ПреобразованиеМассивВТаблицуЗначений(Массив)

   ТЗ = Новый ТаблицаЗначений;

   Для Каждого СтрокаМассива Из Массив Цикл

	   Если ТЗ.Колонки.Количество() = 0 Тогда 
		   
		   СписокТипов = Новый Массив;
		   СписокТипов.Добавить(Тип("Строка"));
		   СписокТипов.Добавить(Тип("Число"));
		   ОписаниеСоставногоТипа = Новый ОписаниеТипов(СписокТипов);
		   
		   КвалификаторыСтроки = Новый КвалификаторыСтроки(250);
		   КвалификаторыЧисла = Новый КвалификаторыЧисла(15, 3, ДопустимыйЗнак.Любой);
           Для Каждого ЭлементМассива Из СтрокаМассива Цикл
               ТЗ.Колонки.Добавить(ЭлементМассива.Ключ, Новый ОписаниеТипов(ОписаниеСоставногоТипа, ,,КвалификаторыЧисла,КвалификаторыСтроки));
           КонецЦикла;
       КонецЕсли;

       НоваяСтрока = ТЗ.Добавить();
       Для Каждого ЭлементМассива Из СтрокаМассива Цикл
           НоваяСтрока[ЭлементМассива.Ключ] = ЭлементМассива.Значение;
       КонецЦикла;
   КонецЦикла;

   Возврат ТЗ;

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

&НаСервере
Функция ПодготовитьДанныеДляЗаписиВРегистр(ТЗ)
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ДанныеССервера.Артикул КАК Артикул,
	|	ДанныеССервера.Склад КАК Склад,
	|	ДанныеССервера.Количество КАК Количество
	|ПОМЕСТИТЬ вт_ДанныеССервера
	|ИЗ
	|	&ДанныеССервера КАК ДанныеССервера
	|;
    |
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	Беру_SKUТоваров.Номенклатура КАК Номенклатура,
	|	вт_ДанныеССервера.Артикул КАК Артикул,
	|	вт_ДанныеССервера.Склад КАК Склад,
	|	вт_ДанныеССервера.Количество КАК Количество
	|ИЗ
	|	вт_ДанныеССервера КАК вт_ДанныеССервера
	|ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Беру_SKUТоваров КАК Беру_SKUТоваров
	|	ПО (вт_ДанныеССервера.Артикул = Беру_SKUТоваров.shopSku)";
	
	Запрос.УстановитьПараметр("ДанныеССервера", ТЗ);  
	
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	МассивДанных = Новый Массив;
	
	Пока Выборка.Следующий() Цикл  
		СтруктураДанных = Новый Структура;
		СтруктураДанных.Вставить("Номенклатура", Выборка.Номенклатура);
		СтруктураДанных.Вставить("Артикул", Выборка.Артикул);
		СтруктураДанных.Вставить("Склад", Выборка.Склад);
		СтруктураДанных.Вставить("Количество", Выборка.Количество);
		
		МассивДанных.Добавить(СтруктураДанных);
	КонецЦикла;
	
	Возврат МассивДанных;
	
КонецФункции

&НаСервере
Функция ПолучитьМассивАртикулов()
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	Беру_SKUТоваров.shopSku КАК shopSku
	|	ИЗ
	|	РегистрСведений.Беру_SKUТоваров КАК Беру_SKUТоваров";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Если не РезультатЗапроса.Пустой() Тогда   
		
		МассивАртикулов = Новый Массив;
		Выборка = РезультатЗапроса.Выбрать();
		
		Пока Выборка.Следующий() Цикл
			МассивАртикулов.Добавить(Выборка.shopSku);	
		КонецЦикла; 
		
		Возврат МассивАртикулов;
		
	КонецЕСлИ;
	
	Возврат Неопределено;
КонецФункции
Показать
starik-2005; +1 2 Ответить
4. shira84 223 12.09.23 15:52 Сейчас в теме
У яндекс маркета для партнеров есть свое готовое расширение под УТ 11, вполне рабочее, опубликовываете базу на веб сервере, ssl, в лк меняете режим работы и можно работать. У них же есть инструкции как, что сделать.
5. пользователь 12.09.23 15:59
Сообщение было скрыто модератором.
...
6. Fleasy 12.09.23 18:45 Сейчас в теме
(5)
Это всего лишь пример, задачу которая стояла, выполняет.
7. пользователь 12.09.23 19:11
Сообщение было скрыто модератором.
...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот