Имя: Пароль:
1C
1С v8
Прикрепляем файлы к документу
0 Chuvaschow
 
12.11.15
09:05
Здравствуйте!

Научите, пожалуйста! Суть такова: есть документ, в котором есть табличная часть ПрикрепленныеФайлы, где я собираюсь хранить ссылки на файлы (на локальном ПК). Был выстрадан некий код, который почти работает

&НаКлиенте
Процедура ПрикрепитьФайл(Команда)
    
        Строка = Элементы.ПрикрепленныеФайлы.ТекущиеДанные;
      
        Каталог = КаталогПрограммы();
        Если ПроверитьСуществованиеКаталога(Каталог) <> Истина Тогда
        Ответ = Вопрос("Каталог для хранения файлов не существует. Создать?",РежимДиалогаВопрос.ОКОтмена);
              Если Ответ = КодВозвратаДиалога.ОК Тогда
                   СоздатьКаталог(Каталог);
              КонецЕсли;
        КонецЕсли;

        ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        ДиалогОткрытияФайла.ПолноеИмяФайла = "";
        ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
        ДиалогОткрытияФайла.Каталог = "";
        ДиалогОткрытияФайла.Заголовок = "Выберите файл";
        
        Если ДиалогОткрытияФайла.Выбрать() Тогда
            Файл = ДиалогОткрытияФайла.ПолноеИмяФайла;
            КаталогПроект = Каталог + "Проект" + " " + Объект.Наименование;
            ДлинаКаталога = СтрДлина(ДиалогОткрытияФайла.Каталог);
            ПолнаяДлина = СтрДлина(Файл);
            ИмяФайла = Прав(Файл,ПолнаяДлина-ДлинаКаталога);
            
            Если ПроверитьСуществованиеКаталога(КаталогПроект) <> Истина Тогда
                   СоздатьКаталог(КаталогПроект);
            КонецЕсли;
                
            КопироватьФайл(Файл,КаталогПроект + "\" + ИмяФайла);
            Объект.ПрикрепленныеФайлы.Добавить();
            Строка.ФайлСсылка = Строка(КаталогПроект + "\" + ИмяФайла);
            Строка.Файл = ИмяФайла;
            
            //Если Объект.ПутьКФайлу <> "" Тогда
            //    Объект.ЕстьФайл = Истина;
            //КонецЕсли;    
        Иначе        
            Сообщить ("Файл не выбран!");        
        КонецЕсли;
        
КонецПроцедуры

Что не работает: при выборе файла (первого,т.е. в пустую пока еще ТЧ, это важно) получаю "Значение не является значением объектного типа(ФайлСсылка)", однако строка пустая добавляется. При последующем добавлении файлов ошибки нет, но строки пустые, кроме последнего выбранного файла http://s019.radikal.ru/i625/1511/52/ad22a5515434.jpg
1 rabbidX
 
12.11.15
09:18
"Строка = Элементы.ПрикрепленныеФайлы.ТекущиеДанные;"
Для пустой ТЧ Строка у тебя будет равна Неопределено, поэтому ошибка.
Убери "Строка = Элементы.ПрикрепленныеФайлы.ТекущиеДанные;"
Объект.ПрикрепленныеФайлы.Добавить(); замени на
Строка = Объект.ПрикрепленныеФайлы.Добавить();
2 Fish
 
12.11.15
09:19
(1) И я бы не называл ещё переменную "Строка". Так, чисто по привычке.
3 Chuvaschow
 
12.11.15
10:23
Отлично, спасибо!

Чтобы еще одну тему не создавать, спрошу здесь. Как удалить выделенную строку и файл (ссылка на который содержится в этой строке) программно? вот такой код

&НаКлиенте
Процедура УдалитьФайл(Команда)
        
    Строка = Элементы.ПрикрепленныеФайлы.ВыделенныеСтроки;
    УдалитьФайлы(Строка.ФайлСсылка);
    Строка.Очистить();
    
КонецПроцедуры


Говорит
{Документ.Проект.Форма.ФормаДокумента.Форма(144)}: Поле объекта не обнаружено (ФайлСсылка)

"Строка" получается массив.
    УдалитьФайлы(Строка.ФайлСсылка);
4 Chuvaschow
 
12.11.15
10:29
Видимо циклом
5 Chuvaschow
 
12.11.15
11:23
Решил так

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

&НаКлиенте
Процедура ОткрытьФайл(Команда)
    
        Строка = Элементы.ПрикрепленныеФайлы.ТекущиеДанные;
        ЗапуститьПриложение(Строка.ФайлСсылка);
        
КонецПроцедуры


Большое спасибо!
6 Eugene_life
 
12.11.15
11:29
(5) ИМХО - хранение файла в каталоге, а в базе - пути к нему - ненадежное дело. Каталог могут удалить, переименовать.. файл могут изменить, не входя в 1С. Все-таки хранить файл внутри базы в двоичном виде - надежнее
7 VikingKosmo
 
12.11.15
11:31
(6) ога, а потом получить бекап этой базы в 100500 ТБ...
8 Eugene_life
 
12.11.15
11:32
(7) а бэкап этого каталога - что, будет много меньше?
9 VikingKosmo
 
12.11.15
11:35
(8) бекап этого каталога, это бекап этого каталога. Сомневаюсь, что каталог с картинками критичен для вопросов учета
10 Eugene_life
 
12.11.15
11:45
(9) а если это не картинки? Если наличие данных файлов критично для учета? Если информацию в базе можно изменить, минуя саму базу, то этой информации верить нельзя.
11 DDwe
 
12.11.15
11:56
(10) Плохой это тон. Ссылки в базе нужно хранить, ссылки.
12 GROOVY
 
12.11.15
12:04
ФАйловое хранилище в гетерогенной среде (винда, линукс, мобильная платформа) как вы это себе представляете?

Все должно быть в базе. Для целей оптимизации РБД можно все хранить в отдельной таблице, а можно в другой базе, и навигационными ссылками можно связаться с нужными объектами учета.
13 Eugene_life
 
12.11.15
12:10
(11) Ссылки на что? Или просто "абстрактные ссылки"? Ссылка подразумевает, что где-то лежит сам объект.
Вот с доводом в (12) я согласен на 100%.
14 Chuvaschow
 
12.11.15
12:19
Бекапов базы огромных боюсь.
Потому переделал сейчас на некий каталог на диске С. Чтоб не удалили - скрытым можно сделать :) Юзвери не догадаются.

По мне так хранить в базе миллион сканов - не комильфо.
15 DDwe
 
12.11.15
12:25
(14) +100
16 Eugene_life
 
12.11.15
12:27
(14) Ты можешь не допускать загрузки в базу файлов больше определенного размера (пусть уменьшают размеры скана или качество уменьшают). Большой бэкап базы - это самая низкая цена за гарантированную целостность твоих данных. Но решать тебе, конечно.
17 almar
 
12.11.15
12:30
Файлы должны быть в томе да диске, к которому доступ имеет только пользователь, под которым работает сервер 1С.
18 DDwe
 
12.11.15
12:30
(16) О какой гарантированной целости идет речь? Если база рухнет, так хоть сканы доков останутся, а иначе...
19 Eugene_life
 
12.11.15
12:31
(18) а если форматнут диск? Или сервер взорвется?
Бэкап на другом компьютере - надежнее некуда.
20 DDwe
 
12.11.15
12:33
(19) Вероятность взрыва компа исчезающе мала, по сравнению с вероятностью того, что база завернет ласты.
21 Eugene_life
 
12.11.15
12:35
(20) У меня базы работают по 5-6 лет, без заворачивания ласт. ЧЯДНТ?
22 DDwe
 
12.11.15
12:36
(21) То что она подохнет на 6 год жизни тебе легче?
23 Eugene_life
 
12.11.15
12:43
(22) при нормальном обслуживании база не подохнет вообще никогда. Живут базы по нескольку Тб и нормально себя чувствуют. А отдельный каталог все равно создает проблем больше, чем решает.
24 hhhh
 
12.11.15
13:03
(23) у нас каталоги на сервере существуют уже более 10 лет. И никто не удалил и не переименовал. И вот недавно напал вирус шифровальщик, базы почикал, а все каталоги с картинками остались. Так что хранить картинки в базе - это маразм.
25 VikingKosmo
 
12.11.15
13:05
(24) а как он до ваших баз добрался то?
26 hhhh
 
12.11.15
13:12
ну там файловые базы были.
27 VikingKosmo
 
12.11.15
13:13
(26) тогда понятно :)
28 DDwe
 
12.11.15
13:17
(24) Вот об этом и речь.
29 Tetragrammathon
 
12.11.15
13:18
(6) Я юзаю FILESTREAM на скуле для таких задач.
30 Tetragrammathon
 
12.11.15
13:19
(29) Доступ только у агента SQL и все файлы спрятаны и хранятся в структурированном виде. Плюс все это дело бекапится.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс