Загрузка картинок в 1с из каталога

1. BUBUGER 03.03.21 01:28 Сейчас в теме
Здравствуйте,

Есть обработка которая загружает картинки из каталога в 1С,

Картинки у меня хранятся в папке C:\pic
Вид хранения

Основная картинка
КодДляПоиска
Доп.
КодДляПоиска_1
Доп.
КодДляПоиска_2
и.т.д

Подскажите, что нужно поправить в коде, чтоб загружались картинки _1, _2 с одинаковым кодом, номером и присваивались нужной Номенклатуре.

Сейчас получается выгрузить несколько картинок в одну карточку, только если поменять расширение.

Вот весь код.



&НаКлиенте
Процедура ПапкаСКартинкамиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ВыборКаталога = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
	Если ВыборКаталога.Выбрать() Тогда
		Объект.ПутьККаталогу = ВыборКаталога.Каталог;
	КонецЕсли;	
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция МассивРасширенийКартинок()
    
    МассивРасширений = Новый Массив;
    МассивРасширений.Добавить("*.bmp");
    МассивРасширений.Добавить("*.gif");
    МассивРасширений.Добавить("*.png");
    МассивРасширений.Добавить("*.jpeg");
    МассивРасширений.Добавить("*.dib");
    МассивРасширений.Добавить("*.rle");
    МассивРасширений.Добавить("*.tif");
    МассивРасширений.Добавить("*.jpg");
    МассивРасширений.Добавить("*.ico");
    МассивРасширений.Добавить("*.wmf");
    МассивРасширений.Добавить("*.emf");
    
    Возврат МассивРасширений;
    
КонецФункции

&НаКлиенте
Процедура ЗагрузитьКартинки(Команда)
	
	Каталог = Новый Файл(Объект.ПутьККаталогу);
	Если НЕ Каталог.Существует() Тогда
		Сообщить("Не верно указан каталог!");
		Возврат;
	КонецЕсли;
	
	//МассивФайлов = НайтиФайлы(Объект.ПутьККаталогу, "*", Истина);
	
	МассивФайлов = Новый Массив;
	МассивРасширений = МассивРасширенийКартинок();
	Для каждого ТекРасширение Из МассивРасширений Цикл
    	цМассивФайлов = НайтиФайлы(Объект.ПутьККаталогу, ТекРасширение, Истина);
    	Для каждого ТекФайл Из цМассивФайлов Цикл
        	МассивФайлов.Добавить(ТекФайл);
		КонецЦикла;
	КонецЦикла;

	МассивФайловДляЗагрузки = Новый Массив;
	
	Для каждого Файл Из МассивФайлов Цикл
 		СтруктураФайла = Новый Структура("КодДляПоиска,Размер,ПолноеИмя,ИмяБезРасширения,Расширение,ВремяИзменения,УниверсальноеВремяИзменения");
		СтруктураФайла.КодДляПоиска			= СтрЗаменить(Файл.ИмяБезРасширения," ","");
		СтруктураФайла.Размер			= Файл.Размер();
		СтруктураФайла.ПолноеИмя		= Файл.ПолноеИмя;
		СтруктураФайла.ИмяБезРасширения = Файл.ИмяБезРасширения;
		СтруктураФайла.Расширение		= Файл.Расширение;
		СтруктураФайла.ВремяИзменения	= Файл.ПолучитьВремяИзменения();
		СтруктураФайла.УниверсальноеВремяИзменения = Файл.ПолучитьУниверсальноеВремяИзменения();
		МассивФайловДляЗагрузки.Добавить(СтруктураФайла);
	КонецЦикла;
	
	МассивФайловДляЗагрузки = ПроверитьМассивФайловДляЗагрузки(МассивФайловДляЗагрузки);
	
	СоответствиеАдресовВХранилище = Новый Соответствие;
	
	Для Каждого Файл Из МассивФайловДляЗагрузки Цикл
		Если ЗначениеЗаполнено(СоответствиеАдресовВХранилище.Получить(Файл.ПолноеИмя)) Тогда
			Файл.Вставить("АдресВременногоХранилищаФайла", СоответствиеАдресовВХранилище.Получить(Файл.ПолноеИмя));	
		Иначе
			ДвоичныеДанные = Новый ДвоичныеДанные(Файл.ПолноеИмя);			
			АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные,ЭтаФорма.УникальныйИдентификатор);			
			Файл.Вставить("АдресВременногоХранилищаФайла", АдресВременногоХранилищаФайла);	
			СоответствиеАдресовВХранилище.Вставить(Файл.ПолноеИмя, АдресВременногоХранилищаФайла);
		КонецЕсли;
	КонецЦикла;
	
	ЗагрузитьКартинкиСервер(МассивФайловДляЗагрузки);	
	
	//Сообщить("Загрузка окончена! Добавлено картинок: " + МассивФайловДляЗагрузки.Количество() + " шт.");

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроверитьМассивФайловДляЗагрузки(МассивФайловДляЗагрузки)

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

