Имя: Пароль:
1C
 
Программно определить источник и приемник при перетаскивании
🠗 (Волшебник 09.08.2024 11:41)
0 НоваяВолна
 
09.08.24
10:09
На форме есть три таблицы значений. Необходимо реализовать перетаскивание значений из одной таблицы в другую. При этом возможны перемещения 1=>2, 2=>3 и 3=>1. А перемещения 3=>2 и 2=>1 надо запретить.
   Частично задачу я реализовал. Сейчас есть перемещения из любой таблицы значений в любую. Но надо сделать запрет на перемещение из второй в первую и из третьей во вторую. Не могу понять как определить источник и приемник.
  В процедурах Перетаскивание, НачалоПеретаскивания, ПроверкаПеретаскивания и ОкончаниеПеретаскивания есть параметр ПараметрыПеретаскивания, но в нем нет указания на источник и приемник.
  
  И еще один вопрос: Если попытаться перетащить из одной таблицы в нее же, то никаких действий и ошибок не должно происходить. Поскольку так и не определил источник и приемник, то пришлось сравнивать по Типу.

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



Это работает, но мне не очень нравится. Может как-то по другому можно реализовать?
1 Волшебник
 
09.08.24
10:17
Что за таблицы? Почему запрещено обратное перетаскивание?
2 НоваяВолна
 
09.08.24
10:23
(1) Обычные таблицы значений - реквизиты формы. По логике задачи должны быть реализованы перемещения 1=>2=>3 то есть значения последовательно перемещаются. Ещё возможен возврат из конца в начало, т.е. 3=>1, с выполнением определенных действий. А вот других обратных перемещений быть не должно.
3 Волшебник
 
09.08.24
10:25
(2) В чём их прикладной смысл?
4 Мультук
 
гуру
09.08.24
10:27
(3)

Может человек игру пишет на 1С ? :-)
5 Волшебник
 
09.08.24
10:30
(4) Может не человек?
6 НоваяВолна
 
09.08.24
10:33
(3) Прикладной смысл в изменении статуса объекта при перемещении из одной таблицы в другую.
7 НоваяВолна
 
09.08.24
10:38
(3) Можно придумать и другой прикладной смысл. Например подбор номенклатуры в документ перетаскиванием из окна подбора. Но при этом надо убедиться, что перетаскивание идет именно из окна подбора, а не из другой параллельно открытой обработки, для которой тоже разрешено перетаскивание.
  В любом случае вопрос не в практическом смысле, а в том как определить источник и приемник перетаскивания.
8 Волшебник
 
09.08.24
10:47
(7) Не надо придумывать. Какой у Вас?
9 Garykom
 
гуру
09.08.24
10:53
(0) Ты теорию конечных автоматов изучал/знаешь?
У тебя несколько событий есть, для начала и окончания - фуйли еще тебе надо с...
10 Garykom
 
гуру
09.08.24
10:59
НачалоПеретаскивания - срабатывает где?
ОкончаниеПеретаскивания - где?
11 НоваяВолна
 
09.08.24
11:09
(9) Начало перетаскивания знает только об источнике из которого перетаскивается, а окончание только о приемнике перетаскивания. Мне надо например при окончании перетаскивания (а лучше перед окончанием, например в проверке перетаскивания) знать и источник и приемник. И если они не соответствуют определенным правилам не производить перетаскивание.
12 Мультук
 
гуру
09.08.24
11:12
(11)

Создать и использовать реквизит формы "КтоНачалПеретаскивание"?
13 maxab72
 
09.08.24
11:38
(11) Так заведи переменную, куда сперва при начале перетаскивания будешь помещать источник, а при окончании - проверять откуда перетащили и если все в порядке, очищать переменную.
14 НоваяВолна
 
09.08.24
11:57
(12) (13) так и сделал, работает
15 Garykom
 
гуру
09.08.24
12:05
(14) Поздравляю, ты реализовал wiki:Конечный_автомат
16 Волшебник
 
09.08.24
12:26
(14) Со смыслом Вам ещё придётся поработать. Пока получается бессмысленная возня
17 Garykom
 
гуру
09.08.24
12:46
(13) Еще можно в НачалоПеретаскивания дополнительно засовывать Источник в
ПараметрыПеретаскивания.Значение.Добавить

И ловить его в Перетаскивание