Как реализовать перетаскивание файлов из проводника в обычные формы 1С

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В разработке на платформе 1С:Предприятие 8 часто возникает задача упростить пользователю процесс добавления внешних файлов. Вместо долгого поиска через диалоговое окно выбора файла, гораздо удобнее просто «перетащить» документ из папки прямо в форму. Однако в обычных формах этот механизм имеет свои особенности настройки. Рассмотрим подробно, как заставить Drag-and-Drop работать корректно.

Базовый механизм перетаскивания в обычных формах

Для реализации этой возможности мы можем использовать практически любой интерактивный элемент управления, но чаще всего для этих целей применяются ТабличноеПоле или ПолеВвода. Ключевым моментом здесь является правильная настройка двух взаимосвязанных событий: ПроверкаПеретаскивания и Перетаскивание.

Разберем по шагам, почему недостаточно настроить только одно событие. Когда пользователь заносит курсор с зажатым файлом над элемент формы, операционная система опрашивает приложение: «Готов ли этот элемент принять данный объект?». За этот ответ в 1С отвечает событие ПроверкаПеретаскивания. Если мы не пропишем в нем разрешение, событие самого перетаскивания просто не наступит.

Настройка события ПроверкаПеретаскивания

Проанализируем типичную ошибку начинающих разработчиков: они прописывают код в событии Перетаскивание, но визуально при попытке втащить файл видят запрещающий значок. Чтобы это исправить, необходимо в обработчике проверки явно указать системе, что мы разрешаем операцию.

Для этого в свойствах элемента управления (например, ТабличноеПоле1) находим событие ПроверкаПеретаскивания и создаем процедуру:


Процедура ТабличноеПоле1ПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Настройка, Режим)
    
    // По умолчанию система может блокировать перетаскивание внешних объектов
    СтандартнаяОбработка = Ложь;
    
    // Указываем, что мы разрешаем копирование (или перемещение)
    ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование;
    
КонецПроцедуры

Важный нюанс: установка СтандартнаяОбработка = Ложь критически важна. Именно это действие сообщает платформе, что алгоритм проверки перехватывается разработчиком, и стандартные запреты (если они есть) должны быть игнорированы.

Реализация получения данных в событии Перетаскивание

Теперь, когда система разрешила нам «бросить» файл на форму, нам нужно обработать полученные данные. В параметре ПараметрыПеретаскивания.Значение при перетаскивании из проводника Windows будет содержаться специальный объект, свойства которого зависят от того, что именно перетащил пользователь.

Рассмотрим пример кода, который извлекает путь к файлу и позволяет нам в дальнейшем использовать его (например, для чтения или прикрепления к документу):


Процедура ТабличноеПоле1Перетаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Настройка, Режим)
    
    // Проверяем, что нам передали именно файл
    Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") Тогда
        ПутьКФайлу = ПараметрыПеретаскивания.Значение.ПолноеИмя;
        Сообщить("Вы прикрепили файл: " + ПутьКФайлу);
        
        // Здесь можно вызвать процедуру загрузки файла в хранилище или прикрепить к объекту
        ОбработатьПрикрепленныйФайл(ПутьКФайлу);
    ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда
        // Если пользователь выделил в проводнике сразу несколько файлов
        Для Каждого ТекущийФайл Из ПараметрыПеретаскивания.Значение Цикл
            Если ТипЗнч(ТекущийФайл) = Тип("Файл") Тогда
                Сообщить("Обработка файла из списка: " + ТекущийФайл.ПолноеИмя);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

КонецПроцедуры

Почему перетаскивание может не работать? Проблемы UAC

Выясним причину, по которой даже при идеально написанном коде Drag-and-Drop может не подавать признаков жизни. Одной из самых коварных проблем является User Account Control (UAC) в Windows.

Если ваша 1С запущена «От имени администратора», а проводник Windows работает под обычным пользователем, механизм перетаскивания будет заблокирован самой операционной системой из соображений безопасности (технология UIPI). Система запрещает передавать сообщения от менее привилегированного процесса к более привилегированному. Выход один: запускать оба приложения с одинаковыми правами.

Использование ПоляHTMLДокумента

Рассмотрим альтернативный вариант. Иногда требуется реализовать более сложный интерфейс прикрепления файлов с использованием визуальных эффектов. Для этого можно использовать ПолеHTMLДокумента. В обычных формах этот элемент работает на движке Internet Explorer.

Для того чтобы перетаскивание заработало здесь, необходимо использовать события HTML5, такие как ondrop и ondragover. Однако будьте осторожны: по умолчанию браузер пытается просто открыть файл (например, картинку) в окне. Чтобы этого не произошло, в JavaScript коде обязательно нужно использовать event.preventDefault().

Пример структуры HTML для приема файлов:


<div id="drop-zone" 
     style="width: 200px; height: 100px; border: 2px dashed #ccc;"
     ondragover="event.preventDefault();" 
     ondrop="window.external.ОбработатьФайл(event.dataTransfer.files[0].name);">
    Перетащите файл сюда
</div>

Для возврата пути к файлу обратно в 1С из HTML-поля обычно используют механизм внешнего события или обработку изменения location.href, которую 1С умеет перехватывать.

Работа в терминальном режиме (RDP)

Проанализируем ситуацию при работе через удаленный рабочий стол. Многие пользователи ожидают, что они смогут перетащить файл со своего личного компьютера (локального) прямо в окно 1С, открытое через RDP.

Важно понимать: стандартный протокол RDP не поддерживает прямой Drag-and-Drop файлов между локальным рабочим столом и удаленным сеансом таким способом. Перетаскивание будет работать только внутри удаленного сервера (например, из папки на сервере в 1С на том же сервере). Если пользователям нужно передавать файлы с локальных машин, придется использовать стандартные диалоги выбора файла через проброшенные диски или сторонние утилиты синхронизации буфера обмена.

Итоги и рекомендации

Подводя итог, для реализации перетаскивания файлов в обычных формах 1С придерживайтесь следующих правил:

  1. Используйте ТабличноеПоле как наиболее стабильный приемник.
  2. Обязательно определяйте СтандартнаяОбработка = Ложь в событии ПроверкаПеретаскивания.
  3. Всегда проверяйте тип входящего значения в ПараметрыПеретаскивания.Значение (это может быть как одиночный объект Файл, так и Массив файлов).
  4. Следите за правами запуска приложений (UAC) — они должны совпадать у 1С и проводника.
  5. Помните об ограничениях RDP при работе с удаленными пользователями.

Соблюдение этих шагов позволит вам создать удобный и современный интерфейс даже в конфигурациях на базе обычных форм.

← На главную