Всем здравствуйте.
Возникла потребность прикрепления файлов к документам и справочникам (конфа созданная с нуля).
Есть ссылка на публикацию https://infostart.ru/public/408860/ это все хорошо, я как бы ее использовал, но все же хранение произвольных данных в конфигурации типа сканов, фотографий, документов и тп. не самый хороший вариант. Хранение документов в реквизит объекта не удобно и база начинает тормозить.
Есть ли где информация или описание как создать в конфе ссылку на вложение файла - нужно для учета заявок и к каждой заявке прикреплять несколько документов - точнее хочу что бы была ссылка/гиперссылке на прикрепленный файл в расшаренной папке ссылалось на сервер отдельно от самой базы. Также вариант если возможно по данной ссылке/гиперссылке скачать или просмотреть вложенный файл.
в том то и дела что БСП ее нет - я хотел бы все с нуля сделать своей конфе. ну и плюс аля зеленый и начинающий в этом - только помощь гугл с обучение 1с конфы)))))
Если предполагается, что один и тот же файл может иметь несколько редакций, то регистр можно сделать периодическим, иначе нет смысла.
Далее создаешь общую форму, на которой размещаешь табличное поле "Файлы" с реквизитами ИмяФайла(Строка100) и ПутьДоФайла(Строка Неогр).
Поле "ПутьДоФайла" скрываешь, оставляешь только "ИмяФайла". Добавляешь форме реквизит Ссылка (Любая ссылка).
Перед открытием формы (из документа или справочника) передаешь в нее ссылку на объект из которого она вызвана в реквизит "Ссылка".
При открытии формы выполняешь запрос к регистру "ПрикрепленныеФайлы" и заполняешь табличное поле "Файлы".
А что касается самого механизма прикрепления, то ниже немного кода:
Процедура ФайлыПередНачаломДобавления(Элемент, Отказ, Копирование)
Если Копирование Тогда
Отказ = Истина; //Или придумай сам как обработать копирование, я бы вообще убрал его из меню таблицы
Иначе
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытияФайла.ПолноеИмяФайла = "";
Фильтр = "MS Word 2003(*.doc)|*.doc"; //Можно прописать форматы файлов (один или несколько), доступные для приклепления
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файл:";
Если ДиалогОткрытияФайла.Выбрать() Тогда
ИмяФайла = Прав(СтрЗаменить(ДиалогОткрытияФайла.ПолноеИмяФайла, ДиалогОткрытияФайла.Каталог, ""), 100); //Усекаем до 100 символов, с сохранением расширения
КаталогКФ = "\\Server\Files$\"; //Лучше конечно хранить это значение где-нибудь в константах, на случай перемещения папки с файлами
ПутьДляКопирования = КаталогКФ + Ссылка.УникальныйИдентификатор() +"\";
Попытка
СоздатьКаталог(ПутьДляКопирования);
КопироватьФайл(ДиалогОткрытияФайла.ПолноеИмяФайла, ПутьДляКопирования+ИмяФайла);
МЗ = РегистрыСведений.ПрикрепленныеФайлы.СоздатьМенеджерЗаписи();
МЗ.Ссылка = Ссылка;
МЗ.ИмяФайла = ИмяФайла;
МЗ.ПутьДоФайла = Ссылка.УникальныйИдентификатор();
МЗ.Записать(Истина);
ОбновитьТаблицуФайлов(); //Перезаполняем таблицу "Файлы" аналогично как "ПриОткрытии" формы
Отказ = Истина;
Исключение
Сообщить("Недостаточно прав для редактирования!");
Отказ = Истина;
КонецПопытки;
Иначе
Предупреждение("Файл не выбран!");
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Для колонки "Имя файла" добавить кнопку "Открытие", но запретить редактирование текста
Процедура ФайлыИмяФайлаОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КаталогКФ = "\\Server\Files$\"; //Лучше конечно хранить это значение где-нибудь в константах, на случай перемещения папки с файлами
ПутьДоФайла = КаталогКФ + ЭлементыФормы.Файлы.ТекущаяСтрока.ПутьДоФайла +"\"+ ЭлементыФормы.Файлы.ТекущаяСтрока.ИмяФайла;
ЗапуститьПриложение(ПутьДоФайла);
КонецПроцедуры
//Обработка удаления файла
Процедура ФайлыПередУдалением(Элемент, Отказ)
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос("УДАЛИТЬ файл?", Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Попытка
//Очищается только регистр, если нужно, то допиши тут и удаление самого файла с сервера
МЗ = РегистрыСведений.ПрикрепленныеФайлы.СоздатьМенеджерЗаписи();
МЗ.ИмяФайла = ЭлементыФормы.Файлы.ТекущаяСтрока.ИмяФайла;
МЗ.Ссылка = Ссылка;
МЗ.Удалить();
Исключение
Сообщить("Недостаточно прав для редактирования!");
Отказ = Истина;
КонецПопытки;
КонецПроцедуры
Показать
Хотя, если в качестве папки для храненения использовать "УникальныйИдентификатор", то поле "Ссылка" в регистре избыточно. Можно обойтись только "ПутьДоФайла" и "ИмяФайла" (Но тогда оба они должны быть измерениями). Ну и "ПутьДоФайла" можно ограничить 36 символами, тк GUID имеет фиксированную длину.
Некоторые недостатки:
1. К одному документу/справочнику не получится прикрепить два файла с одним именем (ну или добавляй регистру периодичность)
2. У пользователей должен быть доступ на запись в общую сетевую папку, и если кто-то из них поймает вирус-шифровальщик, то "Шеф, все пропало!"
Помни, что эту папку нужно бэкапить так же как и саму базу данных
Далее создаешь общую форму, на которой размещаешь табличное поле "Файлы" с реквизитами ИмяФайла(Строка100) и ПутьДоФайла(Строка Неогр).
Поле "ПутьДоФайла" скрываешь, оставляешь только "ИмяФайла". Добавляешь форме реквизит Ссылка (Любая ссылка).
если не сложно поясните для тех "кто в танке", общею форму создаем (скрин1) или в регистре сведений. (скрин2).
(4)
мучился и не черта не получилось ((((
выдает ошибку:
{РегистрСведений.ПрикрепленныеФайлы.Форма.ФормаЗаписи.Форма(8,29)}: Тип не определен (ДиалогВыбораФайла)
ДиалогОткрытияФайла = Новый <<?>>ДиалогВыбораФайла(Режим);
(28) Офигеть!!! TIM TIM я снова начинаю верить в человечество :)
Побольше бы в мире таких порядочных людей как Вы!
Спасибо большое, извините что вредничал :)
Офигеть!!! TIM TIM я снова начинаю верить в человечество :)
Побольше бы в мире таких порядочных людей как Вы!
Спасибо большое, извините что вредничал :)
* Намного легче, чем регистр, реализовать, создав у объекта ТЧ.
У нее пару реквизитов строковых: наименование док-та и физическое имя файла.
* А в моей конф-ии файлы хранятся в базе. И нич-че! Да и у тебя, похоже, база не для космоса, а больше для документооборота. Обращения к документам, как правило, делаются к их шапкам. А доки лежат в ТЧ, и не мешают. Кроме редактирования самих доков.
* Есть и компромиссный вариант: в подчиненных справочниках.
* А в моей конф-ии файлы хранятся в базе. И нич-че! Да и у тебя, похоже, база не для космоса, а больше для документооборота. Обращения к документам, как правило, делаются к их шапкам. А доки лежат в ТЧ, и не мешают. Кроме редактирования самих доков.
Ну я бы не сказал что для космоса но все же - четыре специалиста которые будут заводить доки и прикреплять к ним файлы размером не менее 2 Мб. в среднем в месяц один специалист заводит по 300 заявок к которым он будет цеплять дополнительные файлы сканов - а их четверо и это только по одному объекту - объектов пять и вообщем проект на два года. Я думаю что объем за три месяц приличный будет.
Считаю: 2М х 300 х 4чела х 5 объектов = 12 000. Действительно 12Г за месяц.
Многовато.
Возникает философский вопрос: а будь они в файлах, их будете хранить все?
Или же старые удалять?
Для меня этот вопрос роста базы, естественно, актуален. У меня он относится к вложениям в э/письма.
Поэтому сделал обработку, которая очищает файлы в документах 2-3 месячной давности.
Но у меня эти вложения не так важны, т.к. это печатные формы Счетов, договоров. Их потеря никому не страшна - сами Счета и договора
есть в базе.
Так что, думайте. Есть плюсы и минусы в одном и другом.
Считаю: 2М х 300 х 4чела х 5 объектов = 12 000. Действительно 12Г за месяц.
Многовато.
Возникает философский вопрос: а будь они в файлах, их будете хранить все?
Или же старые удалять?
Да конечно будут хранить (это сканы с подписями и печатями) - потому я и хочу сделать прикрепляемые файлы отдельно - эти сканы файлов нужны для сдачи объекта заказчику.
Вот такие пироги...
(24)Тому кто пишет конфу с нуля разобраться в коде БСП не должно быть трудно. А советуют потому что в БСП данный механизм реализован. Вам советуют подключить подсистему БСП и использовать ее.