Прикрепление внешних файлов к документам и справочникам 1С 8.3 (управляемые формы)
В данной статье мы рассмотрим, как просто и быстро в любую конфигурацию на базе управляемых форм добавить функционал прикрепления внешних файлов к документам и справочникам.
Я начну описание с нуля, т.е. с создания пустой конфигурации. Так что даже любой малоопытный разработчик (вроде меня =) ) сможет реализовать данный функционал в своей или уже написанной конфигурации.
Если Вам не хочется разбираться с ниже написанной инструкцией, можете скачать файл*.doc с описанием и скриншотами, либо уже саму готовую конфигурацию.
Я начну описание с нуля, т.е. с создания пустой конфигурации. Так что даже любой малоопытный разработчик (вроде меня =) ) сможет реализовать данный функционал в своей или уже написанной конфигурации.
Если Вам не хочется разбираться с ниже написанной инструкцией, можете скачать файл*.doc с описанием и скриншотами, либо уже саму готовую конфигурацию.
Комментарии
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
Так что даже любой малоопытный разработчик (вроде меня =) ) сможет реализовать данный функционал в своей или уже написанной конфигурации.
Хранение произвольных данных в конфигурации(сканов, фотографий, документов и тд) не самый хороший вариант.
Я бы сказал что даже очень не хороший. Прихожу как то в одну компанию. А они говорят у нас база тормозит.
Смотрю базу размер 76 Гб. База на SQL сервере. Какой то талантливый парень дописал хранение документов в реквизит объекта.
Начинаю разбираться... в итоге вес учётных данных в базе 1.5 Гб. А всё остальное натолкали пользователи, сканов, фотографий и тд . Пришлось выносить во внешнее хранилище....
Вес некоторых фотографий доходил до 7 Мб. Натолкают 10-15 фотографий в базу... а потом у них тормозит всё....
(1) TODD22, согласен с вами полностью! Но я столкнулся с другой ситуацией, когда надо было написать конфигурацию для учета заявок и к каждой заявке прикреплять несколько документов (решения, отчет по выполнению и т.д.). При этом базу часто переносят с компьютера на компьютер и прикрепленные файлы могут просто остаться в другом месте. Т.к. конфа была самописная и весила менее 10Мб, то мое решение оказалось вполне уместным.
А мы в этих же управляемых формах сделали так: есть закладка "Файлы" в нее добавляешь файл, а он передает этот файл в секретный каталог на сервере и сохраняет внутри программы путь к этому файлу. В итоге в Базе хранятся лишь ссылка на файлы. Сами файлы в каталоге на сервере, который архивируется каждый день. И база не растет и ограничений на файлы нет. Есть правда пока нюанс. Работает только внутри сети. Если кто-то заходит через Web сервер то доступ к файлам не дается.
1.Скриншот через «о». Но это так, к слову
2.Хорошо было бы не привязывать 1 одному дркументу или справочнику владельцу. Сделать регистр сведений, измерения: «Ссылка на владельца» и «Ссылка на файл».
Тогда можно 1 хранимый файл привязывать к нескольким. Это кажется лишним? Ничего подобного - у меня уже такая необходимость случилась.
Тогда при добавлении справочника, допустим, «Номенклатура» его тип можно добавить в тип измерения.
3.Да, программа будет жутко торможить при считывании об'екта. Но при указании ссылки на справочник файлов или при испролльзовании связывающего регистра - никак. У меня ещё и не такие монстры в наследство достались...
4.И всё же файлы лучше хранить на диске - в справочнике файлы указывать ссылку на местоположение на сетевом диске. (у этого местоположения доступ пользователя, от которого запущен сервер 1С и недоступность пользователей). И - самое интересное - файлы легко архивировать
5.А вот шаблоны, бланки договоров и прочее «редкое и маломеняемое» - это да, самые что ни на есть хранимые файлы
6.Адрес временного хранилища в реквизите хранить не имеет смысла. Файл во временном хранилище живёт пока открыта форма, где он загружен.
2.Хорошо было бы не привязывать 1 одному дркументу или справочнику владельцу. Сделать регистр сведений, измерения: «Ссылка на владельца» и «Ссылка на файл».
Тогда можно 1 хранимый файл привязывать к нескольким. Это кажется лишним? Ничего подобного - у меня уже такая необходимость случилась.
Тогда при добавлении справочника, допустим, «Номенклатура» его тип можно добавить в тип измерения.
3.Да, программа будет жутко торможить при считывании об'екта. Но при указании ссылки на справочник файлов или при испролльзовании связывающего регистра - никак. У меня ещё и не такие монстры в наследство достались...
4.И всё же файлы лучше хранить на диске - в справочнике файлы указывать ссылку на местоположение на сетевом диске. (у этого местоположения доступ пользователя, от которого запущен сервер 1С и недоступность пользователей). И - самое интересное - файлы легко архивировать
5.А вот шаблоны, бланки договоров и прочее «редкое и маломеняемое» - это да, самые что ни на есть хранимые файлы
6.Адрес временного хранилища в реквизите хранить не имеет смысла. Файл во временном хранилище живёт пока открыта форма, где он загружен.
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
//Удалить файл из временного хранилища
Если ЭтоАдресВременногоХранилища(СсылкаНаФайлВоВременномХранилище) Тогда
УдалитьИзВременногоХранилища(СсылкаНаФайлВоВременномХранилище);
КонецЕсли;
КонецПроцедуры
Мне кажется вот эта часть кода не нужна. Если временное хранилище привязано к форме то после закрытия формы оно будет очищено автоматически.
И принудительно при записи объекта его большого смысла очищать нет.
Спасибо за подробную раскладку, а то зависла я с добавлением файла в управляемой форме уже продолжительное время. Попробую реализовать по этому алгоритму. А вместо справочника регистр сведений можно использовать?
(12) HamitovaRaisa, справочник с файлами не обязательно делать доступным для клиента, можно лишь оставить переход по ссылкам из формы документа или справочника. С Регистрами, если честно, не пробывал, но как минимум в Измерения нельзя добавить ХранилищеЗначения.
Итак, справочник «Файлы» будет содержать два реквизита: Файл (для хранения двоичных данных), ИмяФайла (для хранения имени загруженного файла) и СсылкаНаВладельца (для привязки файла к нужному для нас документу).
Файл + ИмяФайла + СсылкаНаВладельца <> 2 реквизита
Добрый день, сделал все по примеру, при попытке получить файлы ошибка
{Документ.ТестФайлы.Форма.ФормаДокумента.Форма(22)}: Ошибка при вызове метода контекста (Выполнить)
ТЗ = Запрос.Выполнить().Выгрузить();
по причине:
{(5, 9)}: Таблица не найдена "КритерийОтбора.СвязанныеДокументы"
<<?>>КритерийОтбора.СвязанныеДокументы(&ЗначениеКритерияОтбора) КАК СтруктураПодчиненности
{Документ.ТестФайлы.Форма.ФормаДокумента.Форма(22)}: Ошибка при вызове метода контекста (Выполнить)
ТЗ = Запрос.Выполнить().Выгрузить();
по причине:
{(5, 9)}: Таблица не найдена "КритерийОтбора.СвязанныеДокументы"
<<?>>КритерийОтбора.СвязанныеДокументы(&ЗначениеКритерияОтбора) КАК СтруктураПодчиненности
На шаге "5" - И перетаскиваем в нее реквизиты так как показано на картинке ниже. Аналогично создаем еще одну такую группу с названием «Файлы» и перетаскиваем в нее «Список Документов»
Картинки нет ; ) И тут чтот не понятно.
Картинки нет ; ) И тут чтот не понятно.
Модальность на УФ? Зачем? Создайте справочник, киньте в него нужные реквизиты: Имя файла - имя файла с расширением, Наименование - без расширения, объект - составной тип, сюда пихаем все документы, которые будут записывать файл, ну и хранилище - хранилище значения.
В форме самого документа создаем команду, пишем код.
Подобный пример разбирал Павел Чистов. Это кусок из моей конфигурации.
В форме самого документа создаем команду, пишем код.
Подобный пример разбирал Павел Чистов. Это кусок из моей конфигурации.
&НаКлиенте
Процедура ПриложитьФайл(Команда)
ПриложениеФайлаОповещение(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПриложениеФайлаОповещение(ЭтотОбъект)
Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВыборФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
//Если пользователь отказался от выбора файла, то закрываем форму
Если Не Результат Тогда
Возврат;
КонецЕсли;
ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Процедура ЗаписатьВложениеНаСервере(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры)
ВыбранныйФайл = Новый Файл(ВыбранноеИмяФайла);
НовыйФайл = Справочники.ХранилищеФайлов.СоздатьЭлемент();
НовыйФайл.Наименование = ВыбранныйФайл.ИмяБезРасширения;
НовыйФайл.ИмяФайла = ВыбранныйФайл.Имя;
НовыйФайл.Объект = Объект.Ссылка;
//Записываем данные файла из временного хранилища в реквизит формы справочника.
Если ЭтоАдресВременногоХранилища(Адрес) Тогда
НовыйФайл.Хранилище = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Адрес));
КонецЕсли;
НовыйФайл.Записать();
КонецПроцедуры
ПоказатьВопросы с вознаграждением
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|