КонецФункции // ПроверитьМассивФайловДляЗагрузки()

&НаСервереБезКонтекста
Функция ЗагрузитьКартинкиСервер(МассивФайловДляЗагрузки)
	

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


Показать
По теме из базы знаний
Найденные решения
5. platonov.e 158 03.03.21 14:20 Сейчас в теме
(4) Это будет работать, только если картинок не больше 9


Для каждого Файл Из МассивФайлов Цикл
СтруктураФайла = Новый Структура("КодДляПоиска,Размер,ПолноеИмя,ИмяБезРасширения,Расширение,ВремяИзменения,УниверсальноеВремяИзменения");
ИмяБезРасширения = Файл.ИмяБезРасширения;
Если Сред(ИмяБезРасширения, СтрДлина(ИмяБезРасширения) - 1, 1) = "_" Тогда
ИмяБезРасширения = Лев(ИмяБезРасширения, СтрДлина(ИмяБезРасширения) - 2);
КонецЕсли;
СтруктураФайла.КодДляПоиска = СокрЛП(ИмяБезРасширения);
// Продолжения цикла ....................................
КонецЦикла;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. platonov.e 158 03.03.21 06:57 Сейчас в теме
Я делал это так - шел циклом по каталогу, и искал конкретное имя файла, зная что у него постфикс имеет вид "_ИтерацияЦикла", пока файлы находились, я добавлял их путь в массив, когда файл не нашелся, значит все, иду и добавляю то что в массиве. Здесь важно, чтобы названия были по порядку, и не было сценария, когда есть файл "_3", и нет файла "_2".
3. BUBUGER 03.03.21 08:10 Сейчас в теме
(2) Если не трудно, можете поправить код который я скинул, я просто уже по всякому игрался с кодом как мог, но пока нужного результата добиться не смог.
4. BUBUGER 03.03.21 08:15 Сейчас в теме
(3) *Первый файл у меня просто КодДляПоиска.jpg без _ИтерацияЦикла.
5. platonov.e 158 03.03.21 14:20 Сейчас в теме
(4) Это будет работать, только если картинок не больше 9


Для каждого Файл Из МассивФайлов Цикл
СтруктураФайла = Новый Структура("КодДляПоиска,Размер,ПолноеИмя,ИмяБезРасширения,Расширение,ВремяИзменения,УниверсальноеВремяИзменения");
ИмяБезРасширения = Файл.ИмяБезРасширения;
Если Сред(ИмяБезРасширения, СтрДлина(ИмяБезРасширения) - 1, 1) = "_" Тогда
ИмяБезРасширения = Лев(ИмяБезРасширения, СтрДлина(ИмяБезРасширения) - 2);
КонецЕсли;
СтруктураФайла.КодДляПоиска = СокрЛП(ИмяБезРасширения);
// Продолжения цикла ....................................
КонецЦикла;
Показать
6. BUBUGER 04.03.21 03:12 Сейчас в теме
(5) Спасибо, меня Ваш код вполне устраивает.
7. BUBUGER 04.03.21 03:19 Сейчас в теме
(5) Вашим кодом получается выгрузить 11 картинок КодДляПоиска, КодДляПоиска_0, КодДляПоиска_1 и так до 9, в сумме 11 👍
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот