#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ДляВызоваИзДругихПодсистем
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЗначениеРазрешено(УчетнаяЗапись.Организация, ПустаяСсылка КАК Истина)
| И ЗначениеРазрешено(УчетнаяЗапись.Партнер, ПустаяСсылка КАК Истина)
| И ЗначениеРазрешено(НоменклатураПартнера.Владелец, ПустаяСсылка КАК Истина)";
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Функция ЗаписатьЗагруженныеДанныеСТорговойПлощадки(ВидМаркетплейса, ИмпортируемыеТовары) Экспорт
Ошибка = ИнтеграцияСМаркетплейсамиСервер.НоваяОшибка();
СобытиеЖурналаРегистрации = ИнтеграцияСМаркетплейсамиСервер.СобытиеЖурналаРегистрации(ВидМаркетплейса);
Если ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.МаркетплейсЯндексМаркет Тогда
КодОшибки = "ЯндексМаркет_ЗаписатьЗагруженныеДанныеСТорговойПлощадки";
ИначеЕсли ВидМаркетплейса = Перечисления.ВидыМаркетплейсов.Маркетплейс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);
Возврат Ошибка;
КонецФункции
#КонецОбласти
#КонецЕсли