Имя: Пароль:
1C
 
Перехват команд "Копировать" и "Вставить" в формах 1С 8.1
0 TormozIT
 
гуру
23.04.10
12:01
Пока я придумал только сделать невидимую динамическую командную панель с двумя кнопками и сочетаниями клавиш CTRL+C и CTRL+V.

Но уже имею массу проблем. В некоторых случаях мне нужно продолжить обработку события с передачей стандартным обработчикам платформы. Для этого я временно отключаю сочетание вызванной кнопки и посылаю его через SendKeys, подключая одноразовый обработчик ожидания на обратное переключение.

SendKeys - штука стремная.

Как еще можно извратиться?
1 vde69
 
23.04.10
12:05
я вот так извращался

Функция СформироватьСтрокуПоляВвода (Имя, Заголовок, Значение, Длина, Маска="")
   // маска допустима в формате где
   // # - это обязательная цифра
   Контроль = "";
   Если Маска <> "" Тогда
       Контроль = "onkeypress=""check("+Имя+" "+Маска+")""";
   КонецЕсли;
   
   Результат = "
               |  <TR><TD>"+СокрЛП(Заголовок) + ":</TD><TD> <INPUT size=50 value="""+СокрЛП(Значение)+""" name="""+Имя+""" ID="""+Имя+""" maxlength="+Длина+" onCopy=""return false"" onDrag=""return false"" onDrop=""return false"" onPaste=""return false"" "+Контроль+" autocomplete=off></TD></TR>";
   Возврат Результат;
КонецФункции

Процедура ПриОткрытии()
   Если ТЗ.Колонки.Количество() < 5 Тогда
       Предупреждение("Ошибка в параметрах процедуры");
       ЭтаФорма.Закрыть(Ложь);
       Возврат;
   КонецЕсли;    
   
// функция check преднозначена для обработки реакции на ввод символа в соотвествие с маской
// реализация ввода даты и числа
   ТекстМодуля = "    
                   |<script type=""text/javascript"">    
                   |function check(name, mask){
                   |
                   |}
                   |</script>
                   |
                   | <TABLE width=""100%"">
                   | <TBODY> ";
                   
   Для Каждого СтрокаПараметров из ТЗ Цикл
       Имя = СтрокаПараметров[0];
       Заголовок = СтрокаПараметров[1];
       Значение = СтрокаПараметров[2];
       Длина = СтрокаПараметров[3];
       Маска = СтрокаПараметров[4];
       ТекстМодуля = ТекстМодуля + СформироватьСтрокуПоляВвода (Имя, Заголовок, Значение, Длина, Маска);
   КонецЦикла;
                   
   ТекстМодуля = ТекстМодуля + "    
                   | </TBODY></TABLE>";
   
   ЭлементыФормы.ПолеHTMLДокумента1.УстановитьТекст(ТекстМодуля);
КонецПроцедуры
2 vde69
 
23.04.10
12:08
(1) это не доделано, но смысл, что перехват буфера только в ХТМЛ поле (возможно скрытом)

сейчас сделал вот так, хотя там то-же есть косячек

Процедура ТЗЗначениеПриИзменении(Элемент)
   // нужно проверить а не из буфера обмена данные?
   
   Окно=ЭлементыФормы.ПолеHTMLДокумента.Документ.parentWindow;
   ЗначениеБуфера=Окно.clipboardData.getData("Text");
   // теперь привести вид
   Попытка
       Если ТипЗнч(Элемент.Значение) = Тип("Дата") Тогда
           ЗначениеБуфера = Дата(ЗначениеБуфера);
       ИначеЕсли ТипЗнч(Элемент.Значение) = Тип("Число") Тогда
           ЗначениеБуфера = Число(ЗначениеБуфера);
       Иначе
           ЗначениеБуфера = СокрЛП(ЗначениеБуфера);
       КонецЕсли;
   Исключение
       ЗначениеБуфера = СокрЛП(ЗначениеБуфера);
   КонецПопытки;
   
   Если ЗначениеЗаполнено(ЗначениеБуфера) и (СокрЛП(Элемент.Значение) = СокрЛП(ЗначениеБуфера)) тогда
       Предупреждение("Поле требует ручного ввода значения");
       Элемент.Значение = ОбщегоНазначения.ПустоеЗначениеТипа(ТипЗнч(Элемент.Значение));        
   КонецЕсли;
