Имя: Пароль:
1C
 
Прикрепление файлов к документам (1С 8.2, УТ 10.3 самопередовыписанная)
0 ils108
 
14.09.16
06:55
Всем добра!
Пользователи захотели прикреплять скрины, фоточки и прочее добро к документам. на данный момент у нас в конфигурации это реализовано так, что все присоединенные файлы покоятся в виде хранилищ значения на просторах безбрежного регистра сведений, либо в ТЧ самих документов. Данная ситуация как я понимаю в будущем может привести к тормозам и раздуть базу донельзя. Отсюда возникло желание хранить сами файлы где-нить на серваке отдельно, а в базе только ссылки. Я сейчас планирую создать ТЧ с "Ссылка" и "ИмяФайла" в документах и.. призадумался =))
Может кто что присоветовать как это лучше организовать, может какие-то моменты важные стоит не пропустить. Заранее спасибо.
1 ils108
 
14.09.16
13:54
Сделал как-то так. В документе происходит
&НаКлиенте
Процедура Файлы(Команда)
    АдресВХранилище = "";
    ВыбранноеИмяФайла = "";
    ИмяФайла = "";
    Результат = Ложь;
    Если ПоместитьФайл(АдресВХранилище, , ВыбранноеИмяФайла, , УникальныйИдентификатор) Тогда
        Пока НЕ Результат Цикл
            Если ВвестиСтроку(ИмяФайла, "Введите имя файла", 50) И НЕ ИмяФайла = "" Тогда
                Разделитель = ".";
                Строки = СтрЗаменить(ВыбранноеИмяФайла, Разделитель, Символы.ПС);
                Расширение = СтрПолучитьСтроку(Строки, СтрЧислоСтрок(Строки));
                Путь = "C:\09.2016\ХранилищеВсеяФайлов\" + Месяц(ТекущаяДата());
                ПроверитьСуществованиеКаталога(Путь);
                Путь = Путь + "\" + УникальныйИдентификатор + "." + Расширение;
                КопироватьФайл(ВыбранноеИмяФайла, Путь);
                НовыйФайл = Объект.Файлы.Добавить();
                НовыйФайл.ИмяФайла = ИмяФайла;
                НовыйФайл.ПутьКФайлу = Путь;
                Результат = Истина;
            Иначе
                Ответ = Вопрос("Файл без имени не будет сохранен. Продолжить?", РежимДиалогаВопрос.ДаНет, , , "Предупреждение");
                Если КодВозвратаДиалога.Да Тогда
                    Результат = Истина;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ПроверитьСуществованиеКаталога(ИмяКаталога) Экспорт
    КаталогНаДиске = Новый Файл(ИмяКаталога);
    Если НЕ КаталогНаДиске.Существует() Тогда
        СоздатьКаталог(ИмяКаталога);
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьСписокФайлов(Команда)
    Отбор = Новый Структура("Документ", Объект.Ссылка);
    ОткрытьФорму("ОбщаяФорма.ФормаПрисоединенныхФайлов", Отбор)
КонецПроцедуры

В общей форме параметр Документ с типом любая, ссылка, СписокФайлов типа динамическийсписок получающий имена и адреса файлов по параметру.
&НаКлиенте
Процедура СписокФайловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    ЗапуститьПриложение(Элемент.ТекущиеДанные.ПутьКФайлу);
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    СписокФайлов.Параметры.УстановитьЗначениеПараметра("Документ", Параметры.Документ.Ссылка);
КонецПроцедуры
2 vermouth
 
14.09.16
14:00
Хранилище значений в ТЧ самих документов  - это уж совсем корявенько.
если база скулевая  и объем этих файликов незаоблачен - не вижу проблемы хранить их в базе в ХЗ регистре сведений со ссылкой на док или элемент справочника.

ну а если все же хранить снаружи - тогда это будет файловая шара, чтоб иметь доступ и файлам и с сервера и компов пользователей или передавать их на сервер для сохранения и работы?

с регистром букв в именах  проблем быть не должно, но я б "от греха" подальше не использовал заглавные :)
3 aka AMIGO
 
14.09.16
14:01
У нас (правда, в 7.7) все эти сведения хранятся в отдельных папках на одном их хардов сервера, а  ссылки на папку формируются динамически. Для Товаров имя папки = постоянной части (есть константа) и код товара.
4 ils108
 
14.09.16
14:02
трудодень закончился, завтра вернусь к этому)
5 aka AMIGO
 
14.09.16
14:03
Давай, ждем с решением завтра :)
6 ils108
 
15.09.16
05:11
(2) а когда этих файлов через годик другой станет Гигов 100 тоже будет нормально база ворочаться?

и вот такой момент проявляется.
ЗапуститьПриложение(Элемент.ТекущиеДанные.ПутьКФайлу);
будет работать когда путь будет к файлу на сервере? сейчас то я в файловой тестирую.
7 MaxS
 
15.09.16
07:41
Если хранить файлы отдельно от базы, появляется риск потерять все файлы по причинам - "бэкап 1С же есть", а про шару все забыли.
Или сделал кто-нибудь себе тестовую базу и удалил в ней лишние файлы...
8 vermouth
 
15.09.16
07:48
(6) я поэтому и обратил Ваше внимание на то, как будет обеспечиваться доступ к файлам
9 ils108
 
15.09.16
07:51
(8) понял, но вроде нашел такой вариант клиентского доступа к файлам сервера
&НаСервере
Функция ПолучитьФайл()
Двоичное=Новый ДвоичныеДанные("C:\файл.bmp");
Адрес=ПоместитьВоВременноеХранилище(Двоичное,ЭтаФорма.УникальныйИдентификатор);
Возврат Адрес
КонецФункции

&НаКлиенте
Процедура Получить()
Адрес=ПолучитьФайл();
Двоичное=ПолучитьИзВременногоХранилища(Адрес);
Файл = Двоичное.Записать;
ЗапуститьПриложение(Файл);
КонецПроцедуры
10 vermouth
 
15.09.16
08:41
(9) угу. и нечто подобное для записи
11 vermouth
 
15.09.16
08:43
(10) либо тупо путь вида \\server\share\attached_files  доступный и с клиента и с сервера
12 ils108
 
15.09.16
13:58
(11) во, этот простой вариант здесь пожалуй и будет самым эффективным
13 vermouth
 
15.09.16
14:03
(12) Лень - двигатель прогресса