1С: Сжимаем прикрепленные файлы
Задача: есть некий справочник, к которому прикрепляются файлы. Физически они конечно хранятся в томах, но всё равно занимают места очень порядочно. Необходимо собственно каждый файлик положить в архив, заново «перекрепить» его к элементам справочника. Оригинал соответственно удалить.
Решение:
|
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 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1000 | Файлы.ВладелецФайла КАК ВладелецФайла, | Файлы.Ссылка КАК Ссылка, | Файлы.ПолноеНаименование КАК ПолноеНаименование, | Файлы.ТекущаяВерсияПутьКФайлу КАК ПутьКФайлу, | Файлы.ТекущаяВерсияТом.ПолныйПутьWindows КАК ПолныйПуть, | Файлы.ДатаСоздания КАК ДатаСоздания |ИЗ | Справочник.Файлы КАК Файлы |ГДЕ | Файлы.ВладелецФайла ССЫЛКА Справочник.СК_ГосуслугиЛК_ВходящиеСообщения | И Файлы.ПометкаУдаления = ЛОЖЬ | И НЕ Файлы.ТекущаяВерсияПутьКФайлу ПОДОБНО ""%zip%"" | И Файлы.ДатаСоздания МЕЖДУ &ДатаС И &ДатаПо | |УПОРЯДОЧИТЬ ПО | ДатаСоздания"; Запрос.УстановитьПараметр("ДатаС", объект.ДатаС); Запрос.УстановитьПараметр("ДатаПо", объект.ДатаПо); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл если СтрНайти(ВыборкаДетальныеЗаписи.ПутьКФайлу,".zip")=0 тогда НовыйАрхив = Новый ЗаписьZipФайла( ВыборкаДетальныеЗаписи.ПолныйПуть+"tmp.zip", "","",МетодСжатияZIP.Сжатие,УровеньСжатияZIP.Максимальный,МетодШифрованияZIP.Zip20 ); НовыйАрхив.Добавить(ВыборкаДетальныеЗаписи.ПолныйПуть+ВыборкаДетальныеЗаписи.ПутьКФайлу); НовыйАрхив.Записать(); //возврат 0; ДвоичныеДанные = Новый ДвоичныеДанные(ВыборкаДетальныеЗаписи.ПолныйПуть+"tmp.zip"); АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные); РаботаСФайламиВызовСервера.СоздатьФайлСВерсией( ВыборкаДетальныеЗаписи.ВладелецФайла, ВыборкаДетальныеЗаписи.ПолноеНаименование+".zip", "zip", ТекущаяДата(), ТекущаяДата(), , АдресФайлаВХранилище,АдресФайлаВХранилище, Ложь, , , Истина ); об=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); об.ПометкаУдаления=Истина; об.Записать(); об.Удалить(); УдалитьФайлы(ВыборкаДетальныеЗаписи.ПолныйПуть+ВыборкаДетальныеЗаписи.ПутьКФайлу); конецесли; КонецЦикла; |
Т.е. что тут делаем: выбираем элемент справочника с прикрепленным файлом, сжимаем его в архив zip, прикрепляем его и удаляем оригинал.

