1с способ перетаскивания файлов
Как только я узнал о существовании перетаскивания, я очень удивился тому факту, что оно так мало используется в типовых конфигурациях. И решил я реализовать свой взгляд на эффективное использование этого механизма.
Для начала немного общих моментов о самом механизме.
Самое понятие "перетаскивание" (Drag&Drop) подразумевает интерактивную передачу значения от источника приемнику.
Событий перетаскивания всего 4:
- НачалоПеретаскивания
- ОкончаниеПеретаскивания
- ПроверкаПеретаскивания
- Перетаскивание
Для первой пары событий необходимо установить флажок в настройках элемента управления "Разрешить начало перетаскивания". Для второй пары - "Разрешить перетаскивание".
Перетаскивание реализовано для двух видов элементов управления: ТабличноеПоле и ПолеТабличногоДокумента . Для поля табличного документа есть некоторые ограничения. Во-первых, в режиме ТолькоПросмотр обрабатываются только первая пара событий, т.е. в этом случае оно не может выступать в качестве приемника. Во-вторых, начало перетаскивания может быть вызвано только для одной прямоугольной области.
У каждого типа обработчика события перетаскивания есть параметр ПараметрыПеретаскивания .
Этот параметр представляет собой структуру из 3-х элементов:
- Действие
- ДопустимыеДействия
- Значение
Начнем с последнего параметра - Значение . Он при стандартном начале перетаскивания в разных случаях имеет различный тип. Если источником является элемент управления типа ТабличноеПоле , то значение перетаскивания будет иметь тип строки значения табличного поля в одиночном режиме выделения и тип Массив в случае множественного режима выделения, где элементами массива будут строки значения табличного поля. В случае поля табличного документа тип значения будет ТабличныйДокумент и будет содержать одну выделенную прямоугольную область.
Параметр Действие отвечает за внешний вид курсора и используется для управления типом перетаскивания. Он может принимать 4 значения:
- Выбор
- Копирование
- Отмена
- Перемещение
При перетаскивании левой кнопкой мыши по умолчанию Действие содержит Перемещение . Если пользователя дополнительно удерживает нажатой клавишу <CTRL>, то Действие содержит Копирование . Если претаскивание производится правой кнопкой мыши, то по умолчанию Действие содержит Выбор независимо от состояния клавиши <CTRL>. При этом, когда вы освободите правую кнопку мыши в приемнике, по умолчанию будет выведено всплывающее меню выбора, содержащее все доступные действия перетаскивания и его отмену.
Параметр ДопустимыеДействия предназначен для передачи приемнику допустимых типов перетаскивания и может принимать также 4, но уже других значения:
- Копирование
- КопированиеИПеремещение
- НеОбрабатывать
- Перемещение
Схема возникновения событий такая. Как только пользователь начал перемещать курсор мыши с зажатой левой или правой кнопкой, возникает событие НачалоПеретаскивания . При входе курсора с по-прежнему зажатой кнопкой в область новой ячейки элемента управления возникает событие ПроверкаПеретаскивания . В зависимости от того, какое значение параметра Действие вернет это событие, изменяется иконка курсора. Когда пользователь наконец освобождает зажатую кнопку мыши, возникает событие Перетаскивание в приемнике и сразу после него ОкончаниеПеретаскивания в источнике.
Как перетаскивать из табличного документа?
Для начала убедитесь, что для нужного поля табличного документа установлен флаг "Разрешить начало перетаскивания". Теперь выделите ОДНУ любую прямоугольную область табличного документа и подведите курсор мыши к ее любой границе так, чтобы курсор принял форму стрелки (обычного указателя). Вот только с этого момента можно перетаскивать.
Основные идеи глобального перетаскивания.
Во-первых, необходимо создать общую форму с маленьким табличным полем и сделать ее окно прикрепляем. Она будет использоваться в качестве кармана, в который и из которого пользователь будет перетаскивать значения из и в различные элементы управления.
Во-вторых, нужно создать глобальные обработчики для нужных типов событий перетаскивания. Желательно также создать соответствующие уницифированные обработчики типов событий для помещения их в модуль нужных форм.
В-третьих, нужно продумать само действие, которое будет выполняться в каждом сочетании типов источника и приемника при каждом действии перетаскивания.
В-червертых, следует придумать, как наиболее эффективно отловить событие ПриОткрытии у как можно большего количества форм конфигурации для установки разрешения начала перетаскивания.
Описание моего примера реализации
1) При открытии каждой формы, элементы которой должны выступать в роли источника перетаскивания, нужно вызывать общую процедуру ЛксПриОткрытииФормы , которая разрешит элементам формы выступать в роли источника перетаскивания. Но это относится только к случаям, когда флажок "Разрешить начало перетаскивания" не установлен хотя бы у одного из нужных элементов управления.
2) В модуль каждой формы, элементы которой должны выступать в роли приемника перетаскивания, следует поместить унифицированные обработчики событий
В событии ПриОткрытии таких форм уже обязательно нужно вызвать ЛксПриОткрытииФормы , которая кроме установки флажка "Разрешить перетаскивание" еще подключит эти обработчики для всех элементов управления формы типа ТабличноеПоле . Поле табличного документа имеет уже упомянутые ограничения, из-за которых пришлось отказаться от использования его в качестве приемника перетаскивания.
3) Перед использованием значение перетаскивания разворачивается в массив ссылок на объекты БД (в дальнейшем - массив перетаскивания). В случае если при разворачивании встречается строка таблицы значений или дерева значений (или табличной части) то она заменяется значением первой найденной колонки из массива ключевых колонок перетаскивания.
4) Если перетаскивание происходит на табличное поле, которое является списком ссылок, то происходит попытка найти в этом списке первый элемент массива перетаскивания, имеющий подходящий тип. Если в приемнике нельзя добавлять строки или не зажата клавиша <CTRL>, то производится попытка поиска по всем ссылочным колонкам значения табличного поля. После обнаружения ссылки курсор в табличном поле устанавливается на найденную строку. Остальные элементы массива перетаскивания игнорируются.
5) Если зажата клавиша <CTRL> и в табличном поле разрешено добавление строк и оно не является списком, то происходит попытка добавить каждый элемент массива перетаскивания в новую строку. Колонка для ключа перетаскивания подбирается по типу. Через дополнительный параметр можно включить проверку уникальности перед добавлением строки.
6) Форма, выполняющая роль кармана, содержит табличное поле вершины кармана, где отражается только одна ссылка, и сворачиваемое табличное поле самого кармана, которое предоставляет доступ к его полному содержимому. Карман представляет собой хранимый персональный для каждого пользователя список ссылок на объекты БД. Перетаскивать можно в и из как самого кармана так и его вершины.
Специальная реализация перетаскивания на типовую форму подбора 1С-ных конфигураций.
Сущность функционала заключается в заполении табличных полей формы подбора таким образом, чтобы они позволили увидеть показатели по ключу перетаскивания будь то ссылка-характеристика или ссылка-номенклатура. Это одно из самых приятных применений перетаскивания в глазах рядовых пользователей. Работать с типовой формой подбора станет на порядок удобнее и быстрее. Используется Книга знаний: v8: Методика переопределения и вызова обработчиков событий формы.
Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.
Реализовано в версии 8.3.13.1513.
Мы расширяем возможности работы с файлами в веб-клиенте. Мы реализовали перетаскивание файлов «извне» и увеличили возможности, доступные без установки специального расширения работы с файлами.
Метод НачатьПомещениеФайлов() больше не требует расширения работы с файлами
Раньше для загрузки нескольких файлов вы могли выбрать один из двух способов: либо загружать каждый файл по отдельности, с помощью метода НачатьПомещениеФайла(), либо загрузить все файлы вместе методом НачатьПомещениеФайлов(). Но последний метод работал только в том случае, если заранее было установлено расширение работы с файлами, что не очень удобно.
Теперь мы «научили» метод НачатьПомещениеФайлов() работать и без расширения. При этом он использует новый «собственный» диалог выбора файлов, который позволяет выбирать сразу несколько файлов. Если расширение работы с файлами установлено, тогда используется диалог выбора файлов операционной системы.
Новый диалог выбора файлов
Мы значительно изменили диалог выбора файлов в веб-клиенте.
Теперь он позволяет выбирать несколько файлов перетаскиванием.
Он показывает название и размер выбранных файлов, а также позволяет отказаться от загрузки тех или иных файлов, исключив их из выбора.
Настройка диалога выбора файла
Теперь в методы НачатьПомещениеФайла() и НачатьПомещениеФайлов() вы можете передавать заранее настроенный диалог выбора файлов. Например, вы можете установить ему собственный заголовок, который более точно описывает то, какие файлы может выбирать пользователь.
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Заголовок = "Собственный заголовок диалога загрузки файла"; ОбработкаОкончанияЗагрузки = Новый ОписаниеОповещения("Обработчик_Завершения_Загрузки", ЭтотОбъект, Диалог); НачатьПомещениеФайла(ОбработкаОкончанияЗагрузки, , Диалог, Истина, УникальныйИдентификатор); |
Контроль характеристик загружаемых файлов
Теперь, прежде чем загружать файлы на сервер, вы можете проверить их характеристики, например, размер. Если размер превышает допустимые значения, вы можете отменить загрузку.
&НаКлиенте Процедура ВалидацияПередОтправкойФайла(Команда) ОбработкаОкончанияЗагрузки = Новый ОписаниеОповещения("Обработчик_Завершения_Загрузки", ЭтотОбъект); ОбработкаНачалаЗагрузки = Новый ОписаниеОповещения("Обработчик_Начала_Загрузки", ЭтотОбъект); НачатьПомещениеФайла(ОбработкаОкончанияЗагрузки, , , Истина, УникальныйИдентификатор, ОбработкаНачалаЗагрузки); КонецПроцедуры &НаКлиенте Процедура Обработчик_Начала_Загрузки(ПомещаемыйФайл, ОтказОтПомещенияФайла, ДополнительныеПараметры) Экспорт ОтказОтПомещенияФайла = Ложь; Если ПомещаемыйФайл.Размер() > 5 * 1024 * 1024 Тогда ПоказатьПредупреждение( , "Размер файла " + "(" + ПомещаемыйФайл.Размер() + ") " + ПомещаемыйФайл.Имя + " (" + ПомещаемыйФайл.ИдентификаторФайла + ") превышает 5MB. Загрузка остановлена."); ОтказОтПомещенияФайла = Истина; КонецЕсли; КонецПроцедуры |
Перетаскивание файлов на картинку и на таблицу
Теперь можно перетаскивать файлы на картинку или таблицу. Таким образом, например, вместо выбора фотографии сотрудника с помощью проводника пользователь может просто перетащить нужный файл на поле картинки.
События НачалоПеретаскивания (стартовое) и ОкончаниеПеретаскивания (финишное) возникают в Источнике, доступны при установке признака "Разрешить начало перетаскивания".
События ПроверкаПеретаскивания (первое промежуточное)и Перетаскивание (второе промежуточное) возникают в Приёмнике, доступны при установке признака "Разрешить перетаскивание".
В каждом событии доступны ПараметрыПеретаскивания, состоящие из Действие, ДопустимыеДействия, Значение.
Действие (тип ДействиеПеретаскивания) оказывает влияние на вид курсора (три варианта -- обычный, с плюсиком и отмена) и принимает четыре возможных значения:
- Выбор (при перетаскивании правой кнопкой -- будет открыто всплывающее меню; срабатывает не во всех случаях),
- Копирование (при перетаскивании левой кнопкой с нажатым Ctrl),
- Отмена,
- Перемещение (при перетаскивании левой кнопкой).
ДопустимыеДействия (тип ДопустимыеДействияПеретаскивания) задаёт доступные действия в приёмнике и принимает значения:
- Копирование,
- КопированиеИПеремещение,
- НеОбрабатывать,
- Перемещение.
Событие Перетаскивание может не возникать в приёмнике -- если ДопустимыеДействия в НачалеПеретаскивания установлены в "НеОбрабатывать" или в событии ПроверкаПеретаскивания Действие установлено в "Отмену". Также Перетаскивание не возникает при несовместимости типов приёмника и источника (когда иконка курсора уже имеет вид "Отмена", независимо от параметров).
По умолчанию типы считаются совместимыми, если в качестве приёмника выступает ТаблицаФормы или ПолеТабличногоДокумента.
В источнике:
Изменение Действия не вызовет ошибки, но ни на что не влияет и смысла не имеет.
Изменение ДопустимыхДействий имеет смысл только в событии НачалоПеретаскивания, значение будет доступно во всех событиях, но нигде больше не может быть изменено. Задаёт первоначальный вид курсора (Перемещение, Копирование или Отмена) и набор доступных действий в приёмнике.
В случае установки значения "НеОбрабатывать" гарантированно не будет вызвано событие Перетаскивание, а в событие ОкончаниеПеретаскивания автоматически уйдёт Действие="Отмена".
В случае установки значения "Копировать" в событие ОкончаниеПеретаскивания автоматически уйдёт Действие="Копирование", даже если Ctrl не нажата.
В приёмнике:
Изменение Действия в ПроверкеПеретаскивания может влиять на вид курсора в случае понижения (Перемещение -> Копирование -> Отмена). В случае установки "Отмена" не будет вызвано событие Перетаскивание, в событие ОкончаниеПеретаскивания автоматически уйдёт Действие="Отмена".
Изменение Действия в Перетаскивании (только в случае понижения) уйдёт в событие ОкончаниеПеретаскивания.
Изменение ДопустимыхДействий не вызовет ошибки, но ни на что не влияет и смысла не имеет.
NB! По собственному опыту -- при работе с перетаскиванием возможны падения 1С:Предприятия, видимо, сказывается факт редкого использования (и как следствие -- недостаточного тестирования тестирования) этого механизма в типовых конфигурациях. Неоднократно воспроизводились, в частности, на платформе 8.3.6 при действиях на вкладке "Поддерживаемые по умолчанию элементы".
Возможно в каких-то выводах о работе механизма есть неточности -- не судите строго, пишите, исправлю. Обработка внутри содержит данный текст.
Предоставление данных для перетаскивания из обработки
Создадим обработку «Обработка1» форму для неё во вкладке Формы. Откроем форму и добавим новый элемент управления формы «ТабличноеПоле1». Для поддержки механизма перетаскивания существует два свойства элемента управления «ТабличноеПоле1»:
Эти свойства устанавливаются в палитре свойств:
Элементу управления «ТабличноеПоле1» нужно разрешить предоставлять данные для перетаскивания, поэтому мы установим галочку для свойства «РазрешитьНачалоПеретаскивания» («EnableStartDrag»):
Cвойство элемента управления «ТабличноеПоле1» «РазрешитьНачалоПеретаскивания» («EnableStartDrag») мы оставим без изменения, так как в табличное поле обработки мы добавлять ничего не будем. Теперь обратим внимание на последовательность событий при перетаскивании. Когда в режиме «1С:Предприятие», мы выделяем кнопкой мыши нужную нам строку в элементе управления «ТабличноеПоле1» и начинаем перетаскивание, вызывается обработчик события «НачалоПеретаскивания» («DragStart»), для нашего элемента управления «ТабличноеПоле1» обработчик события «ТабличноеПоле1НачалоПеретаскивания».
Параметры для обработчика события «ТабличноеПоле1НачалоПеретаскивания»:
Cоздадим документ «Документ1» и табличную часть для него во вкладке «Данные» и форму во вкладке «Формы». Когда мы перетаскиваем строку из элемента управления «ТабличноеПоле1» в табличную часть документа, тогда вызывается обработчик события «ПроверкаПеретаскивания», для нашего элемента управления «ТабличноеПоле1» обработчик события «ТабличноеПоле1ПроверкаПеретаскивания».
Параметры для обработчика события «ТабличноеПоле1ПроверкаПеретаскивания»:
Как только происходит опускание клавиши мыши в элементе управления документа «ТабличноеПоле1», вызвается обработчик события «Перетаскивание».
Как видим набор параметров у обработчика события «Перетаскивание» такой же как и у обработчика события «ПроверкаПеретаскивания». И последние в элементе управления «ТабличноеПоле1» обработки «Обработка1» вызывается обработчик события «ОкончаниеПеретаскивания». В этом обработчике события вы можете сами указать какие действия вам необходимо произвести. Это уже по вашему усмотрению.
Читайте также: