При разработке обработок и документов в 1С часто возникает задача прикрепления файлов (например, фотографий физических лиц или сканов документов) простым перетаскиванием мыши из Проводника Windows напрямую в таблицу формы. Рассмотрим, как правильно настроить свойства элементов управляемой формы и написать обработчики событий для поддержки механизма Drag-and-Drop.
Для того чтобы таблица формы могла принимать перетаскиваемые файлы из операционной системы, необходимо предварительно настроить свойства таблицы в редакторе формы:
Истина.КакФайл (передаются данные самого файла) или КакСсылкуНаФайл (передается путь к файлу в ОС) в зависимости от требований решаемой задачи.Разберем основные события таблицы формы, отвечающие за процесс перетаскивания:
ПроверкаПеретаскивания — вызывается при наведении курсора с зажатым файлом на таблицу. Здесь мы проверяем, можно ли сбросить файл в данное место, и разрешаем операцию.Перетаскивание — вызывается в момент, когда пользователь отпускает клавишу мыши над целевой строкой.Проанализируем пример кода для клиентской части формы. В событии ПроверкаПеретаскивания мы отключаем стандартную обработку платформы и указываем действие копирования:
&НаКлиенте
Процедура ТаблицаФизЛицПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь;
ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование;
КонецПроцедуры
Далее разберем процедуру Перетаскивание, которая получает сброшенный файл и обрабатывает его для привязки к конкретной строке справочника или таблицы значений:
&НаКлиенте
Процедура ТаблицаФизЛицПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь;
// Проверяем, что файл перетащен на конкретную строку таблицы
Если Строка = Неопределено Тогда
Возврат;
КонецЕсли;
// Получаем путь к перетащенному файлу из параметров
ИмяФайла = ПараметрыПеретаскивания.Значение.ПолноеИмя;
ФайлИсточник = Новый Файл(ИмяФайла);
Если Не ФайлИсточник.Существует() Тогда
Возврат;
КонецЕсли;
// Получаем текущие данные целевой строки таблицы
ТекущиеДанные = Элементы.ТаблицаФизЛиц.ДанныеСтроки(Строка);
// Пример сохранения пути к файлу или помещения его в хранилище
ТекущиеДанные.ИмяФайла = ФайлИсточник.Имя;
ТекущиеДанные.ПутьКФайлу = ФайлИсточник.ПолноеИмя;
Сообщить("Файл " + ФайлИсточник.Имя + " успешно прикреплен!");
КонецПроцедуры
Если требуется записать двоичные данные файла непосредственно в информационную базу (например, в реквизит типа ХранилищеЗначения), необходимо выполнить поместить файл во временное хранилище на клиенте и передать полученный адрес на сервер:
ПолучитьИзВременногоХранилища() и записываем их в реквизит объекта.Выясним частые причины, по которым перетаскивание файлов из Проводника может не работать:
ПараметрыПеретаскивания.Значение содержит массив объектов файлов, который необходимо обрабатывать в цикле Для Каждого.