Загрузка изображений в справочник номенклатуры из csv файла Розница 2.2

Задача: загрузить в справочник номенклатуры изображения, ссылки на которые находятся в файле csv.

Решение: пишем универсальный загрузчик изображений из csv. Изображения могут располагаться как в папке на жестком диске, так и в сети.

1) Выбираем разделитель  csv, стартовую строку (например первую строчку — обычно это названия колонок, нужно пропустить)

2) Выбираем колонки, где что находится в файле csv. Соответствие номенклатуры базы и файлу  идет по артикулу. Предусмотрена загрузка до 4-х картинок за один проход, которые располагаются в колонках «Ссылка 1..4». Если в колонке значение-1,  значит файла картинки нет в этой колонке.

3) Нажимаем кнопку «Загрузить CSV» и выбираем файл. После чего он будет загружен в табличную часть

Если  соответствие артикула и номенклатуры найдено в базе — будет заполнена колонка «Номенклатура».

4) Нажимаем кнопку «Прикрепить изображение». Обработка скачает картинку, сохранит его в базе или на томах, и прикрепит к номенклатуре:

Скачать обработку можно здесь

Основной код:

Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
    
    МассивСтрок = Новый Массив();
    Если Разделитель = " " Тогда
        Стр = СокрЛП(Стр);
        Пока Истина Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = СокрЛ(Сред(Стр,Поз));
        КонецЦикла;
    Иначе
        ДлинаРазделителя = СтрДлина(Разделитель);
        Пока Истина Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = Сред(Стр,Поз+ДлинаРазделителя);
        КонецЦикла;
    КонецЕсли;
    
КонецФункции // глРазложить
Функция НайтиНоменклатуруНаСервере(арт)	
	возврат Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",арт);
КонецФункции	
&НаКлиенте
Процедура ЗагрузитьВТаблицу(файл)
	шаг=файл.КоличествоСтрок()/30;
	этаформа.Элементы.Прогресс.МаксимальноеЗначение=файл.КоличествоСтрок();	
	пз=0;
	для НомерСтроки=1 по файл.КоличествоСтрок() Цикл
		если НомерСтроки>объект.ЗаполнятьСоСтроки тогда 
			пз=пз+1;
			объект.Прогресс=НомерСтроки;
			если пз=шаг тогда
				пз=0;				
				ЭтаФорма.ОбновитьОтображениеДанных();
			конецесли;	
			Строка=файл.ПолучитьСтроку(НомерСтроки);
			Строка=СтрЗаменить(Строка,"""","");
			МассивСтр=РазложитьСтрокуВМассивПодстрок(Строка,объект.разделитель);
			стртаб=объект.НоменклатураТаб.Добавить();
			если объект.артикул<>-1 тогда				
				стртаб.артикул=МассивСтр[объект.артикул];			
			конецесли;	
			если объект.ссылка1<>-1 тогда
				стртаб.ссылка1=МассивСтр[объект.ссылка1];			
			конецесли;	
			если объект.ссылка2<>-1 тогда
				стртаб.ссылка2=МассивСтр[объект.ссылка2];			
			конецесли;	
			если объект.ссылка3<>-1 тогда
				стртаб.ссылка3=МассивСтр[объект.ссылка3];			
			конецесли;	
			если объект.ссылка4<>-1 тогда
				стртаб.ссылка4=МассивСтр[объект.ссылка4];			
			конецесли;	
			//ищем номенклатуру по артикулу			
			стртаб.Номенклатура=НайтиНоменклатуруНаСервере(стртаб.артикул);			
		конецесли;
	конецЦикла;	
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьCSV(Команда)
	Режим = РежимДиалогаВыбораФайла.Открытие;
    ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
    ДиалогОткрытияФайла.ПолноеИмяФайла = "";
    Фильтр = НСтр("ru = 'Текст'; en = 'Text'")
        + "(*.csv)|*.csv";
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    ДиалогОткрытияФайла.МножественныйВыбор = Истина;
    ДиалогОткрытияФайла.Заголовок = "Выберите файлы";
    Если ДиалогОткрытияФайла.Выбрать() Тогда
        МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
        Для Каждого ИмяФайла Из МассивФайлов Цикл
            ВыбФайл = Новый Файл(ИмяФайла);
            Сообщить(ИмяФайла + НСтр("ru = '; Размер = '; en = '; Size = '")+ ВыбФайл.Размер());
			ЗФ=Новый ТекстовыйДокумент;
            ЗФ.Прочитать(ИмяФайла);
			ЗагрузитьВТаблицу(ЗФ);
        КонецЦикла;
    Иначе
        Предупреждение(НСтр("ru = 'Файл(ы) не выбран!'; en = 'File(s) not selected!'"));
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	объект.артикул=7;
	объект.ссылка1=6;
	объект.ссылка2=-1;
	объект.ссылка3=-1;
	объект.ссылка4=-1;
	объект.ЗаполнятьСоСтроки=1;
	объект.разделитель=";";
КонецПроцедуры

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

&НаСервере
Процедура ПрикрепитьФайлКНоменклатуре(ном,имяфайла,идентификаторкартинки);
	                                 
	ПараметрыФайла=Новый Структура;
	ПараметрыФайла.Вставить("Автор",Пользователи.НайтиПоИмени("Администратор"));
	ПараметрыФайла.Вставить("ВладелецФайлов",ном.Ссылка);
	ПараметрыФайла.Вставить("ИмяБезРасширения",идентификаторкартинки);
	ПараметрыФайла.Вставить("РасширениеБезТочки","jpg");
	ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное",ТекущаяУниверсальнаяДата());  
	     
	ДвоичДанные = Новый ДвоичныеДанные(имяфайла);
	АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(ДвоичДанные);
	 
	фс=ПрисоединенныеФайлы.ДобавитьПрисоединенныйФайл(ПараметрыФайла,АдресВременногоХранилищаФайла,,,);
	 
	об=ном.ПолучитьОбъект();
	об.ФайлКартинки= фс;
	об.Записать();	
КонецПроцедуры

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

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

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

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

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

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