1с присоединенные файлы
При разработке своей конфигурации учета задач понадобился мне простой механизм хранения файлов. Посмотрев типовые решения присоединенных файлов, понял – такие масштабные разработки мне не нужны. Решил написать свой простой механизм хранения присоединенных файлов.
Решение было собрано за 10 минут из информации в интернете.
Для примера возьмем пустую конфигурацию (в конце статьи ссылка на скачивание) и добавим в неё новый документ ‘Задачи’:
Отлично! Документ у нас есть, теперь осталось только организовать механизм хранения файлов, чем мы сейчас и займемся.
Файлы мы будем хранить в конфигурации. Все что нам понадобится это создать справочник ‘Файлы’ со следующими реквизитами:
- ‘ИмяФайла‘ – тип ‘Строка (Неограниченная)’;
- ‘ВладелецФайла‘ – тип ‘ДокументСсылка, СправочникСсылка’;
- ‘Файл‘ – тип ‘ХранилищеЗначения’;
И общую команду ‘ПрисоединенныеФайлы’:
Добавляем общую команду в интерфейс нашего документа:
В модуле команды пишем алгоритм открытия формы списка справочника ‘Файлы‘:
1 2 3 4 5 6 7 |
&НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ПараметрыФормы = Новый Структура("ВладелецФайла", ПараметрКоманды); ОткрытьФорму("Справочник.Файлы.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка); КонецПроцедуры |
Конструируем форму списка наших файлов:
И пишем алгоритмы отображения файлов по владельцу в динамическом списке, загрузку файлов, выгрузку файлов:
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 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Параметры.Свойство("ВладелецФайла") Тогда ЭтаФорма.ВладелецФайла = Параметры.ВладелецФайла; ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВладелецФайла"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.Использование = Истина; ЭлементОтбора.ПравоеЗначение = ЭтаФорма.ВладелецФайла; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ДобавитьФайл(Команда) Если ЗначениеЗаполнено(ЭтаФорма.ВладелецФайла) Тогда ПолноеИмяФайла = ""; ПутьФайла = ""; Если ПоместитьФайл(ПутьФайла, , ПолноеИмяФайла, Истина) Тогда АдресВоВременномХранилище = ПутьФайла; ЗаписатьФайл(АдресВоВременномХранилище, ПолучитьИмяФайла(ПолноеИмяФайла), ЭтаФорма.ВладелецФайла); КонецЕсли; КонецЕсли; Элементы.Список.Обновить(); КонецПроцедуры &НаКлиенте Функция ПолучитьИмяФайла(ПолныйПуть) ИсхСтрока = ПолныйПуть; Позиция = Найти(ИсхСтрока, "\"); ПозицияКонечная = 0; Пока Позиция <> 0 Цикл ПозицияКонечная = ПозицияКонечная + Позиция; ИсхСтрока = Сред(ИсхСтрока, Позиция+1); Позиция = Найти(ИсхСтрока, "\"); КонецЦикла; ИмяФайла = Сред(ПолныйПуть, ПозицияКонечная + 1); Возврат ИмяФайла; КонецФункции &НаСервере Процедура ЗаписатьФайл(АдресВоВременномХранилище, ИмяФайла, п_Объект) НовыйФайл = Справочники.Файлы.СоздатьЭлемент(); НовыйФайл.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(АдресВоВременномХранилище)); НовыйФайл.ИмяФайла = ИмяФайла; НовыйФайл.Наименование = ИмяФайла; НовыйФайл.ВладелецФайла = п_Объект.Ссылка; НовыйФайл.Записать(); КонецПроцедуры &НаКлиенте Процедура СохранитьФайл(Команда) ТекДанные = Элементы.Список.ТекущиеДанные; Если Не ТекДанные = Неопределено Тогда Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); Диалог.Заголовок = "Выберите папку для сохранения"; Диалог.МножественныйВыбор = Ложь; Если Диалог.Выбрать() Тогда ЗаписатьФайлНаДиск(Диалог.Каталог, ТекДанные.Ссылка); КонецЕсли; КонецЕсли; КонецПроцедуры &НаСервере Процедура ЗаписатьФайлНаДиск(Каталог, п_Ссылка) Если Прав(Каталог,1) = "\" Тогда ИмяФайла = Каталог + п_Ссылка.ИмяФайла; Иначе ИмяФайла = Каталог + "\" + п_Ссылка.ИмяФайла; КонецЕсли; Попытка ОбъектФайл = п_Ссылка.Файл.Получить(); ОбъектФайл.Записать(ИмяФайла); Исключение Сообщить("Не смогли выгрузить файл!"); КонецПопытки; КонецПроцедуры |
Вот и все! Этот простой механизм как минимум решит вашу задачу хранения обработок, отчетов, файлов и т.д. в вашей конфигурации. Не стоит забывать что данное решение было написано за 10-15 минут. В нем наверняка есть косяки, недочеты, ошибки и т.д. Но свой минимальный функционал он выполняет! А мне это и было нужно.
Если что забыл описать или указать, то вы это с легкостью увидите в конфигурации, которую я для вас выкладываю. Всем удачи!
Скачать файлыcraft1c_присоединенныефайлы.dt
Как верно было подмечено в комментариях – данное решение не будет работать в клиент-серверном варианте. Поэтому немного подправил текущую базу и сделал также и для этого варианта.
Скачать файлы craft1c_prisoedinennyefajly_KlientServer.dt
Внимание! Важное уточнение! Для того что бы работал метод ‘ПоместитьФайл’ в вашей конфигурации необходимо включить свойство ‘Режим использования синхронных вызовов расширений платформы и внешних компонент‘:
Здравствуй гуру ! )
Понадобилась загрузка выгрузка в самописную конфигурацию. Все повторил по вашей статье. Обнаружил неприятный момент. В файловом варианте все работает, а вот в режиме SQL выгрузка файла не происходит. Загрузка идет исправно, выгрузки нет, такое впечатление что не хватает прав на файловую систему, что ли. Есть ли какие то лайвхаки ) ? Спасибо
Привет) Сегодня проверю. Залью свою файловую на SQL и попробую. Скинь принт-скрин ошибки при выгрузки на любую из почт в контактах.