Хранение файлов в томах на диске (для УПП 1.3)

0. 837 04.06.16 15:58 Сейчас в теме
Доработка типовой УПП 1.3 в плане хранения присоединенных файлов вне базы данных

Перейти к публикации

Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. cool.vlad4 45 05.06.16 15:33 Сейчас в теме
а в вашей версии УПП есть модули ПрисоединенныеФайлы, ПрисоединенныеФайлыКлиент?(скорее всего есть) Имхо через него все проще можно было сделать. там уже готовые функции все есть.(т.е. через БСП это сделать)
2. wowik 837 05.06.16 22:05 Сейчас в теме
(1) cool.vlad4, сделайте, опубликуйте свой вариант, чё пальцы гнуть)
evgeniy_1c; user1320061; 1Cynep4eJIoBek; Trancer64; +4 2 Ответить
3. cool.vlad4 45 05.06.16 22:10 Сейчас в теме
(2) а я где-то пальцы гнул?
vano-ekt; bohdan-k; Мах; Irwin; pss1985; kadild; AlexKoso; CSiER; Рамзес; waol; sulfur17; +11 1 Ответить
4. Ivon 659 08.06.16 12:26 Сейчас в теме
Механизм интересен, но хранение в файловых шарах имеет свои минусы, порой очень существенные. Я бы делал хранение в отдельной БД - и бекапить проще и безопасность данных выше.
5. thelans 30 08.06.16 14:05 Сейчас в теме
На сколько я знаю в MS SQL есть возможность хранить файлы, сохранённые в поле BLOB, на диске. В 1С дорабатывать при этом ничего не надо, а выставить соответствующие настройки СУБД.
6. Xershi 1137 08.06.16 19:49 Сейчас в теме
(5) thelans, что то новенькое. Где про это почитать подробнее?
13. CSiER 30 14.06.16 07:21 Сейчас в теме
(6) Xershi, рискну предположить, что речь идет про filestream - но структурой бд "рулит" 1С (как в этом случае быть при реструктуризациях, триггерах и прочих мелочах с данными - тоже интересно).
14. cool.vlad4 45 15.06.16 01:06 Сейчас в теме
(6) Xershi, c 2008 sql server filestream как верно выше заметили и с 2012 filetables появились, котороые позволяют делать таблицы, связывать их с папкой, где можно будет работь уже с файлами привычными операциями. технология крутая, но как ее связать с 1С (какой профит от этого получить) , я не знаю. в принципе хранения в томах из БСП имхо достаточно для 1С, может ошибаюсь, поправьте.
7. webester 34 09.06.16 06:00 Сейчас в теме
(5)(6)Угу очень интересно, как это работает.
9. SuhoffGV 09.06.16 17:06 Сейчас в теме
(5) thelans, Только выгрузка в DT и бэкап средствами СУБД быстрее от этого не станут. А если хранить файлы в ФС то выгрузка в dt будет намного быстрее.
romankoav; +1 Ответить
8. kosmo0 100 09.06.16 08:58 Сейчас в теме
В подобных случаях у меня зачастую возникает вопрос - неужели люди не создают тестовые базы для всяких безобразий? (причем чтобы и пользователи могли изменения и/или новинки потестить).

К чему весь разговор. Тестовые базы зачастую это загруженная сохраненка рабочей БД. И в этом случае тестовая база может легко и непринужденно что-нибудь сотворить с сохраненными файлами рабочей БД. Так что не помешало бы сделать маленький механизм контроля какой БД с файлами можно работать, а какой - нет (либо только смотреть, но не менять).
KAV2; Krio2; ph33l; NazarovV; +4 Ответить
10. SuhoffGV 09.06.16 17:11 Сейчас в теме
(8) kosmo0, Создают. У меня в базе есть константа "СтрокаСоединенияСРабочейБазой". И процедура общего модуля "ЭтоРабочаяБаза()" которая проверяет совпадает ли строка соединения текущей базы с значением константы. Если совпадает, то база считается рабочей и критичный функционал работает нормально.

