а в вашей версии УПП есть модули ПрисоединенныеФайлы, ПрисоединенныеФайлыКлиент?(скорее всего есть) Имхо через него все проще можно было сделать. там уже готовые функции все есть.(т.е. через БСП это сделать)
Механизм интересен, но хранение в файловых шарах имеет свои минусы, порой очень существенные. Я бы делал хранение в отдельной БД - и бекапить проще и безопасность данных выше.
На сколько я знаю в MS SQL есть возможность хранить файлы, сохранённые в поле BLOB, на диске. В 1С дорабатывать при этом ничего не надо, а выставить соответствующие настройки СУБД.
(6) Xershi, рискну предположить, что речь идет про filestream - но структурой бд "рулит" 1С (как в этом случае быть при реструктуризациях, триггерах и прочих мелочах с данными - тоже интересно).
(6) Xershi, c 2008 sql server filestream как верно выше заметили и с 2012 filetables появились, котороые позволяют делать таблицы, связывать их с папкой, где можно будет работь уже с файлами привычными операциями. технология крутая, но как ее связать с 1С (какой профит от этого получить) , я не знаю. в принципе хранения в томах из БСП имхо достаточно для 1С, может ошибаюсь, поправьте.
(5) thelans, Только выгрузка в DT и бэкап средствами СУБД быстрее от этого не станут. А если хранить файлы в ФС то выгрузка в dt будет намного быстрее.
В подобных случаях у меня зачастую возникает вопрос - неужели люди не создают тестовые базы для всяких безобразий? (причем чтобы и пользователи могли изменения и/или новинки потестить).
К чему весь разговор. Тестовые базы зачастую это загруженная сохраненка рабочей БД. И в этом случае тестовая база может легко и непринужденно что-нибудь сотворить с сохраненными файлами рабочей БД. Так что не помешало бы сделать маленький механизм контроля какой БД с файлами можно работать, а какой - нет (либо только смотреть, но не менять).
(8) kosmo0, Создают. У меня в базе есть константа "СтрокаСоединенияСРабочейБазой". И процедура общего модуля "ЭтоРабочаяБаза()" которая проверяет совпадает ли строка соединения текущей базы с значением константы. Если совпадает, то база считается рабочей и критичный функционал работает нормально.
Но к сожалению хранение файлов во внешних каталогах пока не написали, но уже назрело. Бэкап средствами СУБД идет 80 минут. Только из-за файлов в базе.
(11) Xershi, 40Гб только дамп сжатый а gzip занимает. База в postgresql на 300Gb SAS дисках. Размер самой базы по данным pg_admin - 65Gb. Из них чуть более 32,2Гб в виде файлов в базе.
Все хорошо и вроде бы правильно, но. Как писал в [1] да есть Присоединенные файлы, и есть еще некоторые подводные камни.
Я о них знаю потому, что сам делал такую доработку. Вот она http://infostart.ru/public/411416/ и вообще этот метод работает и на КА 1.1 и на УТ 10.3 и на УПП 1.3 правда с релиза как появился механизм электронного обмена документами.
добрый день, сервер 1с на linux, с правами на linux настроили, файлы записывает на шару, а при открытии выдает ошибку. По коду получилось, что ПолучитьФайлы() возвращает пустой массив и дальше код не отрабатывает. Получается, что ПолучитьФайлы() работает от клиента (и пути, и права), а запись файлов через сервер (и пути, и права под которыми сервер 1с запущен). А путь предполагается использовать один и тот же?
Всё работает класс) Огромное спасибо! хоть база пухнуть не будет. Только есть нюанс, имена файлов не корректно отображаются (набор символов) зато читаются., может кто то подскажет как это возможно поправить?
Я ограничился только тем что храню только присоединенные файлы (которые добавляются и отображаются через формы справочника Хранилище дополнительной информации)
таким образом я ограничился только первой частью статьи (доработка справочника Хранилище дополнительной информации и общий модуль), последней чстью (сохранение и открытие внешних файлов).
А вместо объемной средней части (где подмена функций во всех ссылках на "Хранилище.Получить()" я ограничился изменением одной функции модуля формы в справочнике Хранилище дополнительной информации.
В моем случае в базе уже были картинки хранящиеся внутри базы. поэтому мне было важно отображать и старый файлы и новые файлы из тома.
// Процедура показывает картинку текущей строки таблицы Изображения
//
// Параметры:
// Элемент - элемент формы, Изображения
//
// Возвращаемое значение:
// Нет.
//
Процедура ПоказатьКартинкуТекущейСтроки(Элемент)
Если Элемент.ТекущиеДанные = Неопределено Тогда
ЭлементыФормы.ПолеИзображения.Картинка = Новый Картинка();
Возврат;
КонецЕсли;
//Проверка на новую строку, если новая то не обновляем изображение.
Если НЕ Элемент.ТекущаяСтрока.Пустая() Тогда
//Изменения на основе wowik
ТекущаяКартинка = Элемент.ТекущиеДанные.Ссылка.Хранилище.Получить();
Если ТекущаяКартинка = Неопределено Тогда
ТекущаяКартинка = ОбщийМодульРМ.ПолучитьДвоичныеДанныеФайлаВХранилище(Элемент.ТекущиеДанные.Ссылка);
КонецЕсли;
//--Изменения на основе wowik
ЭлементыФормы.ПолеИзображения.Картинка = ?(ТекущаяКартинка <> Неопределено, ТекущаяКартинка, Новый Картинка());
КонецЕсли;
ОбновитьКнопкиОсновногоИзображения(ЭлементыФормы.Изображения.ТекущаяСтрока);
КонецПроцедуры
Добрый день, у меня упп версии 1.3.5.1 - она полностью доработана и абсолютно не обновляется...у меня вообще отсутствует вкладка электронные документы в настройках программы...а сейчас возникла необходимость хранение файлов вне базы...если есть возможность скинь мне базу cf, или выложи в облако...буду очень признателен и благодарен! zakievar@mail.ru
я у себя такое как-то реализовывал, но еще добавил права на открытие файла. Создал таб часть "Пользователи" с реквизитами Пользователь и право записи, право чтения. Если в ней есть пользователь, то дается право на осуществление действий с этим файлом. Бывают случаи, когда надо некоторым пользователям запретить открытие и изменение файла.
Спасибо. Очень интересный вариант, заработал.
И на паре позиций попробовал, при перезаписи хранилища доп информации автоматом зачищается хранилище и создаётся внешний файл. (Не нужно каких-то костылей с переносом придумывать.
Но думаю лучше использовать имя файла
(30)
Если имя файла в томе делать по такому способу (длинное название получается, не забыть поменять в длину строки "ИмяФайлаВТоме" по умолчанию 50, этого не хватит в некоторых случаях.
И чтобы совсем исключить форсмажор, то конечно не красиво, но лучше вначале имени файла указать УИД, а потом комментарии объекта и кода. И да, если вложение не справочника, а документа, то там должен быть НЕ ЭтотОбъект.Объект.Код, а ЭтотОбъект.Объект.Номер.
А так ещё раз по всем моментам прошёлся, гениально) Только у вас будет количество версий больше 99, то при получении файла это нужно поправлять. Или опять-таки в справочнике "Хранилище доп информации" есть реквизит с номером версии (при перезаписи элемента, номер прибавляется), то по факту можно искать файл тогда ИмяФайлаВТоме + "."+НомерВерсии
И поправил сохранение разрешения не картинки и возможного расширения более 4х символов
НомерСимволаПередРасширениемФайла = СтрНайти(ЭтотОбъект.ИмяФайла,".","СКонца");
Если Этотобъект.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Файл Тогда
РасширениеФайла = СтрЗаменить(Прав(ИмяФайла,4),".","");
Если НомерСимволаПередРасширениемФайла > 0 Тогда
РасширениеФайла = Прав(Строка(ЭтотОбъект.ИмяФайла), Строка(СтрДлина(ЭтотОбъект.ИмяФайла)) - НомерСимволаПередРасширениемФайла);
КонецЕсли;
ДвоичныеДанныеФайла = Хранилище.Получить();
Иначе
РасширениеФайла = "bmp";
Если НомерСимволаПередРасширениемФайла > 0 Тогда
РасширениеФайла = Прав(Строка(ЭтотОбъект.ИмяФайла), Строка(СтрДлина(ЭтотОбъект.ИмяФайла)) - НомерСимволаПередРасширениемФайла);
КонецЕсли;
ВременныйФайл = ПолучитьИмяВременногоФайла(РасширениеФайла);
Картинка = Хранилище.Получить();
Картинка.Записать(ВременныйФайл);
ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ВременныйФайл);
КонецЕсли;