Разработка и Конфигурация · 11 мин
Как работает перетаскивание в 1С: механизм, события и примеры
Как работает механизм перетаскивания (Drag-and-Drop) в 1С: события НачалоПеретаскивания, ПроверкаПеретаскивания, Перетаскивание, параметры и практические примеры кода.
Перетаскивание (Drag-and-Drop) в 1С — это встроенный механизм платформы, который позволяет пользователю захватывать строки таблиц, элементы списков, файлы и другие данные мышью и перемещать их в другие элементы формы. Он работает в управляемых формах, обычных формах и поддерживается как в тонком клиенте, так и в веб-клиенте, хотя с рядом ограничений.
Механизм реализован через систему событий у элементов формы: платформа сама отслеживает движение мыши, а разработчику нужно лишь обработать события начала перетаскивания, проверки допустимости и завершения операции. Без обработчиков перетаскивание либо не работает, либо выполняется по стандартным правилам — например, перемещение строк в табличной части документа.
Понимание того, как устроен этот механизм, важно и разработчикам, и внедренцам: с его помощью строят удобные интерфейсы — перенос номенклатуры в заказ, распределение сотрудников по бригадам, заполнение планограмм, загрузку файлов перетаскиванием в форму.
Как устроен механизм перетаскивания в платформе
В основе лежит модель «источник — приёмник». Источник — элемент формы, из которого пользователь начинает тянуть данные (например, таблица со списком товаров). Приёмник — элемент, куда данные бросают (табличная часть заказа, дерево групп, поле картинки). Платформа отслеживает нажатие левой кнопки мыши, перемещение курсора и отпускание кнопки, а в нужные моменты вызывает обработчики событий.
Для большинства табличных элементов (таблица формы, дерево значений, динамический список) перетаскивание включается свойствами РазрешитьНачалоПеретаскивания и РазрешитьПеретаскивание в палитре свойств элемента формы. Если эти флаги не установлены, события просто не будут вызываться — это самая частая причина «неработающего» перетаскивания у начинающих разработчиков.
Данные между источником и приёмником передаются через параметр ЗначениеПеретаскивания. В зависимости от источника это может быть ссылка, массив ссылок, строка таблицы, структура или объект специального типа Файл — когда пользователь перетаскивает файл из проводника прямо в форму 1С.
Ключевые события и порядок их вызова
События делятся на две группы: события источника и события приёмника. Источнику доступно НачалоПеретаскивания — здесь можно изменить состав перетаскиваемых данных или отменить операцию, установив СтандартнаяОбработка = Ложь и ДопустимыеДействия = ДопустимыеДействияПеретаскивания.НеОбрабатывать.
Приёмник получает два события. ПроверкаПеретаскивания вызывается многократно, пока курсор движется над элементом: здесь решают, можно ли бросить данные в текущую позицию, и каким будет действие — копирование, перемещение или отказ. Перетаскивание вызывается один раз в момент отпускания кнопки мыши — здесь выполняется само действие: добавление строки, изменение родителя группы, запись файла.
Типовой порядок вызова выглядит так:
- 1Пользователь нажимает кнопку мыши на строке источника и начинает движение — вызывается НачалоПеретаскивания у источника
- 2Курсор попадает на приёмник — многократно вызывается ПроверкаПеретаскивания, в котором задаётся Действие и ДопустимыеДействия
- 3Пользователь отпускает кнопку — вызывается Перетаскивание, где выполняется основная логика
- 4Интерфейс обновляется: при необходимости вызовите ОповеститьОбИзменении или обновите данные формы вручную
&НаКлиенте
Процедура ТоварыПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь;
ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование;
КонецПроцедуры
&НаКлиенте
Процедура ТоварыПеретаскивание(Элемент, ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь;
ДобавитьТоварыНаСервере(ПараметрыПеретаскивания.Значение);
КонецПроцедуры
Какие действия перетаскивания доступны
Параметр Действие определяет, что произойдёт с данными, и влияет на вид курсора. В ПроверкаПеретаскивания его нужно назначать явно, иначе платформа может показать пользователю курсор «запрещено» даже при корректной логике.
| Действие | Значение перечисления | Типовой сценарий |
|---|---|---|
| Копирование | ДействиеПеретаскивания.Копирование | Добавление товара из справочника в документ, источник не изменяется |
| Перемещение | ДействиеПеретаскивания.Перемещение | Перенос элемента справочника в другую группу |
| Выбор | ДействиеПеретаскивания.Выбор | Интерактивный выбор целевой позиции без изменения данных |
| Отмена | ДействиеПеретаскивания.Отмена | Отказ от операции, курсор «запрещено» |
Дополнительно в ДопустимыеДействия можно разрешить сразу несколько вариантов — тогда пользователь переключается между копированием и перемещением клавишею Ctrl, как в проводнике Windows. Это удобно для списков, где оба сценария осмысленны.
Практический сценарий: перенос номенклатуры из справочника в документ
Классическая задача — ускорить подбор товаров: менеджер перетаскивает позиции из списка номенклатуры прямо в табличную часть заказа. Для этого на форме документа размещают таблицу с динамическим списком справочника, у неё включают РазрешитьНачалоПеретаскивания, а у табличной части — РазрешитьПеретаскивание.
В обработчике Перетаскивание табличной части значение будет массивом ссылок, если пользователь выделил несколько строк, или одиночной ссылкой. Логику добавления лучше выполнять на сервере: там доступны запросы к ценам, остаткам и проверка дублей. После добавления стоит вызвать пересчёт итогов документа, чтобы пользователь сразу видел корректную сумму.
Защита от дублей — отдельный вопрос. Два подхода: либо отклонять повторное добавление той же номенклатуры, либо увеличивать количество в существующей строке. Второй вариант обычно удобнее для пользователя и соответствует поведению типовых конфигураций.
Перетаскивание файлов из операционной системы
Отдельный полезный сценарий — приём файлов, перетащенных из проводника или рабочего стола. Чтобы форма принимала файлы, у корневого элемента формы или конкретного поля включают разрешение перетаскивания, а в обработчике проверяют, что ЗначениеПеретаскивания имеет тип Файл или массив таких объектов.
Из объекта Файл доступны имя, расширение и полный путь. Дальше файл передают на сервер через временное хранилище (НачатьПомещениеФайла) и сохраняют в присоединённые файлы объекта или обрабатывают как вложение. В веб-клиенте сценарий тоже работает, но требует расширения работы с файлами — без него платформа покажет пользователю предложение установить расширение.
Ограничения и особенности в разных клиентах
В тонком клиенте перетаскивание работает наиболее полно, включая перенос между окнами разных форм. В веб-клиенте есть ограничения: перетаскивание между отдельными окнами браузера не поддерживается, а работа с файлами зависит от установленного расширения и настроек браузера. Поэтому интерфейсы, критичные к drag-and-drop, стоит тестировать именно в том клиенте, которым пользуются сотрудники.
В мобильной платформе классическое перетаскивание мышью неприменимо — там используются жесты и долгое нажатие, и механизм событий отличается. Если конфигурация должна работать на планшетах, перетаскивание нельзя делать единственным способом выполнения операции: всегда дублируйте его кнопкой или командой контекстного меню.
Как проверить, что перетаскивание работает правильно
После внедрения пройдите контрольные сценарии вручную: перетащите одиночный элемент, затем несколько выделенных строк, затем заведомо «чужой» объект из другого списка. Проверьте поведение при перетаскивании в недопустимую область — курсор должен показывать запрет, а при отпускании ничего не должно происходить.
Как проверить результат
Строка добавлена/перемещена один раз, итоги пересчитаны
Строка дублируется или не появляется
Курсор «запрещено» или аккуратный отказ без ошибки
Ошибка выполнения, падение обработчика
Увеличено количество или показано понятное сообщение
Молчаливый дубль строки
Полезно также проверить работу под пользователем с ограниченными правами: если обработчик пытается записать объект, на который нет прав, пользователь получит ошибку в момент перетаскивания. Такие ситуации стоит перехватывать и показывать понятное сообщение вместо технического текста исключения.
Что важно запомнить
Перетаскивание в 1С строится на трёх событиях: НачалоПеретаскивания у источника, ПроверкаПеретаскивания и Перетаскивание у приёмника. Включите нужные свойства элементов, всегда назначайте Действие, проверяйте тип значения, отключайте стандартную обработку и выполняйте запись данных на сервере.
Частые вопросы о перетаскивании в 1С
Почему событие Перетаскивание не вызывается, хотя обработчик создан?
Чаще всего у элемента формы не установлено свойство РазрешитьПеретаскивание (у приёмника) или РазрешитьНачалоПеретаскивания (у источника). Вторая причина — в событии ПроверкаПеретаскивания действие установлено в Отмена или не назначено вовсе, тогда платформа считает бросок недопустимым и финальное событие не вызывает.
Как перетащить сразу несколько строк списка?
Включите у таблицы множественный выбор (свойство РежимВыделения). Тогда в параметре ЗначениеПеретаскивания придёт массив ссылок или строк. В обработчике обойдите массив циклом и обработайте каждый элемент, не забыв проверить, что значение действительно массив, а не одиночная ссылка.
Работает ли перетаскивание в веб-клиенте?
Да, внутри одной формы и между формами одного окна браузера перетаскивание работает. Ограничения касаются переноса между разными окнами браузера и работы с файлами: для приёма файлов требуется расширение работы с файлами, иначе платформа предложит его установить.
Как запретить перетаскивание в определённые строки дерева?
Используйте событие ПроверкаПеретаскивания: параметр Строка содержит идентификатор строки, над которой находится курсор. Получите данные строки, проверьте условие (например, что это группа, а не элемент), и при нарушении установите Действие в ДействиеПеретаскивания.Отмена — курсор покажет запрет.
Можно ли перетаскивать данные между двумя разными информационными базами?
Нет, штатный механизм работает только внутри одного сеанса одной базы. Для переноса данных между базами используют обмены, буфер обмена через сериализацию или внешние файлы — перетаскивание здесь может быть лишь интерфейсным элементом, запускающим такой обмен.
Чем перетаскивание отличается от копирования через буфер обмена?
Буфер обмена передаёт данные по явной команде (Ctrl+C/Ctrl+V) и работает в том числе между приложениями. Перетаскивание — интерактивный жест мышью с визуальной обратной связью и возможностью проверять допустимость позиции в реальном времени, но действует только в пределах сеанса 1С.