Загрузка изображений в справочник номенклатуры из csv файла Розница 2.2
Задача: загрузить в справочник номенклатуры изображения, ссылки на которые находятся в файле csv.
Решение: пишем универсальный загрузчик изображений из csv. Изображения могут располагаться как в папке на жестком диске, так и в сети.
1) Выбираем разделитель csv, стартовую строку (например первую строчку — обычно это названия колонок, нужно пропустить)
krana-ot-2018-05-16-17-02-27.png»>krana-ot-2018-05-16-17-04-37.png»>здесь
Основной код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт МассивСтрок = Новый Массив(); Если Разделитель = " " Тогда Стр = СокрЛП(Стр); Пока Истина Цикл Поз = Найти(Стр,Разделитель); Если Поз=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); конецесли; конеццикла; КонецПроцедуры |
По ссылке качается другая обработка к сожалению…
Так смысла особого в ней нет. Она не «готовое решение». А просто принцип как можно реализовать функционал. Оно же и в коде тут есть