Но к сожалению хранение файлов во внешних каталогах пока не написали, но уже назрело. Бэкап средствами СУБД идет 80 минут. Только из-за файлов в базе.
11. Xershi 1137 09.06.16 17:14 Сейчас в теме
(10) SuhoffGV, а каков их объем? У нас 40 гигов на ссд за 130 сек бекапит.
15. SuhoffGV 21.06.16 17:13 Сейчас в теме
(11) Xershi, 40Гб только дамп сжатый а gzip занимает. База в postgresql на 300Gb SAS дисках. Размер самой базы по данным pg_admin - 65Gb. Из них чуть более 32,2Гб в виде файлов в базе.
12. vshish 137 10.06.16 03:12 Сейчас в теме
Все хорошо и вроде бы правильно, но. Как писал в [1] да есть Присоединенные файлы, и есть еще некоторые подводные камни.
Я о них знаю потому, что сам делал такую доработку. Вот она http://infostart.ru/public/411416/
и вообще этот метод работает и на КА 1.1 и на УТ 10.3 и на УПП 1.3 правда с релиза как появился механизм электронного обмена документами.
16. qapex 63 23.06.16 09:45 Сейчас в теме
добрый день, сервер 1с на linux, с правами на linux настроили, файлы записывает на шару, а при открытии выдает ошибку. По коду получилось, что ПолучитьФайлы() возвращает пустой массив и дальше код не отрабатывает. Получается, что ПолучитьФайлы() работает от клиента (и пути, и права), а запись файлов через сервер (и пути, и права под которыми сервер 1с запущен). А путь предполагается использовать один и тот же?
17. wowik 837 23.06.16 21:29 Сейчас в теме
(16) qapex, ПолучитьФайлы() - что за процедура?
22. alen-s 12.12.16 08:49 Сейчас в теме
(16)
У Вас получилось решить эту проблему?
18. qapex 63 24.06.16 06:58 Сейчас в теме
19. wowik 837 24.06.16 20:34 Сейчас в теме
(18) qapex, ну вообще должно работать, если папка открыта для сети и обращаетесь через "\\". Не знаю в чем дело.
20. Himikuda 22.07.16 07:56 Сейчас в теме
Всё работает класс) Огромное спасибо! хоть база пухнуть не будет. Только есть нюанс, имена файлов не корректно отображаются (набор символов) зато читаются., может кто то подскажет как это возможно поправить?
21. vovan_matveev 6 15.09.16 01:53 Сейчас в теме
Спасибо, wowik!
Статья очень помогла.

Я ограничился только тем что храню только присоединенные файлы (которые добавляются и отображаются через формы справочника Хранилище дополнительной информации)
таким образом я ограничился только первой частью статьи (доработка справочника Хранилище дополнительной информации и общий модуль), последней чстью (сохранение и открытие внешних файлов).

А вместо объемной средней части (где подмена функций во всех ссылках на "Хранилище.Получить()" я ограничился изменением одной функции модуля формы в справочнике Хранилище дополнительной информации.

В моем случае в базе уже были картинки хранящиеся внутри базы. поэтому мне было важно отображать и старый файлы и новые файлы из тома.

// Процедура показывает картинку текущей строки таблицы Изображения
//
// Параметры: 
//  Элемент - элемент формы, Изображения
//
// Возвращаемое значение:
//  Нет.
//
Процедура ПоказатьКартинкуТекущейСтроки(Элемент)

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

	//Проверка на новую строку, если новая то не обновляем изображение.
	Если НЕ Элемент.ТекущаяСтрока.Пустая() Тогда
		//Изменения на основе wowik
		ТекущаяКартинка = Элемент.ТекущиеДанные.Ссылка.Хранилище.Получить();
		Если  ТекущаяКартинка = Неопределено Тогда
			ТекущаяКартинка = ОбщийМодульРМ.ПолучитьДвоичныеДанныеФайлаВХранилище(Элемент.ТекущиеДанные.Ссылка);
		КонецЕсли;
		//--Изменения на основе wowik
		ЭлементыФормы.ПолеИзображения.Картинка = ?(ТекущаяКартинка <> Неопределено, ТекущаяКартинка, Новый Картинка());
	КонецЕсли;
	
	ОбновитьКнопкиОсновногоИзображения(ЭлементыФормы.Изображения.ТекущаяСтрока);

КонецПроцедуры
Показать
29. vlad636 1 10.04.20 05:20 Сейчас в теме
Спасибо, помогла статья для сильно измененной КА 1.1. Сделал как в (21)
23. alen-s 29.12.16 12:59 Сейчас в теме
24. n0ther 09.02.17 13:45 Сейчас в теме
Почему в справочник не добавлен реквизит Том с типом ТомаХраненияФайлов? Так же быстрее и проще, чем перебирать все тома.
25. wowik 837 03.04.17 11:40 Сейчас в теме +10 $m
(24)
ее и проще, чем перебирать все тома.

это уже бантики)
26. albertik88 8 04.05.17 07:00 Сейчас в теме
Добрый день, у меня упп версии 1.3.5.1 - она полностью доработана и абсолютно не обновляется...у меня вообще отсутствует вкладка электронные документы в настройках программы...а сейчас возникла необходимость хранение файлов вне базы...если есть возможность скинь мне базу cf, или выложи в облако...буду очень признателен и благодарен! zakievar@mail.ru
27. pss1985 3 03.05.18 05:20 Сейчас в теме
я у себя такое как-то реализовывал, но еще добавил права на открытие файла. Создал таб часть "Пользователи" с реквизитами Пользователь и право записи, право чтения. Если в ней есть пользователь, то дается право на осуществление действий с этим файлом. Бывают случаи, когда надо некоторым пользователям запретить открытие и изменение файла.
user1320061; 1Cynep4eJIoBek; alen-s; +3 Ответить
28. KOVRUS 21 20.02.20 12:30 Сейчас в теме
Очень помогла статься, сделал в сильно измененной Ут 10.3
30. evgeniy_1c 07.07.20 17:20 Сейчас в теме
Спасибо. Очень интересный вариант, заработал.
И на паре позиций попробовал, при перезаписи хранилища доп информации автоматом зачищается хранилище и создаётся внешний файл. (Не нужно каких-то костылей с переносом придумывать.
Но думаю лучше использовать имя файла
ИмяФайлаВТоме = СокрЛП(Строка(ТипЗнч(ЭтотОбъект.Объект)))+"_"+СокрЛП(Строка(ЭтотОбъект.Объект.Код))+"_"+Строка(Новый УникальныйИдентификатор)

добавляет тип объекта и его код для более быстрой идентификации на диске.
Режим совместимости "Версия 8.2.13"
31. evgeniy_1c 09.07.20 09:10 Сейчас в теме
(30)
Если имя файла в томе делать по такому способу (длинное название получается, не забыть поменять в длину строки "ИмяФайлаВТоме" по умолчанию 50, этого не хватит в некоторых случаях.
И чтобы совсем исключить форсмажор, то конечно не красиво, но лучше вначале имени файла указать УИД, а потом комментарии объекта и кода. И да, если вложение не справочника, а документа, то там должен быть НЕ ЭтотОбъект.Объект.Код, а ЭтотОбъект.Объект.Номер.

А так ещё раз по всем моментам прошёлся, гениально) Только у вас будет количество версий больше 99, то при получении файла это нужно поправлять. Или опять-таки в справочнике "Хранилище доп информации" есть реквизит с номером версии (при перезаписи элемента, номер прибавляется), то по факту можно искать файл тогда ИмяФайлаВТоме + "."+НомерВерсии

И поправил сохранение разрешения не картинки и возможного расширения более 4х символов

			НомерСимволаПередРасширениемФайла = СтрНайти(ЭтотОбъект.ИмяФайла,".","СКонца");
            Если Этотобъект.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Файл Тогда
                РасширениеФайла = СтрЗаменить(Прав(ИмяФайла,4),".","");
				Если НомерСимволаПередРасширениемФайла > 0 Тогда
					РасширениеФайла = Прав(Строка(ЭтотОбъект.ИмяФайла), Строка(СтрДлина(ЭтотОбъект.ИмяФайла)) - НомерСимволаПередРасширениемФайла);					
				КонецЕсли;				
                ДвоичныеДанныеФайла = Хранилище.Получить();
			Иначе				
				РасширениеФайла = "bmp";
				Если НомерСимволаПередРасширениемФайла > 0 Тогда
					РасширениеФайла = Прав(Строка(ЭтотОбъект.ИмяФайла), Строка(СтрДлина(ЭтотОбъект.ИмяФайла)) - НомерСимволаПередРасширениемФайла);					
				КонецЕсли;
                ВременныйФайл = ПолучитьИмяВременногоФайла(РасширениеФайла);
                Картинка = Хранилище.Получить();
                Картинка.Записать(ВременныйФайл); 
                ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ВременныйФайл);
            КонецЕсли;
Показать
32. MasI 9 22.07.20 17:10 Сейчас в теме
Большое спасибо, отличная доработка))
Оставьте свое сообщение
Вопросы с вознаграждением