Доброго всем!
Предлагаю вашему вниманию одно небольшое расширение, которое позволит прикреплять файлы к своим документам и справочникам без использования функционала БСП.
Необходимость в данной разработке нарисовалась, когда возникла потребность прикрутить возможность хранения файлов для базы, которую по некоторым причинам не допускалось снимать с поддержки, т.е. она полностью была на замке. Все разработки и дополнения к этой конфигурации реализовывались на расширениях, которые и необходимо было дополнить базовой функциональностью хранения присоединенных файлов.
Чтобы не городить много всякого однотипного в разных расширениях для решения этой задачи, я разработал небольшое расширение, позволяющее с минимальными исправлениями решить такую задачу.
Итак, вводные:
1. Конфигурация на замке
2. Должны быть реализованы загрузка, сохранение, удаление, чтение присоединенных файлов
3. Подключение к данному механизму не должно требовать монопольного режима, т.е. все объекты должны подключаться без изменения структуры базы данных.
4. Не хранить файлы в базе ("шобы не пухла"), хранить в отдельной папке на сервере.
Не буду расписывать реализацию, т.к. она максимально проста и незамысловата, вкратце - есть один справочник, который хранит данные файла и УИД на нужный объект; регистр, в измерении которого определен также УИД, а в ресурсах - булева переменная "ЕстьФайлы" (Почти как в БСП:)); несколько общих модулей со всей реализацией механизма.
Пример подключения
Чтобы использовать данный механизм, первое, что требуется - создать файлопомойку на сервере, куда собственно и будут сохраняться все файлы. Доступ к этой папке должен быть открыт для пользователя, от лица которого крутится сервер 1С, так как именно с сервера осуществляется запись файлов в эту папку. Путь к этой файлопомойке нужно прописать в константу "ПФ_ПутьККорнюХранилищаПрисоединенныхФайлов" (можно найти через режим тех.специалиста)
В константу "ПФ_МаксимальныйРазмерФайла" нужно записать максимально допустимый размер загружаемого файла в МБ.
В модуле общей формы "ПФ_ФормаПрисоединенныхФайлов" в процедуре "ДобавитьФайл" нужно реализовать получение имени текущего пользователя. Т.к. конфигурация, для которой расширение разрабатывалась, естественно, создана на основе БСП, то имя пользователя подгружалась через стандартный программный интерфейс. Для публикации этот кусок кода я закомментировал, чтобы расширение можно было подключать на любых конфигурациях:
// Пропишите получение текущего пользователя с учетом особенностей вашей базы
// ПараметрыЗаполнения.Загрузил = Строка(ПользователиКлиент.АвторизованныйПользователь());
ПараметрыЗаполнения.Загрузил = "<Текущий пользователь>";
Далее, для необходимых объектов нужно создать форму элемента и форму списка, в модуле которых нужно будет дополнить (создать) обработчик "ПриСозданииНаСервере" и создать метод-обработчик создаваемой команды. Код представлен в модулях форм справочника "_ДЕМО_", что в расширении. На примере формы списка:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// На этом этапе добавляется кнопка в ту панель, которая передается вторым параметром
ПФ_РаботаСФайлами.ДобавитьКоманду(ЭтотОбъект, Элементы.ФормаКоманднаяПанель);
КонецПроцедуры
// Этот метод вызывается вновь созданной командой при создании на сервере
// В нем нужно получить ссылку на необходимый объект и передать третьим параметром
// в метод ВыполнитьКоманду
&НаКлиенте
Процедура ПФ_ВыполнитьКоманду(Команда)
ТекДанн = Элементы.Список.ТекущиеДанные;
Если ТекДанн = Неопределено Тогда
Возврат;
КонецЕсли;
// В настройках реквизита поставьте флаг "Использовать всегда"
ВладелецФайла = ТекДанн.Ссылка;
ПФ_РаботаСФайламиКлиент.ВыполнитьКоманду(Команда, ЭтотОбъект, ВладелецФайла);
КонецПроцедуры
После того, как модули форм доработаны, осталось дополнить функцию "СписокКаталоговХраненияПрисоединенныхФайлов", что находится в общем модуле "ПФ_РаботаСФайламиПереопределяемый", а именно прописать нужный тип и указать имя подкаталога, куда буду сыпаться присоединенные файлы объектов этого типа:
Функция СписокКаталоговХраненияПрисоединенныхФайлов()
Соответствие = Новый Соответствие;
// Ключ = Тип объекта, Значение - имя папки
Соответствие.Вставить(Тип("СправочникСсылка.НовыйСправочник"), "new_cat");
// Соответствие.Вставить(Тип(""), "");
Возврат Соответствие;
КонецФункции
Можно навести красивостей и вывести на форму списка скрепочку. Для этого также, как и в механизме БСП, нужно прописать в запросе динамического списка соединение с регистром "ПФ_ЕстьФайлы", однако, т.к. регистр в расширении, делать это придется обходными путями:
1. Установить флажок "Произвольный запрос" для списка
2. Добавить в выбираемые поля "0 КАК ИндексКартинки"
3. Вывести это поле на форму, установить Вид "ПолеКартинки". Картинку значений не устанавливать.
4. При создании на сервере переопределить запрос динамического списка и установить картинку значений:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// На этом этапе добавляется кнопка в ту панель, которая передается вторым параметром
ПФ_РаботаСФайлами.ДобавитьКоманду(ЭтотОбъект, Элементы.ФормаКоманднаяПанель);
ТекстЗапроса =
"ВЫБРАТЬ
| СправочникНовыйСправочник.Ссылка,
| СправочникНовыйСправочник.ПометкаУдаления,
| СправочникНовыйСправочник.Код,
| СправочникНовыйСправочник.Наименование,
| СправочникНовыйСправочник.Предопределенный,
| СправочникНовыйСправочник.ИмяПредопределенныхДанных,
| ВЫБОР
| КОГДА РСЕстьФайлы.ЕстьФайлы ЕСТЬ NULL
| ТОГДА 1
| КОГДА РСЕстьФайлы.ЕстьФайлы
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК ИндексКартинки
|ИЗ
| Справочник.НовыйСправочник КАК СправочникНовыйСправочник
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПФ_ЕстьФайлы КАК РСЕстьФайлы
| ПО УНИКАЛЬНЫЙИДЕНТИФИКАТОР(СправочникНовыйСправочник.Ссылка) = РСЕстьФайлы.ВладелецФайла";
Список.ТекстЗапроса = ТекстЗапроса;
Элементы.ИндексКартинки.КартинкаЗначений = БиблиотекаКартинок.ПФ_Скрепка;
КонецПроцедуры
Ну, и напоследок, нужно дать всем пользователям права на чтение и запись в справочник "ПФ_ПрисоединенныеФайлы" и регистр "ПФ_ЕстьФайлы".
Собственно все, на этом подключение к механизму завершено. В указанной командной панели появится дополнительная кнопка, при нажатии на которую и открывается форма присоединенных файлов.
Расширение тестировалось на платформе 8.3.23.1865, тонкий клиент. Так как запросы используют функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР, вряд ли получится завести без существенных доработок на платформах ранее 8.3.22.
Не тестировалось на мобильном клиенте и веб-клиенте.
Спасибо за внимание, надеюсь, кому-нибудь это будет полезно.
ЗЫ. Сейчас смотрю, регистр ЕстьФайлы, ресурс ЕстьФайлы... Масло масляное. >_<. Ну, как есть...