КонецПроцедуры
3 TormozIT
 
гуру
23.04.10
12:21
А с SetData("URL", <Внутреннее представление значения>) никто не экспериментировал?
Я вчера часа 2 убил на это и результата нет. Записывается вроде успешно, а считывается Null всегда почему то.
4 TormozIT
 
гуру
23.04.10
12:24
Да. Забыл отметить, что у меня задача стоит по глобальному перехвату.

(1) И что, такой способ позволяет перехватить все команды Copy во всех элементах формы или хотя бы всех элементах документа HTML?
5 vde69
 
23.04.10
12:29
(4) этот метод я делал для имитации всех реквизитов в поле хтмл, а у каждого поля ввода "INPUT" есть возможность прикрутить свой обработчик вставки/копирования.

на всю форму не действует
6 Один С
 
23.04.10
12:31
все не читал, ибо ничо не понятно, но по (0) хотелось бы сказать
CTRL+C и CTRL+V - это не единственный способ скопировать/вставить...
7 TormozIT
 
гуру
23.04.10
12:33
(6) Естественно. Но это максимум, до чего я додумался. И надо заметить, польза от такого решению уже есть ощутимая.
8 vde69
 
23.04.10
12:37
(7) я всегда пользуюсь комбинацией CTRL+Delete и SHIFT+Insert

способ (1) отлавливает любые способы вставки и копирования
9 TormozIT
 
гуру
23.04.10
12:49
По проблеме (3) http://www.sitepoint.com/forums/showthread.php?p=3129291
Есть куча подобных тем в инете. Нигде нет объяснения, баг это или какая то особенность. Но победить никто не смог)
10 Stepa86
 
23.04.10
12:58
(0) и (1): а можно не скромный вопрос? а зачем перехват буфера в 1Ске?
11 Один С
 
23.04.10
13:01
(10) это очень нескромный и пошлый вопрос..
12 TormozIT
 
гуру
23.04.10
13:16
(10)
Я сделал копирование и вставку значений. Т.е. там где можно копируется и вставляется именно значение, а не его представление.
13 vde69
 
23.04.10
13:18
(10) у нас стоит задача запретить копирование из буфера для форм верификации (двойного ввода)

то есть - оператор вводит 2 раза одно и то-же поле на разных формах, оба ввода должны совпасть, если не совпало - значит оператор ошибся. Соответсвено нужно запретить оператору вбивать данные простым переносом (при копировании - он просто перенесет ошибку и все).

А зачем это автору - я не знаю
14 Stepa86
 
23.04.10
13:21
(13) а с активИксом не прокатило?
15 Stepa86
 
23.04.10
13:23
(12) я вот так делаю: http://screencast.com/t/MmUzNjAzMGMt
а вставку ловлю вот так:

Процедура ОбязательствоОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
   
   Значение = СУПС_ОбщегоНазначения.ПолучитьСсылкуНаОбъектПоНавигационнойСсылке( Текст , Новый ОписаниеТипов("СправочникСсылка.СУПС_Обязательства") );
   
   Если ЗначениеЗаполнено( Значение ) Тогда
       
       СтандартнаяОбработка = Ложь;
       
       Текст = "";
       Обязательство = Значение;
       
       ОбязательствоПриИзменении(Элемент);
       
   КонецЕсли;
   
КонецПроцедуры
16 TormozIT
 
гуру
24.04.10
01:53
Обсуждение продолжено здесь v8: Аналог WSH.SendKeys через WinAPI (DynamicWrapper)
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс