Загрузка фото в номенклатуру из прайсов формата XML. 1C Розница 2.2

1) Формат Новотех

Файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<data date="2018-09-26T16:10:20" vendor="SONEX">
<catalog>
<items>
<item id="576ee499-29fc-11e5-8885-003048ffdc82">
<name>370231 NT16 271 хром Встраиваемый декоративный поворотный светильник IP20 GX5.3 50W 12V PEONY</name>
<code>0035856</code>
<article>370231</article>
<description/>
<barcode>4690344039710</barcode>
<item_url>http://isonex.ru/info/index.php?ACTION=FILTER&NAME=370231 NT16 271 хром Встраиваемый декоративный поворотный светильник IP20 GX5.3 50W 12V PEONY</item_url>
-<properties>
<property value="0,193" name="Вес"/>
<property value="0,132" name="Вес нетто"/>
<property value="0,0006" name="Объем"/>
<property value="1" name="Количество ламп"/>
<property value="ВЕНГРИЯ" name="Страна"/>
<property value="NOVOTECH" name="Бренд"/>
<property value="Светильник произведен из сплава цинка. Благодаря сравнительно высоким механическим и литейным качествам, изделия, выполненные из сплава цинка, отличаются высокой точностью деталей декора со сложной конфигурацией. Так же он обладает антикоррозийными свойствами. Декоративные украшения сделаны из хрусталя. Огранка хрусталя, подобно огранке драгоценных камней, позволяет в полной мере проявить свойства, обусловленные большим показателем преломления и дисперсией." name="Описание серии для сайта"/>

<property value="http://isonex.ru/upload/iblock/392/39269950101d067033814dd9e8e3a61b.jpeg" name="Фото на сайте"/>
<property value="хром" name="Цвет плафона"/>

Обработка 1С:

&НаСервере
Функция НайтиНоменклатуруНаСервере(Артикул)
	Возврат Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",Артикул)
КонецФункции

&НаКлиенте
Процедура ОткрытьDBF(Команда)
ФайлDBF = Новый XBase; // создаем новый объект
ФайлDBF.ОткрытьФайл(Объект.ИмяФайла,,Истина); // открытие файла
ФайлDBF.Кодировка=КодировкаXBase.ANSI;
ФайлDBF.Первая(); // устанавливает курсор на первую запись
этаформа.Элементы.Прогресс.МаксимальноеЗначение=ФайлDBF.КоличествоЗаписей();
объект.Прогресс=0;
Пока НЕ ФайлDBF.ВКонце() Цикл	
	спр=НайтиНоменклатуруНаСервере(ФайлDBF.ПолучитьЗначениеПоля(0));
	если ЗначениеЗаполнено(спр) тогда
		стр=Объект.Прайс.Добавить();	
		стр.Артикул=ФайлDBF.ПолучитьЗначениеПоля(0);			
		ЭтаФорма.ОбновитьОтображениеДанных();
		стр.Номенклатура=спр;
		стр.ТипСветильника=ФайлDBF.ПолучитьЗначениеПоля(6);			
		стр.ДлиннаММ=ФайлDBF.ПолучитьЗначениеПоля(24);			
		стр.Материал=ФайлDBF.ПолучитьЗначениеПоля(25);					
		//
		стр.СветовойПоток=ФайлDBF.ПолучитьЗначениеПоля(26);			
		стр.ШиринаММ=ФайлDBF.ПолучитьЗначениеПоля(27);			
		стр.ЦветоваяТемпература=ФайлDBF.ПолучитьЗначениеПоля(28);			
		стр.ВысотаММ=ФайлDBF.ПолучитьЗначениеПоля(29);			
		стр.ПередачаСигнала=ФайлDBF.ПолучитьЗначениеПоля(30);			
		стр.КоличествоСветодиодов=ФайлDBF.ПолучитьЗначениеПоля(31);			
		стр.УголРассеивания=ФайлDBF.ПолучитьЗначениеПоля(32);			
		стр.СтепеньПылеВлагоЗащиты=ФайлDBF.ПолучитьЗначениеПоля(33);			
		стр.Цвет=ФайлDBF.ПолучитьЗначениеПоля(34);			
		если стр.Цвет="" тогда ФайлDBF.ПолучитьЗначениеПоля(33);			конецесли;
		стр.СпособМонтажа=ФайлDBF.ПолучитьЗначениеПоля(40);			
		стр.Стиль=ФайлDBF.ПолучитьЗначениеПоля(45);			
		стр.СрокСлужбыЧ=ФайлDBF.ПолучитьЗначениеПоля(46);			
		
		стр.МощьностьВТ=ФайлDBF.ПолучитьЗначениеПоля(47);			
		если стр.МощьностьВТ="" тогда стр.МощьностьВТ=ФайлDBF.ПолучитьЗначениеПоля(79);конецесли;
		
		стр.РабочаяТемпература=ФайлDBF.ПолучитьЗначениеПоля(48);			
		//
		стр.МестоИспользования=ФайлDBF.ПолучитьЗначениеПоля(49);			
		стр.Питание=ФайлDBF.ПолучитьЗначениеПоля(50);			
		стр.СрокСлужбы=ФайлDBF.ПолучитьЗначениеПоля(52);			
		//
		стр.ИсточникСвета=ФайлDBF.ПолучитьЗначениеПоля(53);			
		стр.ТипСветодиода=ФайлDBF.ПолучитьЗначениеПоля(57);			
		
		стр.Цоколь=ФайлDBF.ПолучитьЗначениеПоля(67);			
		стр.КоличествоЛамп=ФайлDBF.ПолучитьЗначениеПоля(68);			
		стр.Диаметр=ФайлDBF.ПолучитьЗначениеПоля(69);			
		если стр.Диаметр="" тогда стр.Диаметр=ФайлDBF.ПолучитьЗначениеПоля(70);			конецесли;
		
		//
		стр.Фото=ФайлDBF.ПолучитьЗначениеПоля(172);			
	конецесли;	
	объект.Прогресс=объект.Прогресс+1;	
	ФайлDBF.Следующая(); //передвигаем курсор далее
	//если объект.Прогресс=10 тогда прервать;конецесли;
КонецЦикла;
ФайлDBF.ЗакрытьФайл();		
КонецПроцедуры

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

&НаСервере
Процедура ПопробоватьЗагрузитьКартинку(ном,ссылка);
	 ГСЧ = Новый ГенераторСлучайныхЧисел();
	 Если ссылка<>"" тогда
		 имя=СтрЗаменить(ссылка,"http://","");
		// имя=СтрЗаменить(ссылка,"https://","");
		 имя=СтрЗаменить(имя,"/","");
		 расш=".jpeg";
		 если найти(имя,".png")>0 тогда
			 расш=".png";
		 конецесли;	 
		 имя=СтрЗаменить(имя,расш,"");		 

		идентификаторкартинки=ном.артикул+"_"+имя;
		сообщить(идентификаторкартинки);
		если ЕстьТакаяКартинка(ном,идентификаторкартинки)=ложь тогда
			UID=Новый УникальныйИдентификатор();
			имяфайла="c:\temp\"+UID+".jpeg";
			Сообщить("ссылка:");
			сообщить(ссылка);
			Сообщить("файл:");
			сообщить(имяфайла);
			КопироватьФайл(ссылка, имяфайла); 		
			ПрикрепитьФайлКНоменклатуре(ном,имяфайла,идентификаторкартинки);
		конецесли;	
	конецесли;	
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьФайл(Команда)
	Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")+ "(*.xml)|*.xml";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок = "Выберите файл формата XML";
	Если ДиалогОткрытияФайла.Выбрать() Тогда
		Объект.ИмяФайла=ДиалогОткрытияФайла.ПолноеИмяФайла;
	КонецЕсли;	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьФото(Команда)
	объект.Прогресс=0;	
	этаформа.Элементы.Прогресс.МаксимальноеЗначение=объект.Прайс.Количество();
	для каждого стр из объект.Прайс цикл
		объект.Прогресс=объект.Прогресс+1;	
		ЭтаФорма.ОбновитьОтображениеДанных();
		если стр.Фото1<>"" тогда
			ПопробоватьЗагрузитьКартинку(стр.Номенклатура,стр.Фото1);
		конецесли;	
		если стр.Фото2<>"" тогда
			ПопробоватьЗагрузитьКартинку(стр.Номенклатура,стр.Фото2);
		конецесли;	
		//если объект.Прогресс=10 тогда прервать;конецесли
	конеццикла;			
КонецПроцедуры


&НаКлиенте
Процедура ОткрытьXML(Команда)
	ЧтениеХ=Новый ЧтениеXML;
	ЧтениеХ.ОткрытьФайл(Объект.ИмяФайла);
	ПостроительДОМ=Новый ПостроительDOM;
	ДокументДОМ=ПостроительДОМ.Прочитать(ЧтениеХ);	
	объект.Прогресс=0;
	//ДокументДом.ЭлементДокумента.Атрибуты.ПолучитьИменованныйЭлемент(
	для каждого дт из ДокументДом.ЭлементДокумента.ДочерниеУзлы цикл  //тег data
		для каждого кат из дт.ДочерниеУзлы цикл //тег ctalog
			этаформа.Элементы.Прогресс.МаксимальноеЗначение=кат.ДочерниеУзлы.Количество();
			для каждого итемс из кат.ДочерниеУзлы цикл //тэг items
				//обновляем прогрессбар
				объект.Прогресс=объект.Прогресс+1;
				ЭтаФорма.ОбновитьОтображениеДанных();				
				Артикул="";Фото="";
				для каждого итем из итемс.ДочерниеУзлы цикл //перебираем каждый товар					
						если итем.ИмяУзла="article" тогда
							Артикул=итем.ТекстовоеСодержимое;
							//Сообщить(Артикул);
						конецесли;																
						если итем.ИмяУзла="properties" тогда
							для каждого проп из итем.ДочерниеУзлы цикл //перебираем каждое свойство								
								тстр="";флаг=0;
								для каждого атр из проп.атрибуты цикл
									//АтрибутDOM
									//сообщить(атр.ИмяУзла);
									//сообщить(атр.Значение);
									если атр.ИмяУзла="value" тогда тстр=атр.Значение;конецесли;	
									если атр.ИмяУзла="name" и атр.Значение="Фото на сайте" тогда Фото=тстр;флаг=1;конецесли;	
									если атр.ИмяУзла="value" и флаг=1 тогда Фото=атр.Значение;конецесли;	
								конеццикла;														
							конеццикла;												
							//сообщить(Фото);
							если Фото<>"" и Артикул<>"" тогда
								спр=НайтиНоменклатуруНаСервере("SON"+СокрЛП(Артикул));
								если ЗначениеЗаполнено(спр) тогда
									стр=Объект.Прайс.Добавить();	
									стр.Артикул=Артикул;													
									стр.Номенклатура=спр;
									стр.Фото1=Фото;
								конецесли;
							конецесли;	
						конецесли;										
				конеццикла;								
			конеццикла;				
		конеццикла;	
	конеццикла;	
КонецПроцедуры

2) Формат ЛайтСтар

Файл XML:

<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog date="2018-09-28 17:08">
  <shop>
    <name>Имя магазина</name>
    <company>Имя компании</company>
    <url>URL сайта магазина</url>
    <categories/>
    <offers>
      <offer id="002584c800bea90a211c3be36fd659da" available="false">
        <name>893621*** (MВ8135-6) Бра CELESTA LED 6х6W(Led) G9 SKY BLUE (в комплекте)</name>
        <barcode>2893621000003</barcode>
        <categoryId/>
        <url/>
        <price>19600.00</price>
        <picture>https://wbs.e-teleport.ru/Catalog_Pics/bfeb0671-47aa-4778-a890-999852b11724</picture>
        <param name="3D preview">https://dl.lstar.lt/for_site/Lightstar/Bolshoy_katalog/Celesta/893621.png</param>
        <param name="3D-модель">https://3ddd.ru/3dmodels/show/89362x_celesta_lightstar Обращаем Ваше внимание, что данная 3D-модель является платной</param>
        <param name="Артикул">893621</param>
        <param name="Высота, мм">700</param>
        <param name="Диаметр основания (отверстия встройки), мм">145</param>
        <param name="Длина (Глубина), мм">360</param>
        <param name="Зона размещения">Жилая</param>
        <param name="Инструкция">https://dl.lstar.lt/for_site/Lightstar/Bolshoy_katalog/Celesta/893621/893621_instr.jpg</param>
        <param name="Количество ламп, шт">6</param>
        <param name="Количество рожков, шт (если 0 - нет)">6</param>
        <param name="Коллекция">Celesta</param>
        <param name="Коэфф пропускания плафоном света, 0-1">1</param>
        <param name="Крепление, На планку / На крюк / Пружинное">На основание</param>
        <param name="Масса, кг">4,55</param>
        <param name="Материал арматуры">Металл</param>
        <param name="Материал подвесок">Стекло</param>
        <param name="Материал рожков">Металл</param>
        <param name="Монтаж, Врезной / Накладной">Накладной</param>
        <param name="Мощность лампы (Max), Вт">6</param>
        <param name="Название позиции внутреннее">Светильник настенный</param>
        <param name="Направление рожков, Вверх/Вниз">Во все стороны</param>
        <param name="Напряжение питания ламп, В">220</param>
        <param name="Пылевлагозащита, IP">IP20</param>
        <param name="Стиль">Арт-деко</param>
        <param name="Суммарная мощность LED, Вт">36</param>
        <param name="Суммарная мощность ЛОН, Вт">36</param>
        <param name="Тип лампы">ГЛН</param>
        <param name="Типоразмер лампы">JC / T</param>
        <param name="Фото">https://dl.lstar.lt/for_site/Lightstar/Bolshoy_katalog/Celesta/893621_2500.jpg</param>

Обработка 1С:

&НаКлиенте
Процедура ОткрытьXML(Команда)
	ЧтениеХ=Новый ЧтениеXML;
	ЧтениеХ.ОткрытьФайл(Объект.ИмяФайла);
	ПостроительДОМ=Новый ПостроительDOM;
	ДокументДОМ=ПостроительДОМ.Прочитать(ЧтениеХ);	
	//ДокументДом.ЭлементДокумента.ТекстовоеСодержимое
	zz=ДокументДОМ.ЭлементДокумента.ПолучитьАтрибут("name");
	объект.Прогресс=0;	
	для каждого умл из ДокументДом.ЭлементДокумента.ДочерниеУзлы цикл
		этаформа.Элементы.Прогресс.МаксимальноеЗначение=умл.ДочерниеУзлы.Количество();
		для каждого шоп из умл.ДочерниеУзлы цикл
			объект.Прогресс=объект.Прогресс+1;
			ЭтаФорма.ОбновитьОтображениеДанных();
			если шоп.ИмяУзла="offers" тогда
				Артикул="";
				Фото="";Чертеж="";
				для каждого оффер из шоп.ДочерниеУзлы цикл
					для каждого товар из оффер.ДочерниеУзлы цикл
						если товар.ИмяУзла="name" тогда
							//сообщить(товар.ТекстовоеСодержимое);
						конецесли;
						если товар.ИмяУзла="param" тогда
							для каждого атр из товар.атрибуты цикл								
								если атр.значение="Фото" тогда
									Фото=товар.ТекстовоеСодержимое;
									//сообщить(товар.ТекстовоеСодержимое);								
								конецесли;	
								если атр.значение="Чертёж" тогда
									Чертеж=товар.ТекстовоеСодержимое;
									//сообщить(товар.ТекстовоеСодержимое);								
								конецесли;	
								если атр.значение="Артикул" тогда
									Артикул=товар.ТекстовоеСодержимое;
									//сообщить(товар.ТекстовоеСодержимое);
								конецесли;	
							конеццикла
						конецесли;
						если товар.ИмяУзла="stock" тогда
							если Артикул<>"" и Фото<>"" тогда
									спр=НайтиНоменклатуруНаСервере("LS"+СокрЛП(Артикул));
									если ЗначениеЗаполнено(спр) тогда
										стр=Объект.Прайс.Добавить();	
										стр.Артикул=Артикул;													
										стр.Номенклатура=спр;
										стр.Фото1=Фото;
										стр.Фото2=Чертеж;
									конецесли;	
							конецесли;	
						конецесли;

					конеццикла;		
				конеццикла;		
			конецесли;
		конеццикла;	
	конеццикла;	
КонецПроцедуры

Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.