Импортируемые товары торговых площадок / Модуль менеджера

файл

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Позволяет указать объекты метаданных, для которых задана логика ограничения доступа к данным.
//
// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
		"РазрешитьЧтениеИзменение
		|ГДЕ
		|	ЗначениеРазрешено(УчетнаяЗапись.Организация, ПустаяСсылка КАК Истина)
		|	И ЗначениеРазрешено(УчетнаяЗапись.Партнер, ПустаяСсылка КАК Истина)
		|	И ЗначениеРазрешено(НоменклатураПартнера.Владелец, ПустаяСсылка КАК Истина)";
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

#КонецОбласти

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Выполняет перенос сопоставленных позиций товарного каталога в регистр сведений "Статусы публикации товаров". 
//
// Параметры:      
//   ВидМаркетплейса     - ПеречислениеСсылка.ВидыМаркетплейсов - вид маркетплейса.
//   ИмпортируемыеТовары - ТаблицаЗначений - позиции товарного каталога к переносу:
//     * УчетнаяЗапись        - СправочникСсылка.УчетныеЗаписиМаркетплейсов - учетная запись подключения к сервису;
//     * НоменклатураПартнера - СправочникСсылка.НоменклатураКонтрагентов - номенклатура сервиса.
//
// Возвращаемое значение:
//   См. ИнтеграцияСМаркетплейсамиСервер.НоваяОшибка.
//
Функция ЗаписатьЗагруженныеДанныеСТорговойПлощадки(ВидМаркетплейса, ИмпортируемыеТовары) Экспорт
	
	Ошибка = ИнтеграцияСМаркетплейсамиСервер.НоваяОшибка();
	СобытиеЖурналаРегистрации = ИнтеграцияСМаркетплейсамиСервер.СобытиеЖурналаРегистрации(ВидМаркетплейса);
	
	Если ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.МаркетплейсЯндексМаркет Тогда
		КодОшибки                 = "ЯндексМаркет_ЗаписатьЗагруженныеДанныеСТорговойПлощадки";
	ИначеЕсли ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.МаркетплейсOzon Тогда
		КодОшибки                 = "Ozon_ЗаписатьЗагруженныеДанныеСТорговойПлощадки";
	Иначе
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Неизвестный вид торговой площадки %1.'",
				ОбщегоНазначения.КодОсновногоЯзыка()),
			ВидМаркетплейса);
		
		Ошибка.КодОшибки      = "ЗаписатьЗагруженныеДанныеСТорговойПлощадки";
		Ошибка.ОписаниеОшибки = ТекстОшибки;
			
		Возврат Ошибка;
	КонецЕсли;
	
	Если ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.МаркетплейсЯндексМаркет
			И Не ПолучитьФункциональнуюОпцию("ИспользоватьИнтеграциюСЯндексМаркет") Тогда
		ТекстОшибки = НСтр("ru = 'Интеграция с Яндекс Маркет не используется.'", 
			ОбщегоНазначения.КодОсновногоЯзыка());
		
		ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации,
			УровеньЖурналаРегистрации.Ошибка,,,
			ТекстОшибки);
				
		Ошибка.КодОшибки      = "ЯндексМаркет_ИспользоватьИнтеграциюСЯндексМаркет";
		Ошибка.ОписаниеОшибки = ТекстОшибки;
		
		Возврат Ошибка;
		
	ИначеЕсли ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.МаркетплейсOzon
			И Не ПолучитьФункциональнуюОпцию("ИспользоватьИнтеграциюСOzon") Тогда
		ТекстОшибки = НСтр("ru = 'Интеграция с Ozon не используется.'", 
			ОбщегоНазначения.КодОсновногоЯзыка());
		
		ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации,
			УровеньЖурналаРегистрации.Ошибка,,,
			ТекстОшибки);
				
		Ошибка.КодОшибки      = "Озон_ИспользоватьИнтеграциюСOzon";
		Ошибка.ОписаниеОшибки = ТекстОшибки;
		
		Возврат Ошибка;
	КонецЕсли;
	
	Замер = ОценкаПроизводительности.НачатьЗамерДлительнойОперации(
		"РегистрСведений.ИмпортируемыеТоварыТорговыхПлощадок.ЗаписатьЗагруженныеДанныеСТорговойПлощадки");
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ИмпортируемыеТовары.УчетнаяЗапись КАК УчетнаяЗапись,
		|	ИмпортируемыеТовары.НоменклатураПартнера КАК НоменклатураПартнера
		|ПОМЕСТИТЬ ВТ_ИмпортируемыеТовары
		|ИЗ
		|	&ИмпортируемыеТовары КАК ИмпортируемыеТовары
		|ГДЕ
		|	ИмпортируемыеТовары.НоменклатураПартнера <> ЗНАЧЕНИЕ(Справочник.НоменклатураКонтрагентов.ПустаяСсылка)
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	УчетнаяЗапись,
		|	НоменклатураПартнера
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ИмпортируемыеТовары.УчетнаяЗапись КАК УчетнаяЗапись,
		|	ИмпортируемыеТовары.НоменклатураПартнера КАК НоменклатураПартнера,
		|	СправочникНоменклатураКонтрагентов.Наименование КАК ПредставлениеТовара,
		|	СправочникНоменклатураКонтрагентов.Идентификатор КАК Идентификатор,
		|	СправочникНоменклатураКонтрагентов.ИдентификаторНоменклатуры КАК ИдентификаторТовараПлощадки,
		|	СправочникНоменклатураКонтрагентов.НаименованиеНоменклатуры КАК НаименованиеТовараПлощадки,
		|	ЕСТЬNULL(СтатусыПубликацииОбъектов.Номенклатура, СправочникНоменклатураКонтрагентов.Номенклатура) КАК Номенклатура,
		|	ЕСТЬNULL(СтатусыПубликацииОбъектов.Характеристика, СправочникНоменклатураКонтрагентов.Характеристика) КАК Характеристика,
		|	ЕСТЬNULL(СтатусыПубликацииОбъектов.Упаковка, ВЫБОР
		|			КОГДА СправочникНоменклатураКонтрагентов.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
		|				ТОГДА ЕСТЬNULL(СправочникНоменклатура.ЕдиницаИзмерения, ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка))
		|			ИНАЧЕ СправочникНоменклатураКонтрагентов.Упаковка
		|		КОНЕЦ) КАК Упаковка
		|ИЗ
		|	ВТ_ИмпортируемыеТовары КАК ИмпортируемыеТовары
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатураКонтрагентов КАК СправочникНоменклатураКонтрагентов
		|		ПО (СправочникНоменклатураКонтрагентов.Ссылка = ИмпортируемыеТовары.НоменклатураПартнера)
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СправочникНоменклатура
		|		ПО (СправочникНоменклатура.Ссылка = СправочникНоменклатураКонтрагентов.Номенклатура)
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусыПубликацииТоваровЯндексМаркет КАК СтатусыПубликацииОбъектов
		|		ПО (СтатусыПубликацииОбъектов.УчетнаяЗапись = ИмпортируемыеТовары.УчетнаяЗапись)
		|			И (СтатусыПубликацииОбъектов.ИдентификаторПредложения = СправочникНоменклатураКонтрагентов.Идентификатор)
		|ГДЕ
		|	(ИмпортируемыеТовары.УчетнаяЗапись, ИмпортируемыеТовары.НоменклатураПартнера) В
		|			(ВЫБРАТЬ
		|				ИмпортируемыеТоварыТорговыхПлощадок.УчетнаяЗапись,
		|				ИмпортируемыеТоварыТорговыхПлощадок.НоменклатураПартнера
		|			ИЗ
		|				РегистрСведений.ИмпортируемыеТоварыТорговыхПлощадок КАК ИмпортируемыеТоварыТорговыхПлощадок)";
	
	Если ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.МаркетплейсЯндексМаркет Тогда
		ИмяРегистраСведений       = "СтатусыПубликацииТоваровЯндексМаркет";
		ИмяИзмеренияУчетнаяЗапись = "УчетнаяЗапись";
		ИмяРесурсаИдентификатор   = "ИдентификаторПредложения";
	ИначеЕсли ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.МаркетплейсOzon Тогда
		ИмяРегистраСведений       = "СтатусыПубликацииОбъектовМаркетплейсаOzon";
		ИмяИзмеренияУчетнаяЗапись = "УчетнаяЗаписьМаркетплейса";
		ИмяРесурсаИдентификатор   = "ИдентификаторПубликации";
	КонецЕсли;
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"РегистрСведений.СтатусыПубликацииТоваровЯндексМаркет",
		"РегистрСведений." + ИмяРегистраСведений);
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"СтатусыПубликацииОбъектов.УчетнаяЗапись",
		"СтатусыПубликацииОбъектов." + ИмяИзмеренияУчетнаяЗапись);
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"СтатусыПубликацииОбъектов.ИдентификаторПредложения",
		"СтатусыПубликацииОбъектов." + ИмяРесурсаИдентификатор);
	
	Запрос.УстановитьПараметр("ИмпортируемыеТовары", ИмпортируемыеТовары);
	
	УстановитьПривилегированныйРежим(Истина);
	РезультатЗапроса = Запрос.Выполнить();
	УстановитьПривилегированныйРежим(Ложь);
	
	Если РезультатЗапроса.Пустой() Тогда
		ТекстОшибки = НСтр("ru = 'Сопоставленные данные для записи позиций товарного каталога отсутствуют.'",
			ОбщегоНазначения.КодОсновногоЯзыка());
		
		ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации,
			УровеньЖурналаРегистрации.Ошибка,,,
			ТекстОшибки);
		
		Ошибка.КодОшибки      = КодОшибки + "_НетДанных";
		Ошибка.ОписаниеОшибки = ТекстОшибки;
		
		Возврат Ошибка;
	КонецЕсли;
	
	ИспользоватьХарактеристикиНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры");
	ИспользоватьУпаковкиНоменклатуры       = ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры"); 
	
	Если ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.МаркетплейсЯндексМаркет Тогда
		ИдентификаторыТоваров = РезультатЗапроса.Выгрузить().ВыгрузитьКолонку("Идентификатор");
		ТаблицаТоваров = ИнтеграцияСЯндексМаркетСервер.ПолучитьТоварныйКаталог(ИмпортируемыеТовары[0].УчетнаяЗапись, ИдентификаторыТоваров);
		
		Если ТаблицаТоваров = Неопределено Тогда
			Ошибка.КодОшибки      = СобытиеЖурналаРегистрации;
			Ошибка.ОписаниеОшибки = НСтр("ru = 'При получении товарного каталога с торговой площадки возникли ошибки. Подробности см. в журнале регистрации.'");
			
			Возврат Ошибка;
		КонецЕсли;
	Иначе
		ТаблицаТоваров = Неопределено;
	КонецЕсли;
	
	НачатьТранзакцию();
	
	Попытка
		БлокировкаДанных = Новый БлокировкаДанных;
		
		ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("РегистрСведений.ИмпортируемыеТоварыТорговыхПлощадок");
		ЭлементБлокировкиДанных.ИсточникДанных = РезультатЗапроса;
		ЭлементБлокировкиДанных.ИспользоватьИзИсточникаДанных("УчетнаяЗапись", "УчетнаяЗапись");
		ЭлементБлокировкиДанных.ИспользоватьИзИсточникаДанных("НоменклатураПартнера", "НоменклатураПартнера");
		
		ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("РегистрСведений." + ИмяРегистраСведений);
		ЭлементБлокировкиДанных.ИсточникДанных = РезультатЗапроса;
		ЭлементБлокировкиДанных.ИспользоватьИзИсточникаДанных(ИмяИзмеренияУчетнаяЗапись, "УчетнаяЗапись");
		ЭлементБлокировкиДанных.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
		Если ИспользоватьХарактеристикиНоменклатуры Тогда
			ЭлементБлокировкиДанных.ИспользоватьИзИсточникаДанных("Характеристика", "Характеристика");
		КонецЕсли;
		Если ИспользоватьУпаковкиНоменклатуры Тогда
			ЭлементБлокировкиДанных.ИспользоватьИзИсточникаДанных("Упаковка", "Упаковка");
		КонецЕсли;
		
		БлокировкаДанных.Заблокировать();
		
		ВыборкаДанных = РезультатЗапроса.Выбрать();
		Пока ВыборкаДанных.Следующий() Цикл
			НаборЗаписейИмпорт = РегистрыСведений.ИмпортируемыеТоварыТорговыхПлощадок.СоздатьНаборЗаписей(); 
			НаборЗаписейИмпорт.Отбор.УчетнаяЗапись.Установить(ВыборкаДанных.УчетнаяЗапись);
			НаборЗаписейИмпорт.Отбор.НоменклатураПартнера.Установить(ВыборкаДанных.НоменклатураПартнера);
			НаборЗаписейИмпорт.Прочитать();
			
			Если НаборЗаписейИмпорт.Количество() > 0 Тогда
				Если ЗначениеЗаполнено(ТаблицаТоваров) Тогда
					Отбор = Новый Структура;
					Отбор.Вставить(ИмяИзмеренияУчетнаяЗапись, ВыборкаДанных.УчетнаяЗапись);
					Отбор.Вставить(ИмяРесурсаИдентификатор,   ВыборкаДанных.Идентификатор);
					
					ДанныеОбъекта = ТаблицаТоваров.НайтиСтроки(Отбор);
				Иначе
					ДанныеОбъекта = Неопределено;
				КонецЕсли;
				
				НаборЗаписей = РегистрыСведений[ИмяРегистраСведений].СоздатьНаборЗаписей(); 
				НаборЗаписей.Отбор[ИмяИзмеренияУчетнаяЗапись].Установить(ВыборкаДанных.УчетнаяЗапись);
				НаборЗаписей.Отбор.Номенклатура.Установить(ВыборкаДанных.Номенклатура);
				Если ИспользоватьХарактеристикиНоменклатуры Тогда
					НаборЗаписей.Отбор.Характеристика.Установить(ВыборкаДанных.Характеристика);
				КонецЕсли;                                 
				Если ИспользоватьУпаковкиНоменклатуры Тогда
					НаборЗаписей.Отбор.Упаковка.Установить(ВыборкаДанных.Упаковка);
				КонецЕсли;
				НаборЗаписей.Прочитать();
				
				Если НаборЗаписей.Количество() > 0 Тогда
					Запись = НаборЗаписей[0];
				Иначе
					Запись = НаборЗаписей.Добавить();
					Запись[ИмяИзмеренияУчетнаяЗапись] = ВыборкаДанных.УчетнаяЗапись;
					Запись.Номенклатура               = ВыборкаДанных.Номенклатура;
					Запись.Характеристика             = ВыборкаДанных.Характеристика;
					Запись.Упаковка                   = ВыборкаДанных.Упаковка;
					Запись[ИмяРесурсаИдентификатор]   = ВыборкаДанных.Идентификатор;
				КонецЕсли;
					
				Если ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.МаркетплейсЯндексМаркет Тогда  
					Запись.Статус                      = НаборЗаписейИмпорт[0].Статус;
					Запись.ПредставлениеТовара         = ВыборкаДанных.ПредставлениеТовара;
					Запись.ИдентификаторТовараПлощадки = ВыборкаДанных.ИдентификаторТовараПлощадки;
					Запись.НаименованиеТовараПлощадки  = ВыборкаДанных.НаименованиеТовараПлощадки;
					Запись.НоменклатураПартнера        = ВыборкаДанных.НоменклатураПартнера;
					
					Если ЗначениеЗаполнено(ДанныеОбъекта) Тогда
						Запись.ПредставлениеТовара           = ДанныеОбъекта[0].ПредставлениеТовара;
						Запись.ИдентификаторТовараПлощадки   = ДанныеОбъекта[0].ИдентификаторКарточкиТовара;
						Запись.НаименованиеКатегорииПлощадки = ДанныеОбъекта[0].НаименованиеКатегории;
						Запись.НаименованиеМоделиПлощадки    = ДанныеОбъекта[0].НаименованиеМодели;
						Запись.ОписаниеОшибки                = ДанныеОбъекта[0].ОписаниеОшибки;
						Запись.ТоварнаяКатегория             = ДанныеОбъекта[0].ТоварнаяКатегория;
					КонецЕсли;
					
					Если Запись.ИдентификаторТовараПлощадки = Запись[ИмяРесурсаИдентификатор] Тогда
						Запись.ИдентификаторТовараПлощадки = "";
					КонецЕсли;
					
					НаборЗаписей.Записать(Истина);
				КонецЕсли;
				
				НаборЗаписейИмпорт.Очистить();
				НаборЗаписейИмпорт.Записать(Истина);
			КонецЕсли;
		КонецЦикла;
		
		ЗафиксироватьТранзакцию();
		
	Исключение
		ОтменитьТранзакцию();
		
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'При записи позиций товарного каталога возникли ошибки %1.'",
				ОбщегоНазначения.КодОсновногоЯзыка()),
			ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		
		ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации,
			УровеньЖурналаРегистрации.Ошибка,,,
			ТекстОшибки);
				
		Ошибка.КодОшибки      = КодОшибки;
		Ошибка.ОписаниеОшибки = ТекстОшибки;
			
		Возврат Ошибка;
	КонецПопытки;
	
	ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(
		Замер, 
		ИмпортируемыеТовары.Количество() / 10);
	
	Возврат Ошибка;
	
КонецФункции

#КонецОбласти

#КонецЕсли

Связанные материалы