Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Черновик: загрузка товаров (кастомизация)



Б24_Синхр_ЗагрузкаВызовСервера
Функция ЗагрузитьОбновитьТовары(пОбщиеНастройки, мДанных) Экспорт
   
   Результат = Новый Массив; 
   
   ОбщиеНастройки = Новый Структура;
   Для Каждого ЭлементСтруктуры Из пОбщиеНастройки Цикл
      ОбщиеНастройки.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
   КонецЦикла;   
   
   Б24_Синхр_СинхронизацияВызовСервера.ДобавитьСложныеНастройкиОбменаВСтруктуру(ОбщиеНастройки);
   
#Область ИдентификаторыСлужебныхСвойств      
   ИдСвойстваВидаНоменклатуры    = Б24_Синхр_СинхронизацияВызовСервера.ПолучитьИдОбъекта(ОбщиеНастройки.НастройкаСинхронизации,ОбщиеНастройки.ПредопределенноеСвойствоВидаНоменклатуры, ОбщиеНастройки.ТипыОбъектовОбмена.СвойствоТовара); 
   ОбщиеНастройки.Вставить("ИдПредопределенногоСвойстваВидаНоменклатуры", ИдСвойстваВидаНоменклатуры);
   
   ИдСвойстваАртикулаНоменклатуры    = Б24_Синхр_СинхронизацияВызовСервера.ПолучитьИдОбъекта(ОбщиеНастройки.НастройкаСинхронизации,ОбщиеНастройки.ПредопределенноеСвойствоАртикулНоменклатуры, ОбщиеНастройки.ТипыОбъектовОбмена.СвойствоТовара); 
   ОбщиеНастройки.Вставить("ИдПредопределенногоСвойстваАртикулаНоменклатуры", ИдСвойстваАртикулаНоменклатуры);
   
#КонецОбласти
   
   ЕстьДеревоГрупп = Б24_Синхр_СинхронизацияПовтИсп.ЕстьПользовательскоеДеревоГрупп(ОбщиеНастройки.НастройкаСинхронизации);
   Если ЕстьДеревоГрупп Тогда
      тзнПользовательскогоДереваГрупп = ПолучитьТаблицуТоваровИДереваГрупп(ОбщиеНастройки);
   КонецЕсли;
   
   МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   
#Область ФормированиеВременныхТаблицДанных      
   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
   Запрос.УстановитьПараметр("ТипДанныхТовара"         , ОбщиеНастройки.ТипыОбъектовОбмена.Товар);
   Запрос.УстановитьПараметр("ТипДанныхЕдиницИзмерения", ОбщиеНастройки.ТипыОбъектовОбмена.ЕдиницаИзмерения);
   Запрос.УстановитьПараметр("ТипДанныхГрупп"         , ОбщиеНастройки.ТипыОбъектовОбмена.ГруппаТовара);
   Запрос.УстановитьПараметр("ТипДанныхЗначенийСвойств", ОбщиеНастройки.ТипыОбъектовОбмена.ЗначениеСвойстваТовара);
   Запрос.УстановитьПараметр("Портал"               , ОбщиеНастройки.Портал);
   
   Запрос.Текст = "ВЫБРАТЬ
   |   Б24_Синхр_ИдентификаторыОбъектов.Объект КАК Объект,
   |   Б24_Синхр_ИдентификаторыОбъектов.ПодчиненныйОбъект КАК ПодчиненныйОбъект,
   |   Б24_Синхр_ИдентификаторыОбъектов.Идентификатор КАК Идентификатор
   |ПОМЕСТИТЬ ВремИдентификаторыТоваров
   |ИЗ
   |   РегистрСведений.Б24_Синхр_ИдентификаторыОбъектов КАК Б24_Синхр_ИдентификаторыОбъектов
   |ГДЕ
   |   Б24_Синхр_ИдентификаторыОбъектов.ТипДанных = &ТипДанныхТовара
   |   И Б24_Синхр_ИдентификаторыОбъектов.Портал = &Портал
   |
   |ИНДЕКСИРОВАТЬ ПО
   |   Идентификатор
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   Б24_Синхр_ИдентификаторыОбъектов.Объект КАК Объект,
   |   Б24_Синхр_ИдентификаторыОбъектов.Идентификатор КАК Идентификатор
   |ПОМЕСТИТЬ ВремИдентификаторыЕдиницИзмерения
   |ИЗ
   |   РегистрСведений.Б24_Синхр_ИдентификаторыОбъектов КАК Б24_Синхр_ИдентификаторыОбъектов
   |ГДЕ
   |   Б24_Синхр_ИдентификаторыОбъектов.ТипДанных = &ТипДанныхЕдиницИзмерения
   |   И Б24_Синхр_ИдентификаторыОбъектов.Портал = &Портал
   |
   |ИНДЕКСИРОВАТЬ ПО
   |   Идентификатор
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   Б24_Синхр_ИдентификаторыОбъектов.Объект КАК Объект,
   |   Б24_Синхр_ИдентификаторыОбъектов.Идентификатор КАК Идентификатор
   |ПОМЕСТИТЬ ВремИдентификаторыГрупп
   |ИЗ
   |   РегистрСведений.Б24_Синхр_ИдентификаторыОбъектов КАК Б24_Синхр_ИдентификаторыОбъектов
   |ГДЕ
   |   Б24_Синхр_ИдентификаторыОбъектов.ТипДанных = &ТипДанныхГрупп
   |   И Б24_Синхр_ИдентификаторыОбъектов.Портал = &Портал
   |
   |ИНДЕКСИРОВАТЬ ПО
   |   Идентификатор
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   Б24_Синхр_ИдентификаторыОбъектов.Объект КАК Объект,
   |   Б24_Синхр_ИдентификаторыОбъектов.Идентификатор КАК Идентификатор
   |ПОМЕСТИТЬ ВремИдентификаторыЗначенийСвойств
   |ИЗ
   |   РегистрСведений.Б24_Синхр_ИдентификаторыОбъектов КАК Б24_Синхр_ИдентификаторыОбъектов
   |ГДЕ
   |   Б24_Синхр_ИдентификаторыОбъектов.ТипДанных = &ТипДанныхЗначенийСвойств
   |   И Б24_Синхр_ИдентификаторыОбъектов.Портал = &Портал
   |
   |ИНДЕКСИРОВАТЬ ПО
   |   Идентификатор
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   ВремИдентификаторыЗначенийСвойств.Идентификатор КАК Идентификатор,
   |   ВидыНоменклатуры.Ссылка КАК Объект
   |ПОМЕСТИТЬ ВремИдВидовНоменклатуры
   |ИЗ
   |   Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры
   |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
   |         ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремИдентификаторыЗначенийСвойств КАК ВремИдентификаторыЗначенийСвойств
   |         ПО ЗначенияСвойствОбъектов.Ссылка = ВремИдентификаторыЗначенийСвойств.Объект
   |      ПО ВидыНоменклатуры.Наименование = ЗначенияСвойствОбъектов.Наименование
   |
   |ИНДЕКСИРОВАТЬ ПО
   |   Идентификатор
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   Номенклатура.Ссылка КАК Объект,
   |   Номенклатура.Наименование КАК Идентификатор
   |ПОМЕСТИТЬ ВремНаименованияТоваров
   |ИЗ
   |   Справочник.Номенклатура КАК Номенклатура
   |ГДЕ
   |   Номенклатура.ЭтоГруппа = ЛОЖЬ
   |
   |ИНДЕКСИРОВАТЬ ПО
   |   Идентификатор
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   ХарактеристикиНоменклатуры.Ссылка КАК Объект,
   |   ХарактеристикиНоменклатуры.Наименование КАК Идентификатор
   |ПОМЕСТИТЬ ВремНаименованияХарактеристикТоваров
   |ИЗ
   |   Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
   |
   |ИНДЕКСИРОВАТЬ ПО
   |   Идентификатор";   
   Запрос.Выполнить();
#КонецОбласти   
   
   ЗапросПоСвойствамТоваров = Новый Запрос;
   ЗапросПоСвойствамТоваров.УстановитьПараметр("ТипДанных"         , ОбщиеНастройки.ТипыОбъектовОбмена.СвойствоТовара);
   ЗапросПоСвойствамТоваров.УстановитьПараметр("Портал"            , ОбщиеНастройки.Портал);
   ЗапросПоСвойствамТоваров.УстановитьПараметр("СвойстваИсключения"   , ОбщиеНастройки.НеЗагружаемыеЗначенияСвойств);
   
   ЗапросПоСвойствамТоваров.Текст = "ВЫБРАТЬ
   |   ДополнительныеРеквизиты.Ссылка КАК Набор,
   |   ДополнительныеРеквизиты.Свойство КАК Свойство,
   |   ВЫБОР
   |      КОГДА ДополнительныеРеквизиты.Ссылка В ИЕРАРХИИ (ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура))
   |         ТОГДА ИСТИНА
   |      ИНАЧЕ ЛОЖЬ
   |   КОНЕЦ КАК ЭтоСвойствоНоменклатуры
   |ПОМЕСТИТЬ ВремВсеНаборы
   |ИЗ
   |   Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты
   |
   |ОБЪЕДИНИТЬ ВСЕ
   |
   |ВЫБРАТЬ
   |   ДополнительныеСведения.Ссылка,
   |   ДополнительныеСведения.Свойство,
   |   ВЫБОР
   |      КОГДА ДополнительныеСведения.Ссылка В ИЕРАРХИИ (ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура))
   |         ТОГДА ИСТИНА
   |      ИНАЧЕ ЛОЖЬ
   |   КОНЕЦ
   |ИЗ
   |   Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеСведения КАК ДополнительныеСведения
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВремВсеНаборы.Набор) КАК Набор,
   |   ВремВсеНаборы.Свойство КАК Свойство,
   |   ДополнительныеРеквизитыИСведения.ЭтоДополнительноеСведение КАК ЭтоДополнительноеСведение,
   |   ВремВсеНаборы.ЭтоСвойствоНоменклатуры КАК ЭтоСвойствоНоменклатуры
   |ПОМЕСТИТЬ ВремСвойстваНаборы
   |ИЗ
   |   ВремВсеНаборы КАК ВремВсеНаборы
   |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
   |      ПО ВремВсеНаборы.Свойство = ДополнительныеРеквизитыИСведения.Ссылка
   |ГДЕ
   |   НЕ ДополнительныеРеквизитыИСведения.Ссылка В (&СвойстваИсключения)
   |
   |СГРУППИРОВАТЬ ПО
   |   ВремВсеНаборы.Свойство,
   |   ДополнительныеРеквизитыИСведения.ЭтоДополнительноеСведение,
   |   ВремВсеНаборы.ЭтоСвойствоНоменклатуры
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |УНИЧТОЖИТЬ ВремВсеНаборы
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |   ВремСвойстваНаборы.Свойство КАК Объект,
   |   Б24_Синхр_ИдентификаторыОбъектов.Идентификатор КАК Идентификатор,
   |   ВремСвойстваНаборы.ЭтоДополнительноеСведение КАК ЭтоДополнительноеСведение,
   |   ВремСвойстваНаборы.ЭтоСвойствоНоменклатуры КАК ЭтоСвойствоНоменклатуры
   |ИЗ
   |   РегистрСведений.Б24_Синхр_ИдентификаторыОбъектов КАК Б24_Синхр_ИдентификаторыОбъектов
   |      ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВремСвойстваНаборы КАК ВремСвойстваНаборы
   |      ПО Б24_Синхр_ИдентификаторыОбъектов.Объект = ВремСвойстваНаборы.Свойство
   |ГДЕ
   |   Б24_Синхр_ИдентификаторыОбъектов.ТипДанных = &ТипДанных
   |   И Б24_Синхр_ИдентификаторыОбъектов.Портал = &Портал
   |   И Б24_Синхр_ИдентификаторыОбъектов.Идентификатор <> """"";

   
   тзнСвойств = ЗапросПоСвойствамТоваров.Выполнить().Выгрузить();
   
   ЗагруженныеОбъекты = Новый Массив;
   
   Для каждого ТекЭлемент Из мДанных Цикл   
      
      ИдЭлемента       = Формат(ТекЭлемент.Получить("ID"),"ЧГ=0");
      
      Если ЗагруженныеОбъекты.Найти(ИдЭлемента) <> Неопределено Тогда
         Результат.Добавить((СформироватьПростуюСтруктуруСИд(ИдЭлемента, Истина)));
         Продолжить;   
      КонецЕсли;
      ЗагруженныеОбъекты.Добавить(ИдЭлемента);
      
      ИдВнешнийОбщий   = Строка(ТекЭлемент.Получить("XML_ID"));
      ИдРодителя       = Формат(ТекЭлемент.Получить("SECTION_ID"),"ЧГ=0");
      Наименование   = Строка(ТекЭлемент.Получить("NAME"));
      НаименованиеП   = Строка(ТекЭлемент.Получить("DESCRIPTION"));
      ИдЕдИзм         = Формат(ТекЭлемент.Получить("MEASURE"),"ЧГ=0");
      Активность      = ТекЭлемент.Получить("ACTIVE") = "Y";
      
      СтавкаНДС      = Строка(ТекЭлемент.Получить("VAT_ID"));
      //Цена         = Строка(ТекЭлемент.Получить("PRICE"));
      //Валюта         = Формат(ТекЭлемент.Получить("CURRENCY_ID"), "ЧГ=0");
      ДетальнаяКартинка = ТекЭлемент.Получить("DETAIL_PICTURE");
      
      ВидТовара   = ТекЭлемент.Получить("PROPERTY_" + ОбщиеНастройки.ИдПредопределенногоСвойстваВидаНоменклатуры);
      ИдВидаТовара = ?(ВидТовара = Неопределено, Неопределено, ВидТовара.Получить("value"));
      
      АртикулДанные   = ТекЭлемент.Получить("PROPERTY_" + ОбщиеНастройки.ИдПредопределенногоСвойстваАртикулаНоменклатуры);
      АртикулТовара = ?(АртикулДанные = Неопределено, Неопределено, АртикулДанные.Получить("value"));
      
      СтруктураИдентификаторовТовара = Б24_Синхр_СинхронизацияВызовСервера.ПолучитьДвеСоставныеЧастиИзСтроки(ИдВнешнийОбщий, "#");
      ИдВнешнийНоменклатуры    = СтруктураИдентификаторовТовара.ПерваяЧасть;
      ИдВнешнийХарактеристики = СтруктураИдентификаторовТовара.ВтораяЧасть;
      
      Если ИдВнешнийХарактеристики = "" Тогда
         ЕстьХарактеристика       = Ложь;
      Иначе
         ЕстьХарактеристика       = Истина;
      КонецЕсли;
      
      Если ЕстьХарактеристика Тогда
         СтруктураИдентификаторовТовара = Б24_Синхр_СинхронизацияВызовСервера.ПолучитьДвеСоставныеЧастиИзСтроки(Наименование, Б24_Синхр_СинхронизацияСервер.ПолучитьРазделительНаименованийНоменклатуры());
         
         НаименованиеНоменклатуры      = СтруктураИдентификаторовТовара.ПерваяЧасть;   
         НаименованиеХарактеристики      = СтруктураИдентификаторовТовара.ВтораяЧасть;   
         
         СтруктураИдентификаторовТовара  = Б24_Синхр_СинхронизацияВызовСервера.ПолучитьДвеСоставныеЧастиИзСтроки(НаименованиеП, Б24_Синхр_СинхронизацияСервер.ПолучитьРазделительНаименованийНоменклатуры());
         
         ПолноеНаименованиеНоменклатуры   = СтруктураИдентификаторовТовара.ПерваяЧасть;   
         ПолноеНаименованиеХарактеристики= СтруктураИдентификаторовТовара.ВтораяЧасть;   
      Иначе
         НаименованиеНоменклатуры      = Наименование;   
         ПолноеНаименованиеНоменклатуры    = НаименованиеП;   
         
         НаименованиеХарактеристики      = "";   
         ПолноеНаименованиеХарактеристики= "";   
      КонецЕсли;
      
      ТаблицаСвойствТовара = РазобратьСвойстваТовараВТаблицу(ОбщиеНастройки, МенеджерВременныхТаблиц, ТекЭлемент, тзнСвойств);
      
#Область ПоискТовара   
      
      ИнформацияОНоменклатуре = Неопределено;   
      
      Запрос = Новый Запрос;
      Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
      Запрос.УстановитьПараметр("Идентификатор"   , ИдЭлемента);
      Запрос.УстановитьПараметр("Портал"         , ОбщиеНастройки.Портал);
      
      Запрос.Текст = "ВЫБРАТЬ
      |   ВремИдентификаторы.Объект КАК Объект,
      |   ВремИдентификаторы.ПодчиненныйОбъект КАК ПодчиненныйОбъект
      |ИЗ
      |   ВремИдентификаторыТоваров КАК ВремИдентификаторы
      |ГДЕ
      |   ВремИдентификаторы.Идентификатор = &Идентификатор";
      
      ВыполненныйЗапрос = Запрос.Выполнить();
      
      Если НЕ ВыполненныйЗапрос.Пустой() Тогда
         Выборка = ВыполненныйЗапрос.Выбрать();
         Пока Выборка.Следующий() Цикл
            ИнформацияОНоменклатуре = Выборка;
            Прервать;
         КонецЦикла;
      КонецЕсли;
      
      Номенклатура    = ?(ИнформацияОНоменклатуре = Неопределено, Неопределено, ИнформацияОНоменклатуре.Объект);
      Характеристика  = ?(ИнформацияОНоменклатуре = Неопределено, Неопределено, ИнформацияОНоменклатуре.ПодчиненныйОбъект);
      
      Если ЗначениеЗаполнено(ИдВнешнийНоменклатуры) И НЕ ЗначениеЗаполнено(Номенклатура) Тогда
         Номенклатура = Б24_Синхр_СинхронизацияВызовСервера.ПолучитьЗначениеПоXML(Тип("СправочникСсылка.Номенклатура"), ИдВнешнийНоменклатуры);
      КонецЕсли;
      
      Если ЗначениеЗаполнено(ИдВнешнийХарактеристики) И НЕ ЗначениеЗаполнено(Характеристика) Тогда
         Характеристика = Б24_Синхр_СинхронизацияВызовСервера.ПолучитьЗначениеПоXML(Тип("СправочникСсылка.ХарактеристикиНоменклатуры"), ИдВнешнийХарактеристики);
      КонецЕсли;
      
      
      Если НЕ ЗначениеЗаполнено(Номенклатура) Тогда
         Номенклатура = ПолучитьОбъектПоИдентификаторуИзВременнойТаблицы(МенеджерВременныхТаблиц, "ВремНаименованияТоваров", Лев(НаименованиеНоменклатуры, 100));   
      КонецЕсли;
      
      Если ЕстьХарактеристика И НЕ ЗначениеЗаполнено(Характеристика) Тогда
         Характеристика = ПолучитьОбъектПоИдентификаторуИзВременнойТаблицы(МенеджерВременныхТаблиц, "ВремНаименованияХарактеристикТоваров", Лев(НаименованиеХарактеристики, 150));   
      КонецЕсли;
      
      
      ЭтоНоваяНоменклатура    = ?(ЗначениеЗаполнено(Номенклатура), Ложь,Истина);
      ЭтоНоваяХарактеристика    = ?(ЕстьХарактеристика И НЕ ЗначениеЗаполнено(Характеристика), Истина, Ложь);
#КонецОбласти   
      
#Область ФильтрПоОбновляемымТоварам
      
      Если НЕ ЭтоНоваяНоменклатура Тогда
         ИспользованиеХарактеристик = Номенклатура.ИспользованиеХарактеристик;
         Если ИспользованиеХарактеристик <> Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.НеИспользовать Тогда
            
            Результат.Добавить((СформироватьПростуюСтруктуруСИд(ИдЭлемента, Истина)));
            
            ДанныеДляИД = Новый Структура;
            ДанныеДляИД.Вставить("Объект"            , Номенклатура);
            ДанныеДляИД.Вставить("ПодчиненныйОбъект"   , ?(Характеристика = Неопределено, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(), Характеристика));
            
            Б24_Синхр_СинхронизацияВызовСервера.ЗаписатьИдБ24Объекта(ОбщиеНастройки, ОбщиеНастройки.ТипыОбъектовОбмена.Товар, ДанныеДляИД, ИдЭлемента);
            Б24_Синхр_ОбщегоНазначенияСервер.ДобавитьВЛог(ОбщиеНастройки, ОбщиеНастройки.ВариантыОшибок.Информация, "Товары, использующие характеристики, не обновляются Из Битрикс24. Номенклатура: " + Наименование + " будет пропущена.");
            Продолжить; 
         КонецЕсли;
         
      КонецЕсли;
      
      Если НЕ (ЭтоНоваяНоменклатура ИЛИ ЭтоНоваяХарактеристика) И НЕ ОбщиеНастройки.НастройкиСинхронизацииТоваров.ОбновлятьТовары Тогда
         
         Результат.Добавить((СформироватьПростуюСтруктуруСИд(ИдЭлемента, Истина)));
         
         ДанныеДляИД = Новый Структура;
         ДанныеДляИД.Вставить("Объект"            , Номенклатура);
         ДанныеДляИД.Вставить("ПодчиненныйОбъект"   , ?(Характеристика = Неопределено, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(), Характеристика));
         
         Б24_Синхр_СинхронизацияВызовСервера.ЗаписатьИдБ24Объекта(ОбщиеНастройки, ОбщиеНастройки.ТипыОбъектовОбмена.Товар, ДанныеДляИД, ИдЭлемента);
         
         Б24_Синхр_ОбщегоНазначенияСервер.ДобавитьВЛог(ОбщиеНастройки, ОбщиеНастройки.ВариантыОшибок.Информация, "В настройках указано, что товары не обновляются. Номенклатура: " + Наименование + " не будет обновлена.");
         Продолжить; 
      КонецЕсли;
      
#КонецОбласти   
      
#Область СозданиеОбновлениеНоменклатуры   
      
      Если ЭтоНоваяНоменклатура Тогда
         Номенклатура = Справочники.Номенклатура.СоздатьЭлемент();
      Иначе
         Номенклатура = Номенклатура.ПолучитьОбъект();
      КонецЕсли;
      
      Номенклатура.ПометкаУдаления    = НЕ ЕстьХарактеристика И НЕ Активность;
      Номенклатура.Наименование       = НаименованиеНоменклатуры;
      Номенклатура.НаименованиеПолное   = ?(ЗначениеЗаполнено(Номенклатура.НаименованиеПолное), Номенклатура.НаименованиеПолное, НаименованиеНоменклатуры);
      Номенклатура.Описание          = ПолноеНаименованиеНоменклатуры;
      
      Если ЗначениеЗаполнено(АртикулТовара) Тогда
         Номенклатура.Артикул = АртикулТовара;
      КонецЕсли;
      
      Родитель = ПолучитьОбъектПоИдентификаторуИзВременнойТаблицы(МенеджерВременныхТаблиц, "ВремИдентификаторыГрупп", ИдРодителя);
      Если НЕ ЕстьДеревоГрупп Тогда
         Номенклатура.Родитель = Родитель;
      КонецЕсли;
      
      ВидНоменклатуры = ПолучитьОбъектПоИдентификаторуИзВременнойТаблицы(МенеджерВременныхТаблиц, "ВремИдВидовНоменклатуры", ИдВидаТовара);
      
      ВидНоменклатуры = ?(ЗначениеЗаполнено(ВидНоменклатуры), ВидНоменклатуры, Номенклатура.ВидНоменклатуры);  
      
      Если НЕ ЗначениеЗаполнено(ВидНоменклатуры) Тогда
         ВидНоменклатурыВрем = Справочники.ВидыНоменклатуры.ВидНоменклатурыПоУмолчанию();
         Если ЗначениеЗаполнено(ВидНоменклатурыВрем) Тогда
            ВидНоменклатуры = ВидНоменклатурыВрем;   
         КонецЕсли;
      КонецЕсли;
      
      Номенклатура.ВидНоменклатуры = ВидНоменклатуры;
      
      Номенклатура.ТипНоменклатуры             = ВидНоменклатуры.ТипНоменклатуры;   
      Номенклатура.ИспользованиеХарактеристик    = ВидНоменклатуры.ИспользованиеХарактеристик;   
      Номенклатура.ИспользоватьУпаковки          = ВидНоменклатуры.ИспользоватьУпаковки;   
      Номенклатура.НаборУпаковок                = ВидНоменклатуры.НаборУпаковок;
      Номенклатура.ВариантОформленияПродажи         = ВидНоменклатуры.ВариантОформленияПродажи;
      Номенклатура.ГруппаДоступа               = ?(ЗначениеЗаполнено(Номенклатура.ГруппаДоступа), Номенклатура.ГруппаДоступа, ВидНоменклатуры.ГруппаДоступа);  
      
      Если Номенклатура.НаборУпаковок.Пустая() И ВидНоменклатуры.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Услуга Тогда
         Номенклатура.НаборУпаковок = Справочники.НаборыУпаковок.ИндивидуальныйДляНоменклатуры;
      КонецЕсли;
      
      ЕдиницаИзмерения                = ПолучитьОбъектПоИдентификаторуИзВременнойТаблицы(МенеджерВременныхТаблиц, "ВремИдентификаторыЕдиницИзмерения", ИдЕдИзм);
      Если ЗначениеЗаполнено(ЕдиницаИзмерения) Тогда
         Номенклатура.ЕдиницаИзмерения  = ЕдиницаИзмерения;   
         Номенклатура.ЕдиницаДляОтчетов = ЕдиницаИзмерения;   
      Иначе
         Номенклатура.ЕдиницаИзмерения  = ВидНоменклатуры.ЕдиницаИзмерения;
         Номенклатура.ЕдиницаДляОтчетов = Номенклатура.ЕдиницаИзмерения;
      КонецЕсли;
      
      НайденнаяСтавкаНДС = ОбщиеНастройки.НастройкиСинхронизацииТоваров.СтавкиНДС.Найти(СтавкаНДС);
      Если НайденнаяСтавкаНДС <> Неопределено Тогда
         Номенклатура.СтавкаНДС = НайденнаяСтавкаНДС.СтавкаНДС;   
      Иначе
         Номенклатура.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;   
      КонецЕсли;
      
#Область ЗаполнениеПредопределеннымиЗначениямиПриСоздании   
      Если ЭтоНоваяНоменклатура Тогда      
      КонецЕсли;   
#КонецОбласти   
      
#Область ЗаполнениеДополнительныхРеквизитовНоменклатуры   
      Для Каждого ТекСвойствоТовара Из ТаблицаСвойствТовара Цикл
         
         Если НЕ ТекСвойствоТовара.ЭтоСвойствоНоменклатуры Тогда
            Продолжить;
         КонецЕсли;
         
         Если НЕ ТекСвойствоТовара.ЭтоДополнительноеСведение И ТекСвойствоТовара.ПоддерживаетсяСвойство Тогда                  
            Если ТекСвойствоТовара.ЗначениеОчищено Тогда
               Если ЭтоНоваяНоменклатура Тогда
                  Продолжить;
               КонецЕсли;
               
               Для Каждого ЗаполнениеСвойствоТовара Из Номенклатура.ДополнительныеРеквизиты Цикл
                  Если ЗаполнениеСвойствоТовара.Свойство = ТекСвойствоТовара.Свойство Тогда
                     ЗаполнениеСвойствоТовара.Значение = Неопределено;
                  КонецЕсли;
               КонецЦикла;
            Иначе
               
               ЕстьРеквизит = Ложь;
               Для Каждого ЗаполнениеСвойствоТовара Из Номенклатура.ДополнительныеРеквизиты Цикл
                  Если ЗаполнениеСвойствоТовара.Свойство = ТекСвойствоТовара.Свойство Тогда
                     ЗаполнениеСвойствоТовара.Значение = ТекСвойствоТовара.ЗначениеСвойства;
                     Если ТипЗнч(ТекСвойствоТовара.ЗначениеСвойства) = Тип("Строка") Тогда
                        ЗаполнениеСвойствоТовара.ТекстоваяСтрока = ТекСвойствоТовара.ЗначениеСвойства;
                     КонецЕсли;
                     ЕстьРеквизит = Истина
                  КонецЕсли;
               КонецЦикла;
               
               Если НЕ ЕстьРеквизит Тогда
                  НовыйРеквизит = Номенклатура.ДополнительныеРеквизиты.Добавить();
                  НовыйРеквизит.Свойство    = ТекСвойствоТовара.Свойство; 
                  НовыйРеквизит.Значение    = ТекСвойствоТовара.ЗначениеСвойства; 
                  Если ТипЗнч(ТекСвойствоТовара.ЗначениеСвойства) = Тип("Строка") Тогда
                     НовыйРеквизит.ТекстоваяСтрока = ТекСвойствоТовара.ЗначениеСвойства;
                  КонецЕсли;
               КонецЕсли;   
               
            КонецЕсли;
         КонецЕсли;
      КонецЦикла;
#КонецОбласти   
      
      
#КонецОбласти   
      
      
#Область СозданиеОбновлениеХарактеристикиНоменклатуры   
      
      Если ЕстьХарактеристика Тогда
         Если ЭтоНоваяХарактеристика Тогда
            Характеристика = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
         Иначе
            Характеристика = Характеристика.ПолучитьОбъект();
         КонецЕсли;
         
         Характеристика.ПометкаУдаления       = НЕ Активность;
         Характеристика.Наименование        = НаименованиеХарактеристики;
         Характеристика.НаименованиеПолное   = ПолноеНаименованиеХарактеристики;
         
#Область ЗаполнениеДополнительныхРеквизитовХарактеристикНоменклатуры   
         Для Каждого ТекСвойствоТовара Из ТаблицаСвойствТовара Цикл
            
            Если ТекСвойствоТовара.ЭтоСвойствоНоменклатуры Тогда
               Продолжить;
            КонецЕсли;
            
            Если НЕ ТекСвойствоТовара.ЭтоДополнительноеСведение И ТекСвойствоТовара.ПоддерживаетсяСвойство Тогда                  
               Если ТекСвойствоТовара.ЗначениеОчищено Тогда
                  Если ЭтоНоваяХарактеристика Тогда
                     Продолжить;
                  КонецЕсли;
                  
                  Для Каждого ЗаполнениеСвойствоТовара Из Характеристика.ДополнительныеРеквизиты Цикл
                     Если ЗаполнениеСвойствоТовара.Свойство = ТекСвойствоТовара.Свойство Тогда
                        ЗаполнениеСвойствоТовара.Значение = Неопределено;
                     КонецЕсли;
                  КонецЦикла;
               Иначе
                  
                  ЕстьРеквизит = Ложь;
                  Для Каждого ЗаполнениеСвойствоТовара Из Характеристика.ДополнительныеРеквизиты Цикл
                     Если ЗаполнениеСвойствоТовара.Свойство = ТекСвойствоТовара.Свойство Тогда
                        ЗаполнениеСвойствоТовара.Значение = ТекСвойствоТовара.ЗначениеСвойства;
                        ЕстьРеквизит = Истина
                     КонецЕсли;
                  КонецЦикла;
                  
                  Если НЕ ЕстьРеквизит Тогда
                     НовыйРеквизит = Характеристика.ДополнительныеРеквизиты.Добавить();
                     НовыйРеквизит.Свойство    = ТекСвойствоТовара.Свойство; 
                     НовыйРеквизит.Значение    = ТекСвойствоТовара.ЗначениеСвойства; 
                  КонецЕсли;   
                  
               КонецЕсли;
            КонецЕсли;
         КонецЦикла;
#КонецОбласти   
         
      КонецЕсли;      
#КонецОбласти   
      
      Попытка
         Номенклатура.ДополнительныеСвойства.Вставить("ЗагрузкаСБитрикс24", Истина);
         Номенклатура.Записать();
         Если ЕстьХарактеристика Тогда
            Если Номенклатура.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ИндивидуальныеДляНоменклатуры Тогда
               Характеристика.Владелец = Номенклатура.Ссылка;
            ИначеЕсли Номенклатура.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеДляВидаНоменклатуры Тогда
               Характеристика.Владелец = Номенклатура.ВидНоменклатуры;
            ИначеЕсли Номенклатура.ИспользованиеХарактеристик = Перечисления.ВариантыИспользованияХарактеристикНоменклатуры.ОбщиеСДругимВидомНоменклатуры Тогда
               Характеристика.Владелец = Номенклатура.ВидНоменклатуры.ВладелецХарактеристик;
            КонецЕсли;                   
            Характеристика.ДополнительныеСвойства.Вставить("ЗагрузкаСБитрикс24", Истина);
            Характеристика.Записать();
         КонецЕсли;
         
         ДанныеДляИД = Новый Структура;
         ДанныеДляИД.Вставить("Объект", Номенклатура.Ссылка);
         ДанныеДляИД.Вставить("ПодчиненныйОбъект", ?(ЕстьХарактеристика, Характеристика.Ссылка, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка()));
         
         Б24_Синхр_СинхронизацияВызовСервера.ЗаписатьИдБ24Объекта(ОбщиеНастройки, ОбщиеНастройки.ТипыОбъектовОбмена.Товар, ДанныеДляИД, ИдЭлемента);
         
         Результат.Добавить((СформироватьПростуюСтруктуруСИд(ИдЭлемента, Истина)));
         
         Б24_Синхр_ОбщегоНазначенияСервер.ДобавитьВЛог(ОбщиеНастройки, ОбщиеНастройки.ВариантыОшибок.Информация, "Записана номенклатуры: " + Наименование);
         
#Область ЗаполнениеПользовательскогоДереваДляТовара      
         
         Если ЕстьДеревоГрупп Тогда
            
            Родитель = ?(ЗначениеЗаполнено(Родитель), Родитель, ОбщиеНастройки.ДеревоГрупп);
            
            Если НЕ ЭтоНоваяНоменклатура Тогда
               
               НайденныеРазделыСТоваром = тзнПользовательскогоДереваГрупп.НайтиСтроки(Новый Структура("Номенклатура", Номенклатура.Ссылка));
               
               Для Каждого НайденныйРаздел Из НайденныеРазделыСТоваром Цикл
                  
                  РазделОбъект = НайденныйРаздел.Раздел.ПолучитьОбъект(); 
                  
                  тзнВремТоваровРаздела = РазделОбъект.Товары.Выгрузить();
                  
                  РазделОбъект.Товары.Очистить();
                  
                  Для каждого ТоварРаздела Из тзнВремТоваровРаздела Цикл
                     
                     Если ТоварРаздела.Номенклатура <> Номенклатура.Ссылка Тогда
                        НоваяСтрока = РазделОбъект.Товары.Добавить();
                        ЗаполнитьЗначенияСвойств(НоваяСтрока, ТоварРаздела); 
                     КонецЕсли;
                     
                  КонецЦикла;
                  РазделОбъект.ДополнительныеСвойства.Вставить("ЗагрузкаСБитрикс24", Истина);
                  РазделОбъект.Записать();
                  
               КонецЦикла;
               РазделОбъект = Справочники.Б24_Синхр_ПользовательскиеГруппыТоваров.СоздатьЭлемент();
               РазделОбъект.товары.Выгрузить()
            КонецЕсли;
            
            РодительОбъект = Родитель.ПолучитьОбъект();
            
            НовыйТоварРаздела= РодительОбъект.Товары.Добавить();
            НовыйТоварРаздела.Номенклатура = Номенклатура.Ссылка;
            
            РодительОбъект.ДополнительныеСвойства.Вставить("ЗагрузкаСБитрикс24", Истина);
            РодительОбъект.Записать();   
            
         КонецЕсли;   
#КонецОбласти   
         
         
#Область ЗаполнениеДополнительногоСведенияНоменклатуры   
         НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
         НаборЗаписей.Отбор.Объект.Установить(Номенклатура.Ссылка);
         НаборЗаписей.Прочитать();
         
         Для Каждого ТекСвойствоТовара Из ТаблицаСвойствТовара Цикл
            
            Если НЕ ТекСвойствоТовара.ЭтоСвойствоНоменклатуры Тогда
               Продолжить;
            КонецЕсли;
            
            Если ТекСвойствоТовара.ЭтоДополнительноеСведение И ТекСвойствоТовара.ПоддерживаетсяСвойство Тогда                  
               Если НЕ ТекСвойствоТовара.ЗначениеОчищено Тогда
                  
                  ЕстьСвойство = Ложь;
                  Для Каждого ТекСтрока Из НаборЗаписей Цикл
                     Если ТекСтрока.Свойство = ТекСвойствоТовара.Свойство Тогда
                        ЕстьСвойство = Истина;
                        ТекСтрока.Значение = ТекСвойствоТовара.ЗначениеСвойства;   
                     КонецЕсли;
                  КонецЦикла;
                  
                  Если ЕстьСвойство = Ложь Тогда
                     НоваяЗапись = НаборЗаписей.Добавить();
                     НоваяЗапись.Объект = Номенклатура.Ссылка;
                     НоваяЗапись.Свойство = ТекСвойствоТовара.Свойство;
                     НоваяЗапись.Значение = ТекСвойствоТовара.ЗначениеСвойства;
                  КонецЕсли;
               КонецЕсли;
            КонецЕсли;
         КонецЦикла;
         
         НаборЗаписей.ДополнительныеСвойства.Вставить("ЗагрузкаСБитрикс24", Истина);
         НаборЗаписей.Записать();
#КонецОбласти   
         
#Область ЗаполнениеДополнительногоСведенияХарактеристикиНоменклатуры   
         Если ЕстьХарактеристика Тогда
            Для Каждого ТекСвойствоТовара Из ТаблицаСвойствТовара Цикл
               
               Если ТекСвойствоТовара.ЭтоСвойствоНоменклатуры Тогда
                  Продолжить;
               КонецЕсли;
               
               Если ТекСвойствоТовара.ЭтоДополнительноеСведение И ТекСвойствоТовара.ПоддерживаетсяСвойство Тогда                  
                  Если ТекСвойствоТовара.ЗначениеОчищено Тогда
                     Если ЭтоНоваяХарактеристика Тогда
                        Продолжить;
                     КонецЕсли;
                     
                     Выборка = РегистрыСведений.ДополнительныеСведения.Выбрать(Новый Структура("Объект", Характеристика.Ссылка));
                     Пока Выборка.Следующий() Цикл
                        Если Выборка.Свойство = ТекСвойствоТовара.Свойство Тогда
                           Выборка.ПолучитьМенеджерЗаписи().Удалить();   
                           Прервать;
                        КонецЕсли;
                     КонецЦикла;
                     
                  Иначе
                     
                     НовоеСведение = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
                     НовоеСведение.Объект    = Характеристика.Ссылка; 
                     НовоеСведение.Свойство    = ТекСвойствоТовара.Свойство; 
                     НовоеСведение.Значение    = ТекСвойствоТовара.ЗначениеСвойства; 
                     НовоеСведение.Записать();   
                     
                  КонецЕсли;
               КонецЕсли;
            КонецЦикла;
         КонецЕсли;         
#КонецОбласти   
         
#Область СохранениеАдресаКартинки   
         Если ОбщиеНастройки.НастройкиСинхронизацииТоваров.ЗагружатьКартинкиИФайлы Тогда
            Если ЗначениеЗаполнено(ДетальнаяКартинка) Тогда
               АдресКартинки = ДетальнаяКартинка.Получить("downloadUrl");
               Если ЗначениеЗаполнено(АдресКартинки) Тогда
                  
               КонецЕсли;   
            КонецЕсли;
            
         КонецЕсли;
#КонецОбласти   
         
      Исключение
         
         Б24_Синхр_ОбщегоНазначенияСервер.ДобавитьВЛог(ОбщиеНастройки, ОбщиеНастройки.ВариантыОшибок.Ошибка, "Во время записи товара: " + Наименование + " возникли ошибки.");
         Б24_Синхр_ОбщегоНазначенияСервер.ДобавитьВЛог(ОбщиеНастройки, ОбщиеНастройки.ВариантыОшибок.Ошибка, ОписаниеОшибки());
         
         Результат.Добавить((СформироватьПростуюСтруктуруСИд(ИдЭлемента, Ложь)));
         
         ОбщиеНастройки.ВыполненоБезОшибок = Ложь;
   
      КонецПопытки;
      
   КонецЦикла;
   
   пОбщиеНастройки.КартинкиИФайлыНоменклатуры    = ОбщиеНастройки.КартинкиИФайлыНоменклатуры;       
   пОбщиеНастройки.НомерСообщения = ОбщиеНастройки.НомерСообщения;    // чтобы лог не затерся.
   
   Возврат Результат;
   
КонецФункции